]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:42:27 +0000 (14:42 +0200)
[ Upstream commit b6a98021e4019c562a23ad151a7e40adfa9f91e5 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/btrfs/block-group.c

index 88f59a2e4113d3d02accba7364a2a8f4a215ffb1..0c7fe3142d7c977e25929ba55caa10f428d73e10 100644 (file)
@@ -2659,6 +2659,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;
@@ -3853,6 +3861,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