|
@@ -4838,7 +4838,7 @@ static inline int need_do_async_reclaim(struct btrfs_space_info *space_info,
|
|
|
u64 thresh = div_factor_fine(space_info->total_bytes, 98);
|
|
|
|
|
|
/* If we're just plain full then async reclaim just slows us down. */
|
|
|
- if (space_info->bytes_used >= thresh)
|
|
|
+ if ((space_info->bytes_used + space_info->bytes_reserved) >= thresh)
|
|
|
return 0;
|
|
|
|
|
|
return (used >= thresh && !btrfs_fs_closing(fs_info) &&
|
|
@@ -5373,27 +5373,33 @@ static void update_global_block_rsv(struct btrfs_fs_info *fs_info)
|
|
|
|
|
|
block_rsv->size = min_t(u64, num_bytes, SZ_512M);
|
|
|
|
|
|
- num_bytes = sinfo->bytes_used + sinfo->bytes_pinned +
|
|
|
- sinfo->bytes_reserved + sinfo->bytes_readonly +
|
|
|
- sinfo->bytes_may_use;
|
|
|
-
|
|
|
- if (sinfo->total_bytes > num_bytes) {
|
|
|
- num_bytes = sinfo->total_bytes - num_bytes;
|
|
|
- block_rsv->reserved += num_bytes;
|
|
|
- sinfo->bytes_may_use += num_bytes;
|
|
|
- trace_btrfs_space_reservation(fs_info, "space_info",
|
|
|
- sinfo->flags, num_bytes, 1);
|
|
|
- }
|
|
|
-
|
|
|
- if (block_rsv->reserved >= block_rsv->size) {
|
|
|
+ if (block_rsv->reserved < block_rsv->size) {
|
|
|
+ num_bytes = sinfo->bytes_used + sinfo->bytes_pinned +
|
|
|
+ sinfo->bytes_reserved + sinfo->bytes_readonly +
|
|
|
+ sinfo->bytes_may_use;
|
|
|
+ if (sinfo->total_bytes > num_bytes) {
|
|
|
+ num_bytes = sinfo->total_bytes - num_bytes;
|
|
|
+ num_bytes = min(num_bytes,
|
|
|
+ block_rsv->size - block_rsv->reserved);
|
|
|
+ block_rsv->reserved += num_bytes;
|
|
|
+ sinfo->bytes_may_use += num_bytes;
|
|
|
+ trace_btrfs_space_reservation(fs_info, "space_info",
|
|
|
+ sinfo->flags, num_bytes,
|
|
|
+ 1);
|
|
|
+ }
|
|
|
+ } else if (block_rsv->reserved > block_rsv->size) {
|
|
|
num_bytes = block_rsv->reserved - block_rsv->size;
|
|
|
sinfo->bytes_may_use -= num_bytes;
|
|
|
trace_btrfs_space_reservation(fs_info, "space_info",
|
|
|
sinfo->flags, num_bytes, 0);
|
|
|
block_rsv->reserved = block_rsv->size;
|
|
|
- block_rsv->full = 1;
|
|
|
}
|
|
|
|
|
|
+ if (block_rsv->reserved == block_rsv->size)
|
|
|
+ block_rsv->full = 1;
|
|
|
+ else
|
|
|
+ block_rsv->full = 0;
|
|
|
+
|
|
|
spin_unlock(&block_rsv->lock);
|
|
|
spin_unlock(&sinfo->lock);
|
|
|
}
|