From: Filipe Manana Date: Thu, 5 May 2016 00:41:57 +0000 (+0100) Subject: Btrfs: fix inode leak on failure to setup whiteout inode in rename X-Git-Tag: v4.13~2995^2^2~6 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=c990161888f387db136856337c237aa8d5003292;hp=cdd1fedf8261cd7a73c0596298902ff4f0f04492;p=mirror_ubuntu-bionic-kernel.git Btrfs: fix inode leak on failure to setup whiteout inode in rename If we failed to fully setup the whiteout inode during a rename operation with the whiteout flag, we ended up leaking the inode, not decrementing its link count nor removing all its items from the fs/subvol tree. Signed-off-by: Filipe Manana --- diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 452cfefbf4b8..98c119b02916 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -9612,21 +9612,21 @@ static int btrfs_whiteout_for_rename(struct btrfs_trans_handle *trans, ret = btrfs_init_inode_security(trans, inode, dir, &dentry->d_name); if (ret) - return ret; + goto out; ret = btrfs_add_nondir(trans, dir, dentry, inode, 0, index); if (ret) - return ret; + goto out; ret = btrfs_update_inode(trans, root, inode); - if (ret) - return ret; - +out: unlock_new_inode(inode); + if (ret) + inode_dec_link_count(inode); iput(inode); - return 0; + return ret; } static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry,