From 35a4e245b0c41c20a58822ec5a6de5b91fefab83 Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Sun, 8 Nov 2009 18:18:56 -0500 Subject: [PATCH] Unionfs: unlock lower parent inode correctly on error path Bug fix: on some errors, lower directory inode may remain locked and hold a reference. This was in ->create, ->symlink, and ->mknod. Signed-off-by: Erez Zadok --- fs/unionfs/inode.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c index bd5a3b33694..0855cdb24b3 100644 --- a/fs/unionfs/inode.c +++ b/fs/unionfs/inode.c @@ -125,12 +125,12 @@ static int unionfs_create(struct inode *dir, struct dentry *dentry, lower_parent_dentry = lock_parent(lower_dentry); if (IS_ERR(lower_parent_dentry)) { err = PTR_ERR(lower_parent_dentry); - goto out; + goto out_unlock; } err = init_lower_nd(&lower_nd, LOOKUP_CREATE); if (unlikely(err < 0)) - goto out; + goto out_unlock; err = vfs_create(lower_parent_dentry->d_inode, lower_dentry, mode, &lower_nd); release_lower_nd(&lower_nd, err); @@ -146,8 +146,8 @@ static int unionfs_create(struct inode *dir, struct dentry *dentry, } } +out_unlock: unlock_dir(lower_parent_dentry); - out: if (!err) { unionfs_postcopyup_setmnt(dentry); @@ -390,7 +390,7 @@ static int unionfs_symlink(struct inode *dir, struct dentry *dentry, lower_parent_dentry = lock_parent(lower_dentry); if (IS_ERR(lower_parent_dentry)) { err = PTR_ERR(lower_parent_dentry); - goto out; + goto out_unlock; } mode = S_IALLUGO; @@ -406,8 +406,8 @@ static int unionfs_symlink(struct inode *dir, struct dentry *dentry, } } +out_unlock: unlock_dir(lower_parent_dentry); - out: dput(wh_dentry); kfree(name); @@ -583,7 +583,7 @@ static int unionfs_mknod(struct inode *dir, struct dentry *dentry, int mode, lower_parent_dentry = lock_parent(lower_dentry); if (IS_ERR(lower_parent_dentry)) { err = PTR_ERR(lower_parent_dentry); - goto out; + goto out_unlock; } err = vfs_mknod(lower_parent_dentry->d_inode, lower_dentry, mode, dev); @@ -598,8 +598,8 @@ static int unionfs_mknod(struct inode *dir, struct dentry *dentry, int mode, } } +out_unlock: unlock_dir(lower_parent_dentry); - out: dput(wh_dentry); kfree(name); -- 2.34.1