]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: zoned: activate necessary block group
authorNaohiro Aota <naohiro.aota@wdc.com>
Fri, 8 Jul 2022 23:18:48 +0000 (08:18 +0900)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:45:42 +0000 (17:45 +0200)
There are two places where allocating a chunk is not enough. These two
places are trying to ensure the space by allocating a chunk. To meet the
condition for active_total_bytes, we also need to activate a block group
there.

CC: stable@vger.kernel.org # 5.16+
Fixes: afba2bc036b0 ("btrfs: zoned: implement active zone tracking")
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/block-group.c

index 51e7c1f1d93f87182e50f12b20840e22a28e3010..c3aecfb0a71d2b199800f8f97ebb4a7bf646306a 100644 (file)
@@ -2664,6 +2664,14 @@ int btrfs_inc_block_group_ro(struct btrfs_block_group *cache,
        ret = btrfs_chunk_alloc(trans, alloc_flags, CHUNK_ALLOC_FORCE);
        if (ret < 0)
                goto out;
+       /*
+        * We have allocated a new chunk. We also need to activate that chunk to
+        * grant metadata tickets for zoned filesystem.
+        */
+       ret = btrfs_zoned_activate_one_bg(fs_info, cache->space_info, true);
+       if (ret < 0)
+               goto out;
+
        ret = inc_block_group_ro(cache, 0);
        if (ret == -ETXTBSY)
                goto unlock_out;
@@ -3889,6 +3897,14 @@ static void reserve_chunk_space(struct btrfs_trans_handle *trans,
                if (IS_ERR(bg)) {
                        ret = PTR_ERR(bg);
                } else {
+                       /*
+                        * We have a new chunk. We also need to activate it for
+                        * zoned filesystem.
+                        */
+                       ret = btrfs_zoned_activate_one_bg(fs_info, info, true);
+                       if (ret < 0)
+                               return;
+
                        /*
                         * If we fail to add the chunk item here, we end up
                         * trying again at phase 2 of chunk allocation, at