Commit 11e86a4a authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] afs ->follow_link() fixes

* fixed leaks on failure exits
* got rid of useless struct nameidata instance
Signed-off-by: default avatarAl Viro <viro@parcelfarce.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent f0c3ad0c
...@@ -235,8 +235,8 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt) ...@@ -235,8 +235,8 @@ static struct vfsmount *afs_mntpt_do_automount(struct dentry *mntpt)
*/ */
static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
{ {
struct nameidata newnd;
struct vfsmount *newmnt; struct vfsmount *newmnt;
struct dentry *old_dentry;
int err; int err;
kenter("%p{%s},{%s:%p{%s}}", kenter("%p{%s},{%s:%p{%s}}",
...@@ -247,15 +247,19 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) ...@@ -247,15 +247,19 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd)
nd->dentry->d_name.name); nd->dentry->d_name.name);
newmnt = afs_mntpt_do_automount(dentry); newmnt = afs_mntpt_do_automount(dentry);
if (IS_ERR(newmnt)) if (IS_ERR(newmnt)) {
path_release(nd);
return PTR_ERR(newmnt); return PTR_ERR(newmnt);
}
newnd = *nd; old_dentry = nd->dentry;
newnd.dentry = dentry; nd->dentry = dentry;
err = do_add_mount(newmnt, &newnd, 0, &afs_vfsmounts); err = do_add_mount(newmnt, nd, 0, &afs_vfsmounts);
nd->dentry = old_dentry;
if (!err) {
path_release(nd); path_release(nd);
if (!err) {
mntget(newmnt); mntget(newmnt);
nd->mnt = newmnt; nd->mnt = newmnt;
dget(newmnt->mnt_root); dget(newmnt->mnt_root);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment