• Josef Bacik's avatar
    Btrfs: fix delayed insertion reservation · c06a0e12
    Josef Bacik authored
    We all keep getting those stupid warnings from use_block_rsv when running
    stress.sh, and it's because the delayed insertion stuff is being stupid.  It's
    not the delayed insertion stuffs fault, it's all just stupid.  When marking an
    inode dirty for oh say updating the time on it, we just do a
    btrfs_join_transaction, which doesn't reserve any space.  This is stupid because
    we're going to have to have space reserve to make this change, but we do it
    because it's fast because chances are we're going to call it over and over again
    and it doesn't matter.  Well thanks to the delayed insertion stuff this is
    mostly the case, so we do actually need to make this reservation.  So if
    trans->bytes_reserved is 0 then try to do a normal reservation.  If not return
    ENOSPC which will make the btrfs_dirty_inode start a proper transaction which
    will let it do the whole ENOSPC dance and reserve enough space for the delayed
    insertion to steal the reservation from the transaction.
    
    The other stupid thing we do is not reserve space for the inode when writing to
    the thing.  Usually this is ok since we have to update the time so we'd have
    already done all this work before we get to the endio stuff, so it doesn't
    matter.  But this is stupid because we could write the data after the
    transaction commits where we changed the mtime of the inode so we have to cow
    all the way down to the inode anyway.  This used to be masked by the delalloc
    reservation stuff, but because we delay the update it doesn't get masked in this
    case.  So again the delayed insertion stuff bites us in the ass.  So if our
    trans->block_rsv is delalloc, just steal the reservation from the delalloc
    reserve.  Hopefully this won't bite us in the ass, but I've said that before.
    
    With this patch stress.sh no longer spits out those stupid warnings (famous last
    words).  Thanks,
    Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    c06a0e12
delayed-inode.c 46 KB