Re: [PATCH] btrfs: convert reflink.c to use btrfs_inode as parameters

Daniel Vacek <[email protected]> Mon, 27 Jul 2026 10:43:35 +0200
Newsgroups org.kernel.vger.linux-btrfs
Message-ID <CAPjX3Fdk=XRpOnOr6RnwjGUcoaVk7O=qvst68eH3DE8QnC-fUg@mail.gmail.com>
On Mon, 27 Jul 2026 at 01:20, Qu Wenruo <[email protected]> wrote:
> Inside reflink.c we still have a lot of functions passing vanilla inode
> pointers, then internally convert them into btrfs_inode pointers.
>
> For example, inside btrfs_clone(), we have 12 BTRFS_I() call sites,
> meanwhile only 3 callsites that really require a vanilla inode pointer.
>
> This patch do the cleanup to convert the following functions to pass a
> btrfs_inode pointer instead of a vanilla inode pointer:
>
> - btrfs_clone()
> - btrfs_extent_same_range()
> - clone_finish_inode_update().
>
> Which covers all ad-hoc BTRFS_I() call sites inside reflink.c.
>
> Signed-off-by: Qu Wenruo <[email protected]>

Looks good to me.
Reviewed-by: Daniel Vacek <[email protected]>

Just one small nit below..

> ---
>  fs/btrfs/reflink.c | 96 +++++++++++++++++++++++-----------------------
>  1 file changed, 48 insertions(+), 48 deletions(-)
>
> diff --git a/fs/btrfs/reflink.c b/fs/btrfs/reflink.c
> index 28bb05a92106..a3b71d2067b7 100644
> --- a/fs/btrfs/reflink.c
> +++ b/fs/btrfs/reflink.c
> @@ -20,17 +20,18 @@
>  #define BTRFS_MAX_DEDUPE_LEN   SZ_16M
>
>  static int clone_finish_inode_update(struct btrfs_trans_handle *trans,
> -                                    struct inode *inode,
> +                                    struct btrfs_inode *inode,
>                                      u64 endoff,
>                                      const u64 destoff,
>                                      const u64 olen,
>                                      bool no_time_update)
>  {
> +       struct inode *vfs_inode = &inode->vfs_inode;
>         int ret;
>
> -       inode_inc_iversion(inode);
> +       inode_inc_iversion(vfs_inode);
>         if (!no_time_update) {
> -               inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
> +               inode_set_mtime_to_ts(vfs_inode, inode_set_ctime_current(vfs_inode));
>         }
>         /*
>          * We round up to the block size at eof when determining which
> @@ -38,12 +39,12 @@ static int clone_finish_inode_update(struct btrfs_trans_handle *trans,
>          */
>         if (endoff > destoff + olen)
>                 endoff = destoff + olen;
> -       if (endoff > inode->i_size) {
> -               i_size_write(inode, endoff);
> -               btrfs_inode_safe_disk_i_size_write(BTRFS_I(inode), 0);
> +       if (endoff > vfs_inode->i_size) {
> +               i_size_write(vfs_inode, endoff);
> +               btrfs_inode_safe_disk_i_size_write(inode, 0);
>         }
>
> -       ret = btrfs_update_inode(trans, BTRFS_I(inode));
> +       ret = btrfs_update_inode(trans, inode);
>         if (unlikely(ret)) {
>                 btrfs_abort_transaction(trans, ret);
>                 btrfs_end_transaction(trans);
> @@ -392,11 +393,11 @@ static int clone_copy_inline_extent(struct btrfs_inode *inode,
>   * @destoff:         Offset within @inode to start clone
>   * @no_time_update:  Whether to update mtime/ctime on the target inode
>   */
> -static int btrfs_clone(struct inode *src, struct inode *inode,
> +static int btrfs_clone(struct btrfs_inode *src, struct btrfs_inode *inode,
>                        const u64 off, const u64 olen, const u64 olen_aligned,
>                        const u64 destoff, bool no_time_update)
>  {
> -       struct btrfs_fs_info *fs_info = inode_to_fs_info(inode);
> +       struct btrfs_fs_info *fs_info = inode->root->fs_info;
>         BTRFS_PATH_AUTO_FREE(path);
>         struct extent_buffer *leaf;
>         struct btrfs_trans_handle *trans;
> @@ -420,7 +421,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>
>         path->reada = READA_FORWARD;
>         /* Clone data */
> -       key.objectid = btrfs_ino(BTRFS_I(src));
> +       key.objectid = btrfs_ino(src);
>         key.type = BTRFS_EXTENT_DATA_KEY;
>         key.offset = off;
>
> @@ -436,8 +437,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>                 u64 drop_start;
>
>                 /* Note the key will change type as we walk through the tree */
> -               ret = btrfs_search_slot(NULL, BTRFS_I(src)->root, &key, path,
> -                               0, 0);
> +               ret = btrfs_search_slot(NULL, src->root, &key, path, 0, 0);
>                 if (ret < 0)
>                         goto out;
>                 /*
> @@ -455,7 +455,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>                 nritems = btrfs_header_nritems(path->nodes[0]);
>  process_slot:
>                 if (path->slots[0] >= nritems) {
> -                       ret = btrfs_next_leaf(BTRFS_I(src)->root, path);
> +                       ret = btrfs_next_leaf(src->root, path);
>                         if (ret < 0)
>                                 goto out;
>                         if (ret > 0)
> @@ -467,7 +467,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>
>                 btrfs_item_key_to_cpu(leaf, &key, slot);
>                 if (key.type > BTRFS_EXTENT_DATA_KEY ||
> -                   key.objectid != btrfs_ino(BTRFS_I(src)))
> +                   key.objectid != btrfs_ino(src))
>                         break;
>
>                 ASSERT(key.type == BTRFS_EXTENT_DATA_KEY, "key.type=%u", key.type);
> @@ -514,7 +514,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>                 btrfs_release_path(path);
>
>                 memcpy(&new_key, &key, sizeof(new_key));
> -               new_key.objectid = btrfs_ino(BTRFS_I(inode));
> +               new_key.objectid = btrfs_ino(inode);
>                 if (off <= key.offset)
>                         new_key.offset = key.offset + destoff - off;
>                 else
> @@ -558,7 +558,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>                         clone_info.extent_buf = buf;
>                         clone_info.is_new_extent = false;
>                         clone_info.update_times = !no_time_update;
> -                       ret = btrfs_replace_file_extents(BTRFS_I(inode), path,
> +                       ret = btrfs_replace_file_extents(inode, path,
>                                         drop_start, new_key.offset + datal - 1,
>                                         &clone_info, &trans);
>                         if (ret)
> @@ -582,7 +582,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>                                 goto out;
>                         }
>
> -                       ret = clone_copy_inline_extent(BTRFS_I(inode), path, &new_key,
> +                       ret = clone_copy_inline_extent(inode, path, &new_key,
>                                                        drop_start, datal, size,
>                                                        comp, buf, &trans);
>                         if (ret)
> @@ -605,9 +605,9 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>                  * the checksums problem on fsync.
>                  */
>                 if (extent_gen == trans->transid && disko > 0)
> -                       BTRFS_I(src)->last_reflink_trans = trans->transid;
> +                       src->last_reflink_trans = trans->transid;
>
> -               BTRFS_I(inode)->last_reflink_trans = trans->transid;
> +               inode->last_reflink_trans = trans->transid;
>
>                 last_dest_end = ALIGN(new_key.offset + datal,
>                                       fs_info->sectorsize);
> @@ -653,10 +653,10 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>                  * set by previous calls to btrfs_replace_file_extents() that
>                  * replaced file extent items.
>                  */
> -               if (last_dest_end >= i_size_read(inode))
> -                       btrfs_set_inode_full_sync(BTRFS_I(inode));
> +               if (last_dest_end >= i_size_read(&inode->vfs_inode))
> +                       btrfs_set_inode_full_sync(inode);
>
> -               ret = btrfs_replace_file_extents(BTRFS_I(inode), path,
> +               ret = btrfs_replace_file_extents(inode, path,
>                                 last_dest_end, destoff + len - 1, NULL, &trans);
>                 if (ret)
>                         goto out;
> @@ -666,7 +666,7 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
>         }
>
>  out:
> -       clear_bit(BTRFS_INODE_NO_DELALLOC_FLUSH, &BTRFS_I(inode)->runtime_flags);
> +       clear_bit(BTRFS_INODE_NO_DELALLOC_FLUSH, &inode->runtime_flags);
>
>         return ret;
>  }
> @@ -701,8 +701,7 @@ static int btrfs_extent_same_range(struct btrfs_inode *src, u64 loff, u64 len,
>          * mode.
>          */
>         btrfs_lock_extent(&dst->io_tree, dst_loff, end, &cached_state);
> -       ret = btrfs_clone(&src->vfs_inode, &dst->vfs_inode, loff, len,
> -                         ALIGN(len, bs), dst_loff, true);
> +       ret = btrfs_clone(src, dst, loff, len, ALIGN(len, bs), dst_loff, true);
>         btrfs_unlock_extent(&dst->io_tree, dst_loff, end, &cached_state);
>
>         btrfs_btree_balance_dirty(fs_info);
> @@ -710,12 +709,12 @@ static int btrfs_extent_same_range(struct btrfs_inode *src, u64 loff, u64 len,
>         return ret;
>  }
>
> -static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
> -                            struct inode *dst, u64 dst_loff)
> +static int btrfs_extent_same(struct btrfs_inode *src, u64 loff, u64 olen,
> +                            struct btrfs_inode *dst, u64 dst_loff)
>  {
>         int ret = 0;
>         u64 i, tail_len, chunk_count;
> -       struct btrfs_root *root_dst = BTRFS_I(dst)->root;
> +       struct btrfs_root *root_dst = dst->root;
>
>         spin_lock(&root_dst->root_item_lock);
>         if (root_dst->send_in_progress) {
> @@ -733,8 +732,8 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
>         chunk_count = div_u64(olen, BTRFS_MAX_DEDUPE_LEN);
>
>         for (i = 0; i < chunk_count; i++) {
> -               ret = btrfs_extent_same_range(BTRFS_I(src), loff, BTRFS_MAX_DEDUPE_LEN,
> -                                             BTRFS_I(dst), dst_loff);
> +               ret = btrfs_extent_same_range(src, loff, BTRFS_MAX_DEDUPE_LEN,
> +                                             dst, dst_loff);
>                 if (ret)
>                         goto out;
>
> @@ -743,8 +742,8 @@ static int btrfs_extent_same(struct inode *src, u64 loff, u64 olen,
>         }
>
>         if (tail_len > 0)
> -               ret = btrfs_extent_same_range(BTRFS_I(src), loff, tail_len,
> -                                             BTRFS_I(dst), dst_loff);
> +               ret = btrfs_extent_same_range(src, loff, tail_len,
> +                                             dst, dst_loff);
>  out:
>         spin_lock(&root_dst->root_item_lock);
>         root_dst->dedupe_in_progress--;
> @@ -757,9 +756,11 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
>                                         u64 off, u64 olen, u64 destoff)
>  {
>         struct extent_state *cached_state = NULL;
> -       struct inode *inode = file_inode(file);
> -       struct inode *src = file_inode(file_src);
> -       struct btrfs_fs_info *fs_info = inode_to_fs_info(inode);
> +       struct btrfs_inode *inode = BTRFS_I(file_inode(file));
> +       struct btrfs_inode *src = BTRFS_I(file_inode(file_src));
> +       struct btrfs_fs_info *fs_info = inode->root->fs_info;
> +       const u64 src_isize = src->vfs_inode.i_size;
> +       const u64 inode_isize = inode->vfs_inode.i_size;
>         int ret;
>         u64 len = olen;
>         const u32 bs = fs_info->sectorsize;
> @@ -771,13 +772,13 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
>          * if the file size is not blocksize aligned. So we don't need to check
>          * for that case here.
>          */
> -       if (off + len == src->i_size)
> -               len = ALIGN(src->i_size, bs) - off;
> +       if (off + len == src_isize)
> +               len = ALIGN(src_isize, bs) - off;
>
> -       if (destoff > inode->i_size) {
> -               const u64 wb_start = ALIGN_DOWN(inode->i_size, bs);
> +       if (destoff > inode_isize) {
> +               const u64 wb_start = ALIGN_DOWN(inode_isize, bs);
>
> -               ret = btrfs_cont_expand(BTRFS_I(inode), inode->i_size, destoff);
> +               ret = btrfs_cont_expand(inode, inode_isize, destoff);
>                 if (ret)
>                         return ret;
>                 /*
> @@ -789,7 +790,7 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
>                  * we found the previous extent covering eof and before we
>                  * attempted to increment its reference count).
>                  */
> -               ret = btrfs_wait_ordered_range(BTRFS_I(inode), wb_start,
> +               ret = btrfs_wait_ordered_range(inode, wb_start,
>                                                destoff - wb_start);

This could have been a single line.

--nX

>                 if (ret)
>                         return ret;
> @@ -802,9 +803,9 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
>          * mode.
>          */
>         end = destoff + len - 1;
> -       btrfs_lock_extent(&BTRFS_I(inode)->io_tree, destoff, end, &cached_state);
> +       btrfs_lock_extent(&inode->io_tree, destoff, end, &cached_state);
>         ret = btrfs_clone(src, inode, off, olen, len, destoff, false);
> -       btrfs_unlock_extent(&BTRFS_I(inode)->io_tree, destoff, end, &cached_state);
> +       btrfs_unlock_extent(&inode->io_tree, destoff, end, &cached_state);
>         if (ret < 0)
>                 return ret;
>
> @@ -818,7 +819,7 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
>          * could come from some range other than the copied inline extent's
>          * destination range and we have no way to know that.
>          */
> -       ret = btrfs_wait_ordered_range(BTRFS_I(inode), destoff, len);
> +       ret = btrfs_wait_ordered_range(inode, destoff, len);
>         if (ret < 0)
>                 return ret;
>
> @@ -826,7 +827,7 @@ static noinline int btrfs_clone_files(struct file *file, struct file *file_src,
>          * Invalidate page cache so that future reads will see the cloned data
>          * immediately and not the previous data.
>          */
> -       ret = filemap_invalidate_inode(inode, false, destoff, end);
> +       ret = filemap_invalidate_inode(&inode->vfs_inode, false, destoff, end);
>         if (ret < 0)
>                 return ret;
>
> @@ -934,7 +935,7 @@ loff_t btrfs_remap_file_range(struct file *src_file, loff_t off,
>         bool same_inode = dst_inode == src_inode;
>         int ret;
>
> -       if (btrfs_is_shutdown(inode_to_fs_info(file_inode(src_file))))
> +       if (btrfs_is_shutdown(src_inode->root->fs_info))
>                 return -EIO;
>
>         if (remap_flags & ~(REMAP_FILE_DEDUP | REMAP_FILE_ADVISORY))
> @@ -953,8 +954,7 @@ loff_t btrfs_remap_file_range(struct file *src_file, loff_t off,
>                 goto out_unlock;
>
>         if (remap_flags & REMAP_FILE_DEDUP)
> -               ret = btrfs_extent_same(&src_inode->vfs_inode, off, len,
> -                                       &dst_inode->vfs_inode, destoff);
> +               ret = btrfs_extent_same(src_inode, off, len, dst_inode, destoff);
>         else
>                 ret = btrfs_clone_files(dst_file, src_file, off, len, destoff);
>
> --
> 2.54.0
>
>