On Tue, Oct 11, 2011 at 12:33:48PM -0500, Mitch Harder wrote:
> On Mon, Sep 26, 2011 at 4:22 PM, Josef Bacik <josef@xxxxxxxxxx> wrote:
> >
> > go from taking around 45 minutes to 10 seconds on my freshly formatted 3 TiB
> > file system. This doesn't seem to break my other enospc tests, but could really
> > use some more testing as this is a super scary change. Thanks,
> >
>
> I've been testing Josef's git.kernel.org testing tree, and I've
> bisected an error down to this commit.
>
> I'm triggering the error using a removedirs benchmark in filebench
> with the following profile:
> load removedirs
> set $dir=/mnt/benchmark/filebench
> set $ndirs=400000
> run
>
Hmm I can't get it to reproduce, can you give this a whirl and see if it helps?
Thanks
Josef
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index fc0de68..609989b 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3334,7 +3334,7 @@ out:
* shrink metadata reservation for delalloc
*/
static int shrink_delalloc(struct btrfs_trans_handle *trans,
- struct btrfs_root *root, u64 to_reclaim, int sync)
+ struct btrfs_root *root, u64 to_reclaim, int retries)
{
struct btrfs_block_rsv *block_rsv;
struct btrfs_space_info *space_info;
@@ -3384,14 +3384,22 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans,
if (reserved == 0 || reclaimed >= max_reclaim)
break;
- if (trans && trans->transaction->blocked)
+ if (trans)
return -EAGAIN;
- time_left = schedule_timeout_interruptible(1);
+ if (!retries) {
+ time_left = schedule_timeout_interruptible(1);
- /* We were interrupted, exit */
- if (time_left)
- break;
+ /* We were interrupted, exit */
+ if (time_left)
+ break;
+ } else {
+ /*
+ * We've already done this song and dance once, let's
+ * really wait for some work to get done.
+ */
+ btrfs_wait_ordered_extents(root, 0, 0);
+ }
/* we've kicked the IO a few times, if anything has been freed,
* exit. There is no sense in looping here for a long time
@@ -3552,7 +3560,7 @@ again:
* We do synchronous shrinking since we don't actually unreserve
* metadata until after the IO is completed.
*/
- ret = shrink_delalloc(trans, root, num_bytes, 1);
+ ret = shrink_delalloc(trans, root, num_bytes, retries);
if (ret < 0)
goto out;
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html