Btrfs: use the global block reserve if we cannot reserve space
authorJosef Bacik <josef@redhat.com>
Mon, 24 Jan 2011 21:43:20 +0000 (21:43 +0000)
committerChris Mason <chris.mason@oracle.com>
Fri, 28 Jan 2011 21:40:37 +0000 (16:40 -0500)
commit68a82277b8619e6d0f2738b1d9b160b627e81e92
tree91d0f86f009cbbd8bf16643e41fb090a08e859a7
parente9e22899de661af94cb9995885fd04e4c738838b
Btrfs: use the global block reserve if we cannot reserve space

We call use_block_rsv right before we make an allocation in order to make sure
we have enough space.  Now normally people have called btrfs_start_transaction()
with the appropriate amount of space that we need, so we just use some of that
pre-reserved space and move along happily.  The problem is where people use
btrfs_join_transaction(), which doesn't actually reserve any space.  So we try
and reserve space here, but we cannot flush delalloc, so this forces us to
return -ENOSPC when in reality we have plenty of space.  The most common symptom
is seeing a bunch of "couldn't dirty inode" messages in syslog.  With
xfstests 224 we end up falling back to start_transaction and then doing all the
flush delalloc stuff which causes to hang for a very long time.

So instead steal from the global reserve, which is what this is meant for
anyway.  With this patch and the other 2 I have sent xfstests 224 now passes
successfully.  Thanks,

Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c