Commit e87e953b authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba
Browse files

btrfs: fix inode leak on failure to add link to inode



If we fail to update the inode or delete the orphan item we leak the inode
since we update its refcount with the ihold() call to account for the
d_instantiate() call which never happens in case we fail those steps. Fix
this by setting 'drop_inode' to true in case we fail those steps.

Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 2b397962
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -6854,6 +6854,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
		ret = btrfs_update_inode(trans, BTRFS_I(inode));
		if (ret) {
			btrfs_abort_transaction(trans, ret);
			drop_inode = 1;
			goto fail;
		}
		if (inode->i_nlink == 1) {
@@ -6864,6 +6865,7 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir,
			ret = btrfs_orphan_del(trans, BTRFS_I(inode));
			if (ret) {
				btrfs_abort_transaction(trans, ret);
				drop_inode = 1;
				goto fail;
			}
		}