]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: use btrfs inodes in btrfs_rmdir() to avoid so much usage of BTRFS_I()
authorFilipe Manana <fdmanana@suse.com>
Sun, 17 May 2026 13:52:03 +0000 (09:52 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 May 2026 11:03:34 +0000 (13:03 +0200)
[ Upstream commit 98060e1611177ddc842601a58258876ab435fdbf ]

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>
Stable-dep-of: 999757231c49 ("btrfs: fix missing last_unlink_trans update when removing a directory")
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/btrfs/inode.c

index fd2806f12e83befb43afdc5d38acbb2617ccb5cc..f91f3b42ff4579a5f5639a5030354252f9edfd89 100644 (file)
@@ -4623,32 +4623,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;
@@ -4668,22 +4669,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: