linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Kirill A. Shutemov" <kas@openvz.org>
To: Trond Myklebust <Trond.Myklebust@netapp.com>,
	"J. Bruce Fields" <bfields@fieldses.org>,
	Neil Brown <neilb@suse.de>
Cc: Pavel Emelyanov <xemul@parallels.com>,
	linux-nfs@vger.kernel.org,
	"David S. Miller" <davem@davemloft.net>,
	Rob Landley <rlandley@parallels.com>,
	Al Viro <viro@ZenIV.linux.org.uk>,
	containers@lists.linux-foundation.org, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	"Kirill A. Shutemov" <kas@openvz.org>
Subject: [PATCH v3, RESEND 16/16] Rework get_rpc_pipefs() and introduce put_rpc_pipefs()
Date: Tue,  8 Feb 2011 20:42:07 +0200	[thread overview]
Message-ID: <1297190527-19925-17-git-send-email-kas@openvz.org> (raw)
In-Reply-To: <1297190527-19925-1-git-send-email-kas@openvz.org>

Now sunrpc module can be removed normally.

Signed-off-by: Kirill A. Shutemov <kas@openvz.org>
Reviewed-by: Rob Landley <rlandley@parallels.com>
---
 fs/nfs/client.c                    |    4 +-
 fs/nfs/super.c                     |    2 +-
 fs/nfsd/nfs4callback.c             |    2 +-
 fs/nfsd/nfssvc.c                   |    4 +-
 include/linux/sunrpc/rpc_pipe_fs.h |    1 +
 net/sunrpc/rpc_pipe.c              |   51 +++++++++++++++++++++++------------
 6 files changed, 40 insertions(+), 24 deletions(-)

diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 63e3b54..118952d 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -838,7 +838,7 @@ static int nfs_init_server(struct nfs_server *server,
 
 	/* Allocate or find a client reference we can use */
 	clp = nfs_get_client(&cl_init);
-	mntput(cl_init.rpcmount);
+	put_rpc_pipefs(cl_init.rpcmount);
 	if (IS_ERR(clp)) {
 		dprintk("<-- nfs_init_server() = error %ld\n", PTR_ERR(clp));
 		return PTR_ERR(clp);
@@ -1528,7 +1528,7 @@ static int nfs4_init_server(struct nfs_server *server,
 			&timeparms,
 			data->minorversion,
 			rpcmount);
-	mntput(rpcmount);
+	put_rpc_pipefs(rpcmount);
 	if (error < 0)
 		goto error;
 
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index be4852b..148843e 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -1668,7 +1668,7 @@ static int nfs_try_mount(struct nfs_parsed_mount_data *args,
 	 * to a file handle.
 	 */
 	status = nfs_mount(&request);
-	mntput(request.rpcmount);
+	put_rpc_pipefs(request.rpcmount);
 	if (status != 0) {
 		dfprintk(MOUNT, "NFS: unable to mount server %s, error %d\n",
 				request.hostname, status);
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 3048988..8c2ba1a 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -670,7 +670,7 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c
 		return PTR_ERR(args.rpcmount);
 	/* Create RPC client */
 	client = rpc_create(&args);
-	mntput(args.rpcmount);
+	put_rpc_pipefs(args.rpcmount);
 	if (IS_ERR(client)) {
 		dprintk("NFSD: couldn't create callback client: %ld\n",
 			PTR_ERR(client));
diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
index a10b1439..7d03e37 100644
--- a/fs/nfsd/nfssvc.c
+++ b/fs/nfsd/nfssvc.c
@@ -227,7 +227,7 @@ static int nfsd_startup(unsigned short port, int nrservs)
 		goto out_racache;
 	}
 	ret = lockd_up(rpcmount);
-	mntput(rpcmount);
+	put_rpc_pipefs(rpcmount);
 	if (ret)
 		goto out_racache;
 	ret = nfs4_state_start();
@@ -346,7 +346,7 @@ int nfsd_create_serv(void)
 	nfsd_serv = svc_create_pooled(&nfsd_program, rpcmount,
 				      nfsd_max_blksize, nfsd_last_thread, nfsd,
 				      THIS_MODULE);
-	mntput(rpcmount);
+	put_rpc_pipefs(rpcmount);
 	if (nfsd_serv == NULL)
 		return -ENOMEM;
 
diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h
index a0b9c46..328b3da 100644
--- a/include/linux/sunrpc/rpc_pipe_fs.h
+++ b/include/linux/sunrpc/rpc_pipe_fs.h
@@ -45,6 +45,7 @@ RPC_I(struct inode *inode)
 }
 
 extern struct vfsmount *get_rpc_pipefs(const char *path);
+extern void put_rpc_pipefs(struct vfsmount *rpcmount);
 extern int rpc_pipefs_add_destroy_cb(struct super_block *sb,
 		void (*destroy_cb)(void *data), void *data);
 
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 7c16261..55ef327 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -33,6 +33,7 @@
 #include <linux/sunrpc/cache.h>
 
 struct vfsmount *init_rpc_pipefs __read_mostly;
+static int init_rpc_pipefs_count;
 
 static struct file_system_type rpc_pipe_fs_type;
 
@@ -1005,22 +1006,35 @@ static int check_rpc_pipefs(struct vfsmount *mnt, void *arg)
 	return 1;
 }
 
-struct vfsmount *get_rpc_pipefs(const char *p)
+static struct vfsmount *find_rpc_pipefs(void)
 {
-	int error;
 	struct vfsmount *rpcmount = ERR_PTR(-EINVAL);
-	struct path path;
+	int err;
 
-	if (!p) {
-		iterate_mounts(check_rpc_pipefs, &rpcmount,
-				current->nsproxy->mnt_ns->root);
+	iterate_mounts(check_rpc_pipefs, &rpcmount,
+			current->nsproxy->mnt_ns->root);
 
-		if (IS_ERR(rpcmount) && (current->nsproxy->mnt_ns ==
-					init_task.nsproxy->mnt_ns))
-			return mntget(init_rpc_pipefs);
+	if (!IS_ERR(rpcmount))
+		return rpcmount;
 
+	if (current->nsproxy->mnt_ns != init_task.nsproxy->mnt_ns)
 		return rpcmount;
-	}
+
+	err = simple_pin_fs(&rpc_pipe_fs_type, &init_rpc_pipefs,
+			&init_rpc_pipefs_count);
+	if (err)
+		return ERR_PTR(err);
+	return init_rpc_pipefs;
+}
+
+struct vfsmount *get_rpc_pipefs(const char *p)
+{
+	int error;
+	struct vfsmount *rpcmount = ERR_PTR(-EINVAL);
+	struct path path;
+
+	if (!p)
+		return find_rpc_pipefs();
 
 	error = kern_path(p, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &path);
 	if (error)
@@ -1033,6 +1047,15 @@ struct vfsmount *get_rpc_pipefs(const char *p)
 }
 EXPORT_SYMBOL_GPL(get_rpc_pipefs);
 
+void put_rpc_pipefs(struct vfsmount *rpcmount)
+{
+	if (rpcmount == init_rpc_pipefs)
+		simple_release_fs(&init_rpc_pipefs, &init_rpc_pipefs_count);
+	else
+		mntput(rpcmount);
+}
+EXPORT_SYMBOL_GPL(put_rpc_pipefs);
+
 struct destroy_cb {
 	struct list_head list;
 	void (*callback)(void *data);
@@ -1232,16 +1255,8 @@ int register_rpc_pipefs(void)
 	if (err)
 		goto destroy_cache;
 
-	init_rpc_pipefs = kern_mount(&rpc_pipe_fs_type);
-	if (IS_ERR(init_rpc_pipefs)) {
-		err = PTR_ERR(init_rpc_pipefs);
-		goto unregister_fs;
-	}
-
 	return 0;
 
-unregister_fs:
-	unregister_filesystem(&rpc_pipe_fs_type);
 destroy_cache:
 	kmem_cache_destroy(rpc_inode_cachep);
 	return err;
-- 
1.7.4


  parent reply	other threads:[~2011-02-08 18:42 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-08 18:41 [PATCH v3, RESEND 00/16] make rpc_pipefs be mountable multiple time Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 01/16] sunrpc: mount rpc_pipefs on initialization Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 02/16] sunrpc: introduce init_rpc_pipefs Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 03/16] sunrpc: push init_rpc_pipefs up to rpc_create() callers Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 04/16] sunrpc: tag svc_serv with rpc_pipefs mount point Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 05/16] sunrpc: get rpc_pipefs mount point for svc_serv from callers Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 06/16] lockd: get rpc_pipefs mount point " Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 07/16] sunrpc: get rpc_pipefs mount point for rpcb_create[_local] " Kirill A. Shutemov
2011-02-08 18:41 ` [PATCH v3, RESEND 08/16] sunrpc: tag pipefs field of cache_detail with rpc_pipefs mount point Kirill A. Shutemov
2011-02-08 18:42 ` [PATCH v3, RESEND 09/16] sunrpc: introduce rpc_pipefs_add_destroy_cb() Kirill A. Shutemov
2011-02-08 18:42 ` [PATCH v3, RESEND 10/16] nfs: per-rpc_pipefs dns cache Kirill A. Shutemov
2011-02-08 18:42 ` [PATCH v3, RESEND 11/16] Export iterate_mounts symbol to be able to use from sunrpc module Kirill A. Shutemov
2011-02-08 18:42 ` [PATCH v3, RESEND 12/16] sunrpc: introduce get_rpc_pipefs() Kirill A. Shutemov
2011-02-08 18:42 ` [PATCH v3, RESEND 13/16] nfs: introduce mount option 'rpcmount' Kirill A. Shutemov
2011-02-08 18:42 ` [PATCH v3, RESEND 14/16] sunrpc: make rpc_pipefs be mountable multiple times Kirill A. Shutemov
2011-02-08 18:42 ` [PATCH v3, RESEND 15/16] sunrpc: remove global init_rpc_pipefs Kirill A. Shutemov
2011-02-08 18:42 ` Kirill A. Shutemov [this message]
2011-03-02 17:06 ` [PATCH v3, RESEND 00/16] make rpc_pipefs be mountable multiple time Kirill A. Shutemov
     [not found]   ` <20110302170622.GA4143-oKw7cIdHH8eLwutG50LtGA@public.gmane.org>
2011-04-06  0:55     ` Kirill A. Shutemov

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=1297190527-19925-17-git-send-email-kas@openvz.org \
    --to=kas@openvz.org \
    --cc=Trond.Myklebust@netapp.com \
    --cc=bfields@fieldses.org \
    --cc=containers@lists.linux-foundation.org \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=neilb@suse.de \
    --cc=netdev@vger.kernel.org \
    --cc=rlandley@parallels.com \
    --cc=viro@ZenIV.linux.org.uk \
    --cc=xemul@parallels.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).