OSDN Git Service

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 51e7c1f..c3aecfb 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;
@@ -3890,6 +3898,14 @@ static void reserve_chunk_space(struct btrfs_trans_handle *trans,
                        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
                         * btrfs_create_pending_block_groups(). So ignore