aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc
diff options
context:
space:
mode:
authorTom Tucker <tom@opengridcomputing.com>2009-01-05 12:12:52 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-01-07 15:40:45 -0500
commit2779e3ae39645515cb6c1126634f47c28c9e7190 (patch)
treee7904837510ba41552a11ebd21caaaf336281462 /net/sunrpc
parentf05ef8db1abe68e3f6fc272efee51bc54ce528c5 (diff)
svc: Move kfree of deferral record to common code
The rqstp structure has a pointer to a svc_deferred_req record that is allocated when requests are deferred. This record is common to all transports and can be freed in common code. Move the kfree of the rq_deferred to the common svc_xprt_release function. This also fixes a memory leak in the RDMA transport which does not kfree the dr structure in it's version of the xpo_release_rqst callback. Signed-off-by: Tom Tucker <tom@opengridcomputing.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'net/sunrpc')
-rw-r--r--net/sunrpc/svc_xprt.c3
-rw-r--r--net/sunrpc/svcsock.c5
2 files changed, 3 insertions, 5 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index 3fe4f1004278..29619612b9f1 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -448,6 +448,9 @@ static void svc_xprt_release(struct svc_rqst *rqstp)
448 448
449 rqstp->rq_xprt->xpt_ops->xpo_release_rqst(rqstp); 449 rqstp->rq_xprt->xpt_ops->xpo_release_rqst(rqstp);
450 450
451 kfree(rqstp->rq_deferred);
452 rqstp->rq_deferred = NULL;
453
451 svc_free_res_pages(rqstp); 454 svc_free_res_pages(rqstp);
452 rqstp->rq_res.page_len = 0; 455 rqstp->rq_res.page_len = 0;
453 rqstp->rq_res.page_base = 0; 456 rqstp->rq_res.page_base = 0;
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index cccfa7deb9af..3c103404501d 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -103,7 +103,6 @@ static void svc_reclassify_socket(struct socket *sock)
103static void svc_release_skb(struct svc_rqst *rqstp) 103static void svc_release_skb(struct svc_rqst *rqstp)
104{ 104{
105 struct sk_buff *skb = rqstp->rq_xprt_ctxt; 105 struct sk_buff *skb = rqstp->rq_xprt_ctxt;
106 struct svc_deferred_req *dr = rqstp->rq_deferred;
107 106
108 if (skb) { 107 if (skb) {
109 struct svc_sock *svsk = 108 struct svc_sock *svsk =
@@ -113,10 +112,6 @@ static void svc_release_skb(struct svc_rqst *rqstp)
113 dprintk("svc: service %p, releasing skb %p\n", rqstp, skb); 112 dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
114 skb_free_datagram(svsk->sk_sk, skb); 113 skb_free_datagram(svsk->sk_sk, skb);
115 } 114 }
116 if (dr) {
117 rqstp->rq_deferred = NULL;
118 kfree(dr);
119 }
120} 115}
121 116
122union svc_pktinfo_u { 117union svc_pktinfo_u {