*/
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}}",
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);