]> git.baikalelectronics.ru Git - kernel.git/commit
Btrfs: break out of shrink_delalloc earlier
authorChris Mason <chris.mason@oracle.com>
Sat, 12 Mar 2011 12:08:42 +0000 (07:08 -0500)
committerChris Mason <chris.mason@oracle.com>
Sat, 12 Mar 2011 12:08:42 +0000 (07:08 -0500)
commitd0f7aa4c9cbbafa9db518f4e5508159b79ae6bfc
treee009d85998f89ef06d1d96515e3856fa074c4f4f
parent6cfe1443e459a4456f1586c3e1090c8c3b7616a1
Btrfs: break out of shrink_delalloc earlier

Josef had changed shrink_delalloc to exit after three shrink
attempts, which wasn't quite enough because new writers could
race in and steal free space.

But it also fixed deadlocks and stalls as we tried to recover
delalloc reservations.  The code was tweaked to loop 1024
times, and would reset the counter any time a small amount
of progress was made.  This was too drastic, and with a
lot of writers we can end up stuck in shrink_delalloc forever.

The shrink_delalloc loop is fairly complex because the caller is looping
too, and the caller will go ahead and force a transaction commit to make
sure we reclaim space.

This reworks things to exit shrink_delalloc when we've forced some
writeback and the delalloc reservations have gone down.  This means
the writeback has not just started but has also finished at
least some of the metadata changes required to reclaim delalloc
space.

If we've got this wrong, we're returning ENOSPC too early, which
is a big improvement over the current behavior of hanging the machine.

Test 224 in xfstests hammers on this nicely, and with 1000 writers
trying to fill a 1GB drive we get our first ENOSPC at 93% full.  The
other writers are able to continue until we get 100%.

This is a worst case test for btrfs because the 1000 writers are doing
small IO, and the small FS size means we don't have a lot of room
for metadata chunks.

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