btrfs: pass a space_info argument to btrfs_reserve_metadata_bytes()
authorFilipe Manana <fdmanana@suse.com>
Fri, 8 Sep 2023 17:20:20 +0000 (18:20 +0100)
committerDavid Sterba <dsterba@suse.com>
Thu, 12 Oct 2023 14:44:05 +0000 (16:44 +0200)
We are passing a block reserve argument to btrfs_reserve_metadata_bytes()
which is not really used, all we need is to pass the space_info associated
to the block reserve, we don't change the block reserve at all.

Not only it's pointless to pass the block reserve, it's also confusing as
one might think that the reserved bytes will end up being added to the
passed block reserve, when that's not the case. The pattern for reserving
space and adding it to a block reserve is to first reserve space with
btrfs_reserve_metadata_bytes() and if that succeeds, then add the space to
a block reserve by calling btrfs_block_rsv_add_bytes().

Also the reverse of btrfs_reserve_metadata_bytes(), which is
btrfs_space_info_free_bytes_may_use(), takes a space_info argument and
not a block reserve, so one more reason to pass a space_info and not a
block reserve to btrfs_reserve_metadata_bytes().

So change btrfs_reserve_metadata_bytes() and its callers to pass a
space_info argument instead of a block reserve argument.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/block-rsv.c
fs/btrfs/delalloc-space.c
fs/btrfs/delayed-ref.c
fs/btrfs/space-info.c
fs/btrfs/space-info.h
fs/btrfs/transaction.c

index 77684c5e0c8bad6b9b3652cac7ce92528343bdb7..6ccd91bbff3e5888ab7f12504d888f658fef5229 100644 (file)
@@ -221,7 +221,8 @@ int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info,
        if (num_bytes == 0)
                return 0;
 
-       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv, num_bytes, flush);
+       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv->space_info,
+                                          num_bytes, flush);
        if (!ret)
                btrfs_block_rsv_add_bytes(block_rsv, num_bytes, true);
 
@@ -261,7 +262,8 @@ int btrfs_block_rsv_refill(struct btrfs_fs_info *fs_info,
        if (!ret)
                return 0;
 
-       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv, num_bytes, flush);
+       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv->space_info,
+                                          num_bytes, flush);
        if (!ret) {
                btrfs_block_rsv_add_bytes(block_rsv, num_bytes, false);
                return 0;
@@ -517,8 +519,8 @@ again:
                                block_rsv->type, ret);
        }
 try_reserve:
-       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv, blocksize,
-                                          BTRFS_RESERVE_NO_FLUSH);
+       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv->space_info,
+                                          blocksize, BTRFS_RESERVE_NO_FLUSH);
        if (!ret)
                return block_rsv;
        /*
@@ -539,7 +541,7 @@ try_reserve:
         * one last time to force a reservation if there's enough actual space
         * on disk to make the reservation.
         */
-       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv, blocksize,
+       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv->space_info, blocksize,
                                           BTRFS_RESERVE_FLUSH_EMERGENCY);
        if (!ret)
                return block_rsv;
index 427abaf608b8ce40e9593c31a019fc91c4b9d021..a764db67c033b0c52672bb4bfeaaadab28c03ed9 100644 (file)
@@ -346,7 +346,8 @@ int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes,
                                                 noflush);
        if (ret)
                return ret;
-       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv, meta_reserve, flush);
+       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv->space_info,
+                                          meta_reserve, flush);
        if (ret) {
                btrfs_qgroup_free_meta_prealloc(root, qgroup_reserve);
                return ret;
index 08b88b7faf3914ab815e202469285e6f048249c6..9d0fcb4e39ff82687e4166874fc5f8eaa46015ed 100644 (file)
@@ -154,6 +154,7 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
                                  enum btrfs_reserve_flush_enum flush)
 {
        struct btrfs_block_rsv *block_rsv = &fs_info->delayed_refs_rsv;
+       struct btrfs_space_info *space_info = block_rsv->space_info;
        u64 limit = btrfs_calc_delayed_ref_bytes(fs_info, 1);
        u64 num_bytes = 0;
        u64 refilled_bytes;
@@ -170,7 +171,7 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
        if (!num_bytes)
                return 0;
 
-       ret = btrfs_reserve_metadata_bytes(fs_info, block_rsv, num_bytes, flush);
+       ret = btrfs_reserve_metadata_bytes(fs_info, space_info, num_bytes, flush);
        if (ret)
                return ret;
 
@@ -199,8 +200,7 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
        spin_unlock(&block_rsv->lock);
 
        if (to_free > 0)
-               btrfs_space_info_free_bytes_may_use(fs_info, block_rsv->space_info,
-                                                   to_free);
+               btrfs_space_info_free_bytes_may_use(fs_info, space_info, to_free);
 
        if (refilled_bytes > 0)
                trace_btrfs_space_reservation(fs_info, "delayed_refs_rsv", 0,
index 58de9a14e525551f323c404aef179e0d2238f640..d2296bc66fbecbab130b842416f64c48d6834164 100644 (file)
@@ -1743,7 +1743,7 @@ static int __reserve_bytes(struct btrfs_fs_info *fs_info,
  * Try to reserve metadata bytes from the block_rsv's space.
  *
  * @fs_info:    the filesystem
- * @block_rsv:  block_rsv we're allocating for
+ * @space_info: the space_info we're allocating for
  * @orig_bytes: number of bytes we want
  * @flush:      whether or not we can flush to make our reservation
  *
@@ -1755,21 +1755,19 @@ static int __reserve_bytes(struct btrfs_fs_info *fs_info,
  * space already.
  */
 int btrfs_reserve_metadata_bytes(struct btrfs_fs_info *fs_info,
-                                struct btrfs_block_rsv *block_rsv,
+                                struct btrfs_space_info *space_info,
                                 u64 orig_bytes,
                                 enum btrfs_reserve_flush_enum flush)
 {
        int ret;
 
-       ret = __reserve_bytes(fs_info, block_rsv->space_info, orig_bytes, flush);
+       ret = __reserve_bytes(fs_info, space_info, orig_bytes, flush);
        if (ret == -ENOSPC) {
                trace_btrfs_space_reservation(fs_info, "space_info:enospc",
-                                             block_rsv->space_info->flags,
-                                             orig_bytes, 1);
+                                             space_info->flags, orig_bytes, 1);
 
                if (btrfs_test_opt(fs_info, ENOSPC_DEBUG))
-                       btrfs_dump_space_info(fs_info, block_rsv->space_info,
-                                             orig_bytes, 0);
+                       btrfs_dump_space_info(fs_info, space_info, orig_bytes, 0);
        }
        return ret;
 }
index ac0ce83f14771b6ea247df9a4a5c508e9cad9393..92c595fed1b0a661410995fc85810fc7c90775bb 100644 (file)
@@ -213,7 +213,7 @@ void btrfs_dump_space_info(struct btrfs_fs_info *fs_info,
                           struct btrfs_space_info *info, u64 bytes,
                           int dump_block_groups);
 int btrfs_reserve_metadata_bytes(struct btrfs_fs_info *fs_info,
-                                struct btrfs_block_rsv *block_rsv,
+                                struct btrfs_space_info *space_info,
                                 u64 orig_bytes,
                                 enum btrfs_reserve_flush_enum flush);
 void btrfs_try_granting_tickets(struct btrfs_fs_info *fs_info,
index be27360843df11ac832119325011327e5c32dadd..91a66bc775c892c58260a3f79d5d7c1740488efc 100644 (file)
@@ -631,7 +631,8 @@ start_transaction(struct btrfs_root *root, unsigned int num_items,
                        reloc_reserved = true;
                }
 
-               ret = btrfs_reserve_metadata_bytes(fs_info, rsv, num_bytes, flush);
+               ret = btrfs_reserve_metadata_bytes(fs_info, rsv->space_info,
+                                                  num_bytes, flush);
                if (ret)
                        goto reserve_fail;
                if (delayed_refs_bytes) {