From 11e86a4adb1080c2953153cbc14b9cd58d40ba42 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Tue, 31 Aug 2004 07:45:38 -0700 Subject: [PATCH] [PATCH] afs ->follow_link() fixes * fixed leaks on failure exits * got rid of useless struct nameidata instance Signed-off-by: Al Viro Signed-off-by: Linus Torvalds --- fs/afs/mntpt.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/fs/afs/mntpt.c b/fs/afs/mntpt.c index 8b5c1e2e50b02..bfc28abe1cb1c 100644 --- a/fs/afs/mntpt.c +++ b/fs/afs/mntpt.c @@ -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) { - struct nameidata newnd; struct vfsmount *newmnt; + struct dentry *old_dentry; int err; kenter("%p{%s},{%s:%p{%s}}", @@ -247,15 +247,19 @@ static int afs_mntpt_follow_link(struct dentry *dentry, struct nameidata *nd) nd->dentry->d_name.name); newmnt = afs_mntpt_do_automount(dentry); - if (IS_ERR(newmnt)) + if (IS_ERR(newmnt)) { + path_release(nd); return PTR_ERR(newmnt); + } - newnd = *nd; - newnd.dentry = dentry; - err = do_add_mount(newmnt, &newnd, 0, &afs_vfsmounts); + old_dentry = nd->dentry; + nd->dentry = dentry; + err = do_add_mount(newmnt, nd, 0, &afs_vfsmounts); + nd->dentry = old_dentry; + + path_release(nd); if (!err) { - path_release(nd); mntget(newmnt); nd->mnt = newmnt; dget(newmnt->mnt_root); -- 2.53.0