+++ /dev/null
-From eeee245268c951262b861bc1be4e9dc812352499 Mon Sep 17 00:00:00 2001
-From: Trond Myklebust <Trond.Myklebust@netapp.com>
-Date: Wed, 10 Jul 2013 15:33:01 -0400
-Subject: SUNRPC: Fix a deadlock in rpc_client_register()
-
-From: Trond Myklebust <Trond.Myklebust@netapp.com>
-
-commit eeee245268c951262b861bc1be4e9dc812352499 upstream.
-
-Commit 384816051ca9125cd54750e59c780c2a2655fa4f (SUNRPC: fix races on
-PipeFS MOUNT notifications) introduces a regression when we call
-rpc_setup_pipedir() with RPCSEC_GSS as the auth flavour.
-
-By calling rpcauth_create() while holding the sn->pipefs_sb_lock, we
-end up deadlocking in gss_pipes_dentries_create_net().
-Fix is to register the client and release the mutex before calling
-rpcauth_create().
-
-Reported-by: Weston Andros Adamson <dros@netapp.com>
-Tested-by: Weston Andros Adamson <dros@netapp.com>
-Cc: Stanislav Kinsbursky <skinsbursky@parallels.com>
-Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- net/sunrpc/clnt.c | 16 +++++++++-------
- 1 file changed, 9 insertions(+), 7 deletions(-)
-
---- a/net/sunrpc/clnt.c
-+++ b/net/sunrpc/clnt.c
-@@ -288,7 +288,7 @@ static int rpc_client_register(const str
- struct rpc_auth *auth;
- struct net *net = rpc_net_ns(clnt);
- struct super_block *pipefs_sb;
-- int err = 0;
-+ int err;
-
- pipefs_sb = rpc_get_sb_net(net);
- if (pipefs_sb) {
-@@ -297,6 +297,10 @@ static int rpc_client_register(const str
- goto out;
- }
-
-+ rpc_register_client(clnt);
-+ if (pipefs_sb)
-+ rpc_put_sb_net(net);
-+
- auth = rpcauth_create(args->authflavor, clnt);
- if (IS_ERR(auth)) {
- dprintk("RPC: Couldn't create auth handle (flavor %u)\n",
-@@ -304,16 +308,14 @@ static int rpc_client_register(const str
- err = PTR_ERR(auth);
- goto err_auth;
- }
--
-- rpc_register_client(clnt);
-+ return 0;
-+err_auth:
-+ pipefs_sb = rpc_get_sb_net(net);
-+ __rpc_clnt_remove_pipedir(clnt);
- out:
- if (pipefs_sb)
- rpc_put_sb_net(net);
- return err;
--
--err_auth:
-- __rpc_clnt_remove_pipedir(clnt);
-- goto out;
- }
-
- static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt)
+++ /dev/null
-From e73f4cc051199799aee4320f300f28ffb82f3eb1 Mon Sep 17 00:00:00 2001
-From: Stanislav Kinsbursky <skinsbursky@parallels.com>
-Date: Mon, 24 Jun 2013 11:52:52 +0400
-Subject: SUNRPC: split client creation routine into setup and registration
-
-From: Stanislav Kinsbursky <skinsbursky@parallels.com>
-
-commit e73f4cc051199799aee4320f300f28ffb82f3eb1 upstream.
-
-This helper moves all "registration" code to the new rpc_client_register()
-helper.
-This helper will be used later in the series to synchronize against PipeFS
-MOUNT/UMOUNT events.
-
-Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
-Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- net/sunrpc/clnt.c | 64 ++++++++++++++++++++++++++++++++----------------------
- 1 file changed, 39 insertions(+), 25 deletions(-)
-
---- a/net/sunrpc/clnt.c
-+++ b/net/sunrpc/clnt.c
-@@ -281,14 +281,47 @@ static void rpc_clnt_set_nodename(struct
- memcpy(clnt->cl_nodename, nodename, clnt->cl_nodelen);
- }
-
-+static int rpc_client_register(const struct rpc_create_args *args,
-+ struct rpc_clnt *clnt)
-+{
-+ const struct rpc_program *program = args->program;
-+ struct rpc_auth *auth;
-+ struct net *net = rpc_net_ns(clnt);
-+ struct super_block *pipefs_sb;
-+ int err = 0;
-+
-+ pipefs_sb = rpc_get_sb_net(net);
-+ if (pipefs_sb) {
-+ err = rpc_setup_pipedir(clnt, program->pipe_dir_name, pipefs_sb);
-+ if (err)
-+ goto out;
-+ }
-+
-+ auth = rpcauth_create(args->authflavor, clnt);
-+ if (IS_ERR(auth)) {
-+ dprintk("RPC: Couldn't create auth handle (flavor %u)\n",
-+ args->authflavor);
-+ err = PTR_ERR(auth);
-+ goto err_auth;
-+ }
-+
-+ rpc_register_client(clnt);
-+out:
-+ if (pipefs_sb)
-+ rpc_put_sb_net(net);
-+ return err;
-+
-+err_auth:
-+ __rpc_clnt_remove_pipedir(clnt);
-+ goto out;
-+}
-+
- static struct rpc_clnt * rpc_new_client(const struct rpc_create_args *args, struct rpc_xprt *xprt)
- {
- const struct rpc_program *program = args->program;
- const struct rpc_version *version;
- struct rpc_clnt *clnt = NULL;
-- struct rpc_auth *auth;
- int err;
-- struct super_block *pipefs_sb;
-
- /* sanity check the name before trying to print it */
- dprintk("RPC: creating %s client for %s (xprt %p)\n",
-@@ -347,34 +380,15 @@ static struct rpc_clnt * rpc_new_client(
-
- atomic_set(&clnt->cl_count, 1);
-
-- pipefs_sb = rpc_get_sb_net(rpc_net_ns(clnt));
-- if (pipefs_sb) {
-- err = rpc_setup_pipedir(clnt, program->pipe_dir_name, pipefs_sb);
-- if (err)
-- goto out_no_path;
-- }
--
-- auth = rpcauth_create(args->authflavor, clnt);
-- if (IS_ERR(auth)) {
-- dprintk("RPC: Couldn't create auth handle (flavor %u)\n",
-- args->authflavor);
-- err = PTR_ERR(auth);
-- goto out_no_auth;
-- }
--
- /* save the nodename */
- rpc_clnt_set_nodename(clnt, utsname()->nodename);
-- rpc_register_client(clnt);
-- if (pipefs_sb)
-- rpc_put_sb_net(rpc_net_ns(clnt));
-+
-+ err = rpc_client_register(args, clnt);
-+ if (err)
-+ goto out_no_path;
- return clnt;
-
--out_no_auth:
-- if (pipefs_sb)
-- __rpc_clnt_remove_pipedir(clnt);
- out_no_path:
-- if (pipefs_sb)
-- rpc_put_sb_net(rpc_net_ns(clnt));
- kfree(clnt->cl_principal);
- out_no_principal:
- rpc_free_iostats(clnt->cl_metrics);