Btrfs: fix btrfs fallocate oops and deadlock
authorChris Mason <chris.mason@oracle.com>
Tue, 21 Apr 2009 15:53:38 +0000 (11:53 -0400)
committerChris Mason <chris.mason@oracle.com>
Tue, 21 Apr 2009 16:45:12 +0000 (12:45 -0400)
commit546888da82082555a56528730a83f0afd12f33bf
tree98ee868d1b8a4bd390a980fed707f91419b79fb5
parent8c594ea81d7abbbffdda447b127f8ba8d76f319d
Btrfs: fix btrfs fallocate oops and deadlock

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: Chris Mason <chris.mason@oracle.com>
fs/btrfs/file.c
fs/btrfs/inode.c