mirror of
https://github.com/torvalds/linux.git
synced 2026-08-01 03:59:40 +02:00
btrfs: use btrfs inodes in btrfs_rmdir() to avoid so much usage of BTRFS_I()
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>
This commit is contained in:
parent
9f82a4ed34
commit
98060e1611
|
|
@ -4701,32 +4701,33 @@ int btrfs_delete_subvolume(struct btrfs_inode *dir, struct dentry *dentry)
|
|||
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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user