• Chris Mason's avatar
    Btrfs: fix btrfs fallocate oops and deadlock · 546888da
    Chris Mason authored
    Btrfs fallocate was incorrectly starting a transaction with a lock held
    on the extent_io tree for the file, which could deadlock.  Strictly
    speaking it was using join_transaction which would be safe, but it is better
    to move the transaction outside of the lock.
    
    When preallocated extents are overwritten, btrfs_mark_buffer_dirty was
    being called on an unlocked buffer.  This was triggering an assertion and
    oops because the lock is supposed to be held.
    
    The bug was calling btrfs_mark_buffer_dirty on a leaf after btrfs_del_item had
    been run.  btrfs_del_item takes care of dirtying things, so the solution is a
    to skip the btrfs_mark_buffer_dirty call in this case.
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    546888da
inode.c 141 KB