Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b88f8a54 authored by Trond Myklebust's avatar Trond Myklebust Committed by Linus Torvalds
Browse files

NFS: Correct the NFS mount path when following a referral

parent 0b75b35c
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -2559,6 +2559,27 @@ static struct vfsmount *nfs_do_root_mount(struct file_system_type *fs_type,
	return root_mnt;
}

static void nfs_fix_devname(const struct path *path, struct vfsmount *mnt)
{
	char *page = (char *) __get_free_page(GFP_KERNEL);
	char *devname, *tmp;

	if (page == NULL)
		return;
	devname = nfs_path(path->mnt->mnt_devname,
			path->mnt->mnt_root, path->dentry,
			page, PAGE_SIZE);
	if (devname == NULL)
		goto out_freepage;
	tmp = kstrdup(devname, GFP_KERNEL);
	if (tmp == NULL)
		goto out_freepage;
	kfree(mnt->mnt_devname);
	mnt->mnt_devname = tmp;
out_freepage:
	free_page((unsigned long)page);
}

static int nfs_follow_remote_path(struct vfsmount *root_mnt,
		const char *export_path, struct vfsmount *mnt_target)
{
@@ -2585,6 +2606,9 @@ static int nfs_follow_remote_path(struct vfsmount *root_mnt,
	mnt_target->mnt_sb = s;
	mnt_target->mnt_root = dget(nd.path.dentry);

	/* Correct the device pathname */
	nfs_fix_devname(&nd.path, mnt_target);

	path_put(&nd.path);
	down_write(&s->s_umount);
	return 0;