diff options
author | Josef Bacik <josef@redhat.com> | 2011-01-24 21:43:20 +0000 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-01-28 16:40:37 -0500 |
commit | 68a82277b8619e6d0f2738b1d9b160b627e81e92 (patch) | |
tree | 91d0f86f009cbbd8bf16643e41fb090a08e859a7 /drivers | |
parent | e9e22899de661af94cb9995885fd04e4c738838b (diff) | |
download | linux-stable-68a82277b8619e6d0f2738b1d9b160b627e81e92.tar.gz linux-stable-68a82277b8619e6d0f2738b1d9b160b627e81e92.tar.bz2 linux-stable-68a82277b8619e6d0f2738b1d9b160b627e81e92.zip |
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>
Diffstat (limited to 'drivers')
0 files changed, 0 insertions, 0 deletions