diff options
author | Josef Bacik <jbacik@fusionio.com> | 2013-06-03 21:39:49 -0400 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-06-14 11:30:16 -0400 |
commit | 01cd33674e95296e1647da3534b9aef1e98556b5 (patch) | |
tree | 2d7f1e1f088c546266a5a7f01782c9374982ac93 | |
parent | c69b26b0116dc2c064457991bec91b6d94e96d65 (diff) | |
download | kernel_goldelico_gta04-01cd33674e95296e1647da3534b9aef1e98556b5.zip kernel_goldelico_gta04-01cd33674e95296e1647da3534b9aef1e98556b5.tar.gz kernel_goldelico_gta04-01cd33674e95296e1647da3534b9aef1e98556b5.tar.bz2 |
Btrfs: put our inode if orphan cleanup fails
When we cross into a different subvol when doing a lookup we will run the orhpan
cleanup. If this fails however we do not drop the ref to the inode we were
looking up before we return an error, which leads to busy inodes on umount.
Thanks,
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
-rw-r--r-- | fs/btrfs/inode.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c52ceb8..a2df469 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -4941,8 +4941,10 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) if (!(inode->i_sb->s_flags & MS_RDONLY)) ret = btrfs_orphan_cleanup(sub_root); up_read(&root->fs_info->cleanup_work_sem); - if (ret) + if (ret) { + iput(inode); inode = ERR_PTR(ret); + } } return inode; |