From: Chris Wright Date: Sat, 3 Feb 2007 02:14:51 +0000 (-0800) Subject: backport sunrpc fix (slipped the cracks) X-Git-Tag: v2.6.19.3~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6f1b5d70210f592e2397160c61cb80c3d97b0309;p=thirdparty%2Fkernel%2Fstable-queue.git backport sunrpc fix (slipped the cracks) --- diff --git a/queue-2.6.19/sunrpc-give-cloned-rpc-clients-their-own-rpc_pipefs-directory.patch b/queue-2.6.19/sunrpc-give-cloned-rpc-clients-their-own-rpc_pipefs-directory.patch index dc519718a3a..dd0688d32f5 100644 --- a/queue-2.6.19/sunrpc-give-cloned-rpc-clients-their-own-rpc_pipefs-directory.patch +++ b/queue-2.6.19/sunrpc-give-cloned-rpc-clients-their-own-rpc_pipefs-directory.patch @@ -17,17 +17,15 @@ The solution is to give each client their own upcall pipe. This fix has been in mainline since 2.6.20-rc1. Signed-off-by: Trond Myklebust +[chrisw: backport to 2.6.19.2] Signed-off-by: Chris Wright --- - include/linux/sunrpc/clnt.h | 1 + - net/sunrpc/clnt.c | 23 +++++++++++++---------- - 2 files changed, 14 insertions(+), 10 deletions(-) + net/sunrpc/clnt.c | 26 +++++++++++++++----------- + 2 files changed, 16 insertions(+), 11 deletions(-) -diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h -index f6d1d64..a1be89d 100644 ---- a/include/linux/sunrpc/clnt.h -+++ b/include/linux/sunrpc/clnt.h +--- linux-2.6.19.2.orig/include/linux/sunrpc/clnt.h ++++ linux-2.6.19.2/include/linux/sunrpc/clnt.h @@ -53,6 +53,7 @@ struct rpc_clnt { struct dentry * cl_dentry; /* inode */ struct rpc_clnt * cl_parent; /* Points to parent of clones */ @@ -36,37 +34,36 @@ index f6d1d64..a1be89d 100644 char cl_inline_name[32]; }; -diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c -index de8bbfc..8b78177 100644 ---- a/net/sunrpc/clnt.c -+++ b/net/sunrpc/clnt.c -@@ -144,6 +144,7 @@ static struct rpc_clnt * rpc_new_client( - err = -ENOMEM; - if (clnt->cl_metrics == NULL) - goto out_no_stats; +--- linux-2.6.19.2.orig/net/sunrpc/clnt.c ++++ linux-2.6.19.2/net/sunrpc/clnt.c +@@ -141,6 +141,7 @@ static struct rpc_clnt * rpc_new_client( + clnt->cl_vers = version->number; + clnt->cl_stats = program->stats; + clnt->cl_metrics = rpc_alloc_iostats(clnt); + clnt->cl_program = program; if (!xprt_bound(clnt->cl_xprt)) clnt->cl_autobind = 1; -@@ -257,6 +258,7 @@ struct rpc_clnt * +@@ -252,6 +253,7 @@ struct rpc_clnt * rpc_clone_client(struct rpc_clnt *clnt) { struct rpc_clnt *new; + int err = -ENOMEM; - new = kmemdup(clnt, sizeof(*new), GFP_KERNEL); + new = kmalloc(sizeof(*new), GFP_KERNEL); if (!new) -@@ -266,6 +268,9 @@ rpc_clone_client(struct rpc_clnt *clnt) - new->cl_metrics = rpc_alloc_iostats(clnt); - if (new->cl_metrics == NULL) - goto out_no_stats; +@@ -259,6 +261,10 @@ rpc_clone_client(struct rpc_clnt *clnt) + memcpy(new, clnt, sizeof(*new)); + atomic_set(&new->cl_count, 1); + atomic_set(&new->cl_users, 0); ++ new->cl_metrics = rpc_alloc_iostats(clnt); + err = rpc_setup_pipedir(new, clnt->cl_program->pipe_dir_name); + if (err != 0) + goto out_no_path; new->cl_parent = clnt; atomic_inc(&clnt->cl_count); new->cl_xprt = xprt_get(clnt->cl_xprt); -@@ -273,17 +278,17 @@ rpc_clone_client(struct rpc_clnt *clnt) +@@ -266,16 +272,16 @@ rpc_clone_client(struct rpc_clnt *clnt) new->cl_autobind = 0; new->cl_oneshot = 0; new->cl_dead = 0; @@ -75,11 +72,11 @@ index de8bbfc..8b78177 100644 rpc_init_rtt(&new->cl_rtt_default, clnt->cl_xprt->timeout.to_initval); if (new->cl_auth) atomic_inc(&new->cl_auth->au_count); +- new->cl_metrics = rpc_alloc_iostats(clnt); return new; +out_no_path: + rpc_free_iostats(new->cl_metrics); - out_no_stats: - kfree(new); ++ kfree(new); out_no_clnt: - printk(KERN_INFO "RPC: out of memory in %s\n", __FUNCTION__); - return ERR_PTR(-ENOMEM); @@ -88,7 +85,7 @@ index de8bbfc..8b78177 100644 } /* -@@ -336,16 +341,14 @@ rpc_destroy_client(struct rpc_clnt *clnt +@@ -328,16 +334,14 @@ rpc_destroy_client(struct rpc_clnt *clnt rpcauth_destroy(clnt->cl_auth); clnt->cl_auth = NULL; }