diff options
Diffstat (limited to 'net/sunrpc/xprt.c')
-rw-r--r-- | net/sunrpc/xprt.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 970fb00f388c..4c8f18aff7c3 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -199,8 +199,6 @@ int xprt_reserve_xprt(struct rpc_task *task) | |||
199 | if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) { | 199 | if (test_and_set_bit(XPRT_LOCKED, &xprt->state)) { |
200 | if (task == xprt->snd_task) | 200 | if (task == xprt->snd_task) |
201 | return 1; | 201 | return 1; |
202 | if (task == NULL) | ||
203 | return 0; | ||
204 | goto out_sleep; | 202 | goto out_sleep; |
205 | } | 203 | } |
206 | xprt->snd_task = task; | 204 | xprt->snd_task = task; |
@@ -757,13 +755,11 @@ static void xprt_connect_status(struct rpc_task *task) | |||
757 | */ | 755 | */ |
758 | struct rpc_rqst *xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid) | 756 | struct rpc_rqst *xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid) |
759 | { | 757 | { |
760 | struct list_head *pos; | 758 | struct rpc_rqst *entry; |
761 | 759 | ||
762 | list_for_each(pos, &xprt->recv) { | 760 | list_for_each_entry(entry, &xprt->recv, rq_list) |
763 | struct rpc_rqst *entry = list_entry(pos, struct rpc_rqst, rq_list); | ||
764 | if (entry->rq_xid == xid) | 761 | if (entry->rq_xid == xid) |
765 | return entry; | 762 | return entry; |
766 | } | ||
767 | 763 | ||
768 | dprintk("RPC: xprt_lookup_rqst did not find xid %08x\n", | 764 | dprintk("RPC: xprt_lookup_rqst did not find xid %08x\n", |
769 | ntohl(xid)); | 765 | ntohl(xid)); |
@@ -962,6 +958,37 @@ static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) | |||
962 | spin_unlock(&xprt->reserve_lock); | 958 | spin_unlock(&xprt->reserve_lock); |
963 | } | 959 | } |
964 | 960 | ||
961 | struct rpc_xprt *xprt_alloc(struct net *net, int size, int max_req) | ||
962 | { | ||
963 | struct rpc_xprt *xprt; | ||
964 | |||
965 | xprt = kzalloc(size, GFP_KERNEL); | ||
966 | if (xprt == NULL) | ||
967 | goto out; | ||
968 | |||
969 | xprt->max_reqs = max_req; | ||
970 | xprt->slot = kcalloc(max_req, sizeof(struct rpc_rqst), GFP_KERNEL); | ||
971 | if (xprt->slot == NULL) | ||
972 | goto out_free; | ||
973 | |||
974 | xprt->xprt_net = get_net(net); | ||
975 | return xprt; | ||
976 | |||
977 | out_free: | ||
978 | kfree(xprt); | ||
979 | out: | ||
980 | return NULL; | ||
981 | } | ||
982 | EXPORT_SYMBOL_GPL(xprt_alloc); | ||
983 | |||
984 | void xprt_free(struct rpc_xprt *xprt) | ||
985 | { | ||
986 | put_net(xprt->xprt_net); | ||
987 | kfree(xprt->slot); | ||
988 | kfree(xprt); | ||
989 | } | ||
990 | EXPORT_SYMBOL_GPL(xprt_free); | ||
991 | |||
965 | /** | 992 | /** |
966 | * xprt_reserve - allocate an RPC request slot | 993 | * xprt_reserve - allocate an RPC request slot |
967 | * @task: RPC task requesting a slot allocation | 994 | * @task: RPC task requesting a slot allocation |