]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: use btrfs inodes in btrfs_rmdir() to avoid so much usage of BTRFS_I()
authorFilipe Manana <fdmanana@suse.com>
Fri, 20 Jun 2025 15:58:48 +0000 (16:58 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jul 2025 21:58:04 +0000 (23:58 +0200)
Almost everywhere we want to use a btrfs inode and therefore we have a
lot of calls to BTRFS_I(), making the code more verbose. Instead use btrfs
inode local variables to avoid so much use of BTRFS_I().

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index f8e4651fe60bdd0b05c3d0fb4af4541dcb9fa22b..6df7ef1b869b2e06106eca9ba92cc4b1cd5041c1 100644 (file)
@@ -4701,32 +4701,33 @@ out_up_write:
        return ret;
 }
 
-static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
+static int btrfs_rmdir(struct inode *vfs_dir, struct dentry *dentry)
 {
-       struct inode *inode = d_inode(dentry);
-       struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
+       struct btrfs_inode *dir = BTRFS_I(vfs_dir);
+       struct btrfs_inode *inode = BTRFS_I(d_inode(dentry));
+       struct btrfs_fs_info *fs_info = inode->root->fs_info;
        int ret = 0;
        struct btrfs_trans_handle *trans;
        struct fscrypt_name fname;
 
-       if (inode->i_size > BTRFS_EMPTY_DIR_SIZE)
+       if (inode->vfs_inode.i_size > BTRFS_EMPTY_DIR_SIZE)
                return -ENOTEMPTY;
-       if (btrfs_ino(BTRFS_I(inode)) == BTRFS_FIRST_FREE_OBJECTID) {
+       if (btrfs_ino(inode) == BTRFS_FIRST_FREE_OBJECTID) {
                if (unlikely(btrfs_fs_incompat(fs_info, EXTENT_TREE_V2))) {
                        btrfs_err(fs_info,
                        "extent tree v2 doesn't support snapshot deletion yet");
                        return -EOPNOTSUPP;
                }
-               return btrfs_delete_subvolume(BTRFS_I(dir), dentry);
+               return btrfs_delete_subvolume(dir, dentry);
        }
 
-       ret = fscrypt_setup_filename(dir, &dentry->d_name, 1, &fname);
+       ret = fscrypt_setup_filename(vfs_dir, &dentry->d_name, 1, &fname);
        if (ret)
                return ret;
 
        /* This needs to handle no-key deletions later on */
 
-       trans = __unlink_start_trans(BTRFS_I(dir));
+       trans = __unlink_start_trans(dir);
        if (IS_ERR(trans)) {
                ret = PTR_ERR(trans);
                goto out_notrans;
@@ -4746,22 +4747,22 @@ static int btrfs_rmdir(struct inode *dir, struct dentry *dentry)
         * This is because we can't unlink other roots when replaying the dir
         * deletes for directory foo.
         */
-       if (BTRFS_I(inode)->last_unlink_trans >= trans->transid)
-               btrfs_record_snapshot_destroy(trans, BTRFS_I(dir));
+       if (inode->last_unlink_trans >= trans->transid)
+               btrfs_record_snapshot_destroy(trans, dir);
 
-       if (unlikely(btrfs_ino(BTRFS_I(inode)) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
-               ret = btrfs_unlink_subvol(trans, BTRFS_I(dir), dentry);
+       if (unlikely(btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
+               ret = btrfs_unlink_subvol(trans, dir, dentry);
                goto out;
        }
 
-       ret = btrfs_orphan_add(trans, BTRFS_I(inode));
+       ret = btrfs_orphan_add(trans, inode);
        if (ret)
                goto out;
 
        /* now the directory is empty */
-       ret = btrfs_unlink_inode(trans, BTRFS_I(dir), BTRFS_I(inode), &fname.disk_name);
+       ret = btrfs_unlink_inode(trans, dir, inode, &fname.disk_name);
        if (!ret)
-               btrfs_i_size_write(BTRFS_I(inode), 0);
+               btrfs_i_size_write(inode, 0);
 out:
        btrfs_end_transaction(trans);
 out_notrans: