|
@@ -4343,11 +4343,21 @@ static inline int need_do_async_reclaim(struct btrfs_space_info *space_info,
|
|
|
}
|
|
|
|
|
|
static int btrfs_need_do_async_reclaim(struct btrfs_space_info *space_info,
|
|
|
- struct btrfs_fs_info *fs_info)
|
|
|
+ struct btrfs_fs_info *fs_info,
|
|
|
+ int flush_state)
|
|
|
{
|
|
|
u64 used;
|
|
|
|
|
|
spin_lock(&space_info->lock);
|
|
|
+ /*
|
|
|
+ * We run out of space and have not got any free space via flush_space,
|
|
|
+ * so don't bother doing async reclaim.
|
|
|
+ */
|
|
|
+ if (flush_state > COMMIT_TRANS && space_info->full) {
|
|
|
+ spin_unlock(&space_info->lock);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
used = space_info->bytes_used + space_info->bytes_reserved +
|
|
|
space_info->bytes_pinned + space_info->bytes_readonly +
|
|
|
space_info->bytes_may_use;
|
|
@@ -4380,11 +4390,12 @@ static void btrfs_async_reclaim_metadata_space(struct work_struct *work)
|
|
|
flush_space(fs_info->fs_root, space_info, to_reclaim,
|
|
|
to_reclaim, flush_state);
|
|
|
flush_state++;
|
|
|
- if (!btrfs_need_do_async_reclaim(space_info, fs_info))
|
|
|
+ if (!btrfs_need_do_async_reclaim(space_info, fs_info,
|
|
|
+ flush_state))
|
|
|
return;
|
|
|
} while (flush_state <= COMMIT_TRANS);
|
|
|
|
|
|
- if (btrfs_need_do_async_reclaim(space_info, fs_info))
|
|
|
+ if (btrfs_need_do_async_reclaim(space_info, fs_info, flush_state))
|
|
|
queue_work(system_unbound_wq, work);
|
|
|
}
|
|
|
|