All of lore.kernel.org
 help / color / mirror / Atom feed
From: Scott Mayhew <smayhew@redhat.com>
To: anna.schumaker@netapp.com, trond.myklebust@hammerspace.com
Cc: dhowells@redhat.com, viro@zeniv.linux.org.uk,
	linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v4 07/26] nfs: lift setting mount_info from nfs_xdev_mount()
Date: Fri, 13 Sep 2019 08:17:29 -0400	[thread overview]
Message-ID: <20190913121748.25391-8-smayhew@redhat.com> (raw)
In-Reply-To: <20190913121748.25391-1-smayhew@redhat.com>

From: Al Viro <viro@zeniv.linux.org.uk>

Do it in nfs_do_submount() instead.  As a side benefit, nfs_clone_data
doesn't need ->fh and ->fattr anymore.

Reviewed-by: David Howells <dhowells@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
---
 fs/nfs/internal.h  |  3 +--
 fs/nfs/namespace.c | 35 +++++++++++++++++++++--------------
 fs/nfs/super.c     | 25 ++++---------------------
 3 files changed, 26 insertions(+), 37 deletions(-)

diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index c132e683e1c9..eeb54b45875c 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -42,8 +42,6 @@ static inline int nfs_attr_use_mounted_on_fileid(struct nfs_fattr *fattr)
 struct nfs_clone_mount {
 	const struct super_block *sb;
 	const struct dentry *dentry;
-	struct nfs_fh *fh;
-	struct nfs_fattr *fattr;
 	char *hostname;
 	char *mnt_path;
 	struct sockaddr *addr;
@@ -413,6 +411,7 @@ struct dentry * nfs_xdev_mount_common(struct file_system_type *, int,
 		const char *, struct nfs_mount_info *);
 void nfs_kill_super(struct super_block *);
 void nfs_fill_super(struct super_block *, struct nfs_mount_info *);
+void nfs_clone_super(struct super_block *, struct nfs_mount_info *);
 
 extern struct rpc_stat nfs_rpcstat;
 
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index 9287eb666322..7c78e6956639 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -19,6 +19,7 @@
 #include <linux/vfs.h>
 #include <linux/sunrpc/gss_api.h>
 #include "internal.h"
+#include "nfs.h"
 
 #define NFSDBG_FACILITY		NFSDBG_VFS
 
@@ -210,16 +211,6 @@ void nfs_release_automount_timer(void)
 		cancel_delayed_work(&nfs_automount_task);
 }
 
-/*
- * Clone a mountpoint of the appropriate type
- */
-static struct vfsmount *nfs_do_clone_mount(struct nfs_server *server,
-					   const char *devname,
-					   struct nfs_clone_mount *mountdata)
-{
-	return vfs_submount(mountdata->dentry, &nfs_xdev_fs_type, devname, mountdata);
-}
-
 /**
  * nfs_do_submount - set up mountpoint when crossing a filesystem boundary
  * @dentry: parent directory
@@ -231,13 +222,20 @@ static struct vfsmount *nfs_do_clone_mount(struct nfs_server *server,
 struct vfsmount *nfs_do_submount(struct dentry *dentry, struct nfs_fh *fh,
 				 struct nfs_fattr *fattr, rpc_authflavor_t authflavor)
 {
+	struct super_block *sb = dentry->d_sb;
 	struct nfs_clone_mount mountdata = {
-		.sb = dentry->d_sb,
+		.sb = sb,
 		.dentry = dentry,
-		.fh = fh,
-		.fattr = fattr,
 		.authflavor = authflavor,
 	};
+	struct nfs_mount_info mount_info = {
+		.fill_super = nfs_clone_super,
+		.set_security = nfs_clone_sb_security,
+		.cloned = &mountdata,
+		.mntfh = fh,
+	};
+	struct nfs_subversion *nfs_mod = NFS_SB(sb)->nfs_client->cl_nfs_mod;
+	struct nfs_server *server;
 	struct vfsmount *mnt;
 	char *page = (char *) __get_free_page(GFP_USER);
 	char *devname;
@@ -245,12 +243,21 @@ struct vfsmount *nfs_do_submount(struct dentry *dentry, struct nfs_fh *fh,
 	if (page == NULL)
 		return ERR_PTR(-ENOMEM);
 
+	server = nfs_mod->rpc_ops->clone_server(NFS_SB(sb), fh,
+						fattr, authflavor);
+	if (IS_ERR(server))
+		return ERR_CAST(server);
+
+	mount_info.server = server;
+
 	devname = nfs_devname(dentry, page, PAGE_SIZE);
 	if (IS_ERR(devname))
 		mnt = ERR_CAST(devname);
 	else
-		mnt = nfs_do_clone_mount(NFS_SB(dentry->d_sb), devname, &mountdata);
+		mnt = vfs_submount(dentry, &nfs_xdev_fs_type, devname, &mount_info);
 
+	if (mount_info.server)
+		nfs_free_server(mount_info.server);
 	free_page((unsigned long)page);
 	return mnt;
 }
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 10544ef8de57..7fc354207347 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2386,7 +2386,7 @@ EXPORT_SYMBOL_GPL(nfs_fill_super);
 /*
  * Finish setting up a cloned NFS2/3/4 superblock
  */
-static void nfs_clone_super(struct super_block *sb,
+void nfs_clone_super(struct super_block *sb,
 			    struct nfs_mount_info *mount_info)
 {
 	const struct super_block *old_sb = mount_info->cloned->sb;
@@ -2771,27 +2771,10 @@ static struct dentry *
 nfs_xdev_mount(struct file_system_type *fs_type, int flags,
 		const char *dev_name, void *raw_data)
 {
-	struct nfs_clone_mount *data = raw_data;
-	struct nfs_mount_info mount_info = {
-		.fill_super = nfs_clone_super,
-		.set_security = nfs_clone_sb_security,
-		.cloned = data,
-	};
-	struct dentry *mntroot = ERR_PTR(-ENOMEM);
-	struct nfs_subversion *nfs_mod = NFS_SB(data->sb)->nfs_client->cl_nfs_mod;
-
-	dprintk("--> nfs_xdev_mount()\n");
+	struct nfs_mount_info *info = raw_data;
+	struct nfs_subversion *nfs_mod = NFS_SB(info->cloned->sb)->nfs_client->cl_nfs_mod;
 
-	mount_info.mntfh = mount_info.cloned->fh;
-
-	/* create a new volume representation */
-	mount_info.server = nfs_mod->rpc_ops->clone_server(NFS_SB(data->sb), data->fh, data->fattr, data->authflavor);
-
-	mntroot = nfs_fs_mount_common(flags, dev_name, &mount_info, nfs_mod);
-
-	dprintk("<-- nfs_xdev_mount() = %ld\n",
-			IS_ERR(mntroot) ? PTR_ERR(mntroot) : 0L);
-	return mntroot;
+	return nfs_fs_mount_common(flags, dev_name, info, nfs_mod);
 }
 
 #if IS_ENABLED(CONFIG_NFS_V4)
-- 
2.17.2


  parent reply	other threads:[~2019-09-13 12:19 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-13 12:17 [PATCH v4 00/26] nfs: Mount API conversion Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 01/26] saner calling conventions for nfs_fs_mount_common() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 02/26] nfs: stash server into struct nfs_mount_info Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 03/26] nfs: lift setting mount_info from nfs4_remote{,_referral}_mount Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 04/26] nfs: fold nfs4_remote_fs_type and nfs4_remote_referral_fs_type Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 05/26] nfs: don't bother setting/restoring export_path around do_nfs_root_mount() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 06/26] nfs4: fold nfs_do_root_mount/nfs_follow_remote_path Scott Mayhew
2019-09-13 12:17 ` Scott Mayhew [this message]
2019-09-13 12:17 ` [PATCH v4 08/26] nfs: stash nfs_subversion reference into nfs_mount_info Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 09/26] nfs: don't bother passing nfs_subversion to ->try_mount() and nfs_fs_mount_common() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 10/26] nfs: merge xdev and remote file_system_type Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 11/26] nfs: unexport nfs_fs_mount_common() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 12/26] nfs: don't pass nfs_subversion to ->create_server() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 13/26] nfs: get rid of mount_info ->fill_super() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 14/26] nfs_clone_sb_security(): simplify the check for server bogosity Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 15/26] nfs: get rid of ->set_security() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 16/26] NFS: Move mount parameterisation bits into their own file Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 17/26] NFS: Constify mount argument match tables Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 18/26] NFS: Rename struct nfs_parsed_mount_data to struct nfs_fs_context Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 19/26] NFS: Split nfs_parse_mount_options() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 20/26] NFS: Deindent nfs_fs_context_parse_option() Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 21/26] NFS: Add a small buffer in nfs_fs_context to avoid string dup Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 22/26] NFS: Do some tidying of the parsing code Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 23/26] NFS: rename nfs_fs_context pointer arg in a few functions Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 24/26] NFS: Convert mount option parsing to use functionality from fs_parser.h Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 25/26] NFS: Add fs_context support Scott Mayhew
2019-09-13 12:17 ` [PATCH v4 26/26] NFS: Attach supplementary error information to fs_context Scott Mayhew

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190913121748.25391-8-smayhew@redhat.com \
    --to=smayhew@redhat.com \
    --cc=anna.schumaker@netapp.com \
    --cc=dhowells@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trond.myklebust@hammerspace.com \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.