]> git.baikalelectronics.ru Git - kernel.git/commitdiff
btrfs: zoned: allow disabling of zone auto reclaim
authorJohannes Thumshirn <johannes.thumshirn@wdc.com>
Mon, 9 Aug 2021 11:41:17 +0000 (20:41 +0900)
committerDavid Sterba <dsterba@suse.com>
Mon, 23 Aug 2021 11:19:11 +0000 (13:19 +0200)
Automatically reclaiming dirty zones might not always be desired for all
workloads, especially as there are currently still some rough edges with
the relocation code on zoned filesystems.

Allow disabling zone auto reclaim on a per filesystem basis by writing 0
as the threshold value.

Reviewed-by: Naohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/free-space-cache.c
fs/btrfs/sysfs.c

index 8eeb65278ac03b77a747cca77298cf5c4dc91ab4..e91440bd0794e18c6d84b0a085d8c35cefb534f8 100644 (file)
@@ -2538,6 +2538,7 @@ static int __btrfs_add_free_space_zoned(struct btrfs_block_group *block_group,
        struct btrfs_free_space_ctl *ctl = block_group->free_space_ctl;
        u64 offset = bytenr - block_group->start;
        u64 to_free, to_unusable;
+       const int bg_reclaim_threshold = READ_ONCE(fs_info->bg_reclaim_threshold);
 
        spin_lock(&ctl->tree_lock);
        if (!used)
@@ -2567,9 +2568,9 @@ static int __btrfs_add_free_space_zoned(struct btrfs_block_group *block_group,
        /* All the region is now unusable. Mark it as unused and reclaim */
        if (block_group->zone_unusable == block_group->length) {
                btrfs_mark_bg_unused(block_group);
-       } else if (block_group->zone_unusable >=
-                  div_factor_fine(block_group->length,
-                                  fs_info->bg_reclaim_threshold)) {
+       } else if (bg_reclaim_threshold &&
+                  block_group->zone_unusable >=
+                  div_factor_fine(block_group->length, bg_reclaim_threshold)) {
                btrfs_mark_bg_to_reclaim(block_group);
        }
 
index bfe5e27617b072042af3471483f348d75d44cf10..c1261309a817c0e8b8884af4b008d1ecc6fef902 100644 (file)
@@ -984,7 +984,8 @@ static ssize_t btrfs_bg_reclaim_threshold_show(struct kobject *kobj,
        struct btrfs_fs_info *fs_info = to_fs_info(kobj);
        ssize_t ret;
 
-       ret = scnprintf(buf, PAGE_SIZE, "%d\n", fs_info->bg_reclaim_threshold);
+       ret = scnprintf(buf, PAGE_SIZE, "%d\n",
+                       READ_ONCE(fs_info->bg_reclaim_threshold));
 
        return ret;
 }
@@ -1001,10 +1002,10 @@ static ssize_t btrfs_bg_reclaim_threshold_store(struct kobject *kobj,
        if (ret)
                return ret;
 
-       if (thresh <= 50 || thresh > 100)
+       if (thresh != 0 && (thresh <= 50 || thresh > 100))
                return -EINVAL;
 
-       fs_info->bg_reclaim_threshold = thresh;
+       WRITE_ONCE(fs_info->bg_reclaim_threshold, thresh);
 
        return len;
 }