summaryrefslogtreecommitdiff
path: root/fs/configfs
diff options
context:
space:
mode:
authorJoel Becker <joel.becker@oracle.com>2007-03-05 15:49:49 -0800
committerMark Fasheh <mark.fasheh@oracle.com>2007-03-14 14:37:21 -0700
commitafdf04ea098139e86147f63aad9c383cad3b6f37 (patch)
tree2050cfea8aeea2280182cc0263efbd3ad0505b34 /fs/configfs
parent03f981cf2ec95dd8bc43d2ecccaec4e83c8375e2 (diff)
downloadlwn-afdf04ea098139e86147f63aad9c383cad3b6f37.tar.gz
lwn-afdf04ea098139e86147f63aad9c383cad3b6f37.zip
configfs: add missing mutex_unlock()
d_alloc() failure in configfs_register_subsystem() would fail to unlock the mutex taken above. Reorganize the exit path to ensure the unlock happens. Reported-by: Akinobu Mita <akinobu.mita@gmail.com> Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/configfs')
-rw-r--r--fs/configfs/dir.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/fs/configfs/dir.c b/fs/configfs/dir.c
index 34750d5e4ff2..5e6e37e58f36 100644
--- a/fs/configfs/dir.c
+++ b/fs/configfs/dir.c
@@ -1141,25 +1141,22 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)
err = -ENOMEM;
dentry = d_alloc(configfs_sb->s_root, &name);
- if (!dentry)
- goto out_release;
-
- d_add(dentry, NULL);
+ if (dentry) {
+ d_add(dentry, NULL);
- err = configfs_attach_group(sd->s_element, &group->cg_item,
- dentry);
- if (!err)
- dentry = NULL;
- else
- d_delete(dentry);
+ err = configfs_attach_group(sd->s_element, &group->cg_item,
+ dentry);
+ if (err) {
+ d_delete(dentry);
+ dput(dentry);
+ }
+ }
mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex);
- if (dentry) {
- dput(dentry);
-out_release:
- unlink_group(group);
- configfs_release_fs();
+ if (err) {
+ unlink_group(group);
+ configfs_release_fs();
}
return err;