Btrfs: fix fallocate deadlock on inode extent lock
authorChris Mason <chris.mason@oracle.com>
Fri, 24 Apr 2009 18:39:24 +0000 (14:39 -0400)
committerChris Mason <chris.mason@oracle.com>
Fri, 24 Apr 2009 19:46:05 +0000 (15:46 -0400)
commite980b50cda1610f1c17978d9b7fd311a9dd93877
treea5ab72fa4b791758e25fd6ece6f1aedd29954e7b
parent9601e3f6336f6ca66929f451b1f66085e68e36e3
Btrfs: fix fallocate deadlock on inode extent lock

The btrfs fallocate call takes an extent lock on the entire range
being fallocated, and then runs through insert_reserved_extent on each
extent as they are allocated.

The problem with this is that btrfs_drop_extents may decide to try
and take the same extent lock fallocate was already holding.  The solution
used here is to push down knowledge of the range that is already locked
going into btrfs_drop_extents.

It turns out that at least one other caller had the same bug.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.h
fs/btrfs/file.c
fs/btrfs/inode.c
fs/btrfs/ioctl.c
fs/btrfs/tree-log.c