12 #include <linux/slab.h>
19 static struct socket *afs_socket;
21 static atomic_t afs_outstanding_calls;
22 static atomic_t afs_outstanding_skbs;
24 static void afs_wake_up_call_waiter(
struct afs_call *);
25 static int afs_wait_for_call_to_complete(
struct afs_call *);
26 static void afs_wake_up_async_call(
struct afs_call *);
27 static int afs_dont_wait_for_call_to_complete(
struct afs_call *);
28 static void afs_process_async_call(
struct work_struct *);
29 static void afs_rx_interceptor(
struct sock *,
unsigned long,
struct sk_buff *);
30 static int afs_deliver_cm_op_id(
struct afs_call *,
struct sk_buff *,
bool);
34 .rx_wakeup = afs_wake_up_call_waiter,
35 .wait = afs_wait_for_call_to_complete,
40 .rx_wakeup = afs_wake_up_async_call,
41 .wait = afs_dont_wait_for_call_to_complete,
46 .rx_wakeup = afs_wake_up_async_call,
52 .deliver = afs_deliver_cm_op_id,
56 static void afs_collect_incoming_call(
struct work_struct *);
59 static DECLARE_WORK(afs_collect_incoming_call_work, afs_collect_incoming_call);
73 skb_queue_head_init(&afs_incoming_calls);
76 if (!afs_async_calls) {
84 _leave(
" = %d [socket]", ret);
104 _leave(
" = %d [bind]", ret);
136 static void afs_data_delivered(
struct sk_buff *
skb)
142 _debug(
"DLVR %p{%u} [%d]",
153 static void afs_free_skb(
struct sk_buff *skb)
159 _debug(
"FREE %p{%u} [%d]",
170 static void afs_free_call(
struct afs_call *call)
172 _debug(
"DONE %p{%s} [%d]",
194 call = kzalloc(
sizeof(*call),
GFP_NOFS);
198 _debug(
"CALL %p{%s} [%d]",
219 skb_queue_head_init(&call->
rx_queue);
258 _debug(
"attach %lx-%lx", first, last);
260 count =
last - first + 1;
270 if (first + loop >= last)
279 offset, to, msg->
msg_flags ?
" [more]" :
"");
286 if (first + loop >= last)
287 call->
state = AFS_CALL_AWAIT_REPLY;
293 }
while (++loop < count);
296 for (loop = 0; loop <
count; loop++)
300 }
while (first <= last);
324 _debug(
"____MAKE %p{%s,%x} [%d]____",
325 call, call->
type->name, key_serial(call->
key),
331 memset(&srx, 0,
sizeof(srx));
342 (
unsigned long) call, gfp);
344 if (IS_ERR(rxcall)) {
345 ret = PTR_ERR(rxcall);
346 goto error_kill_call;
349 call->rxcall = rxcall;
353 iov[0].
iov_len = call->request_size;
366 if (!call->send_pages)
367 call->state = AFS_CALL_AWAIT_REPLY;
372 if (call->send_pages) {
373 ret = afs_send_pages(call, &msg, iov);
380 return wait_mode->
wait(call);
389 call->type->destructor(call);
400 static void afs_rx_interceptor(
struct sock *
sk,
unsigned long user_call_ID,
407 _debug(
"ICPT %p{%u} [%d]",
429 static void afs_deliver_to_call(
struct afs_call *call)
438 while ((call->
state == AFS_CALL_AWAIT_REPLY ||
439 call->
state == AFS_CALL_AWAIT_OP_ID ||
440 call->
state == AFS_CALL_AWAIT_REQUEST ||
441 call->
state == AFS_CALL_AWAIT_ACK) &&
447 ret = call->
type->deliver(call, skb, last);
451 call->
state == AFS_CALL_AWAIT_REPLY)
452 call->
state = AFS_CALL_COMPLETE;
462 if (call->
state != AFS_CALL_AWAIT_REPLY)
468 call->
state = AFS_CALL_ERROR;
471 afs_data_delivered(skb);
476 call->
state = AFS_CALL_COMPLETE;
481 call->
state = AFS_CALL_BUSY;
485 call->
error = call->
type->abort_to_error(abort_code);
486 call->
state = AFS_CALL_ABORTED;
487 _debug(
"Rcv ABORT %u -> %d", abort_code, call->
error);
491 call->
state = AFS_CALL_ERROR;
496 call->
state = AFS_CALL_ERROR;
509 if (call->
state >= AFS_CALL_COMPLETE) {
515 call->
type->destructor(call);
526 static int afs_wait_for_call_to_complete(
struct afs_call *call)
540 if (!skb_queue_empty(&call->
rx_queue)) {
542 afs_deliver_to_call(call);
547 if (call->
state >= AFS_CALL_COMPLETE)
559 if (call->
state < AFS_CALL_COMPLETE) {
560 _debug(
"call incomplete");
569 call->
type->destructor(call);
578 static void afs_wake_up_call_waiter(
struct afs_call *call)
586 static void afs_wake_up_async_call(
struct afs_call *call)
597 static int afs_dont_wait_for_call_to_complete(
struct afs_call *call)
630 if (!skb_queue_empty(&call->
rx_queue))
631 afs_deliver_to_call(call);
642 if (call->
type->destructor)
643 call->
type->destructor(call);
669 static void afs_collect_incoming_call(
struct work_struct *work)
689 call->
wait_mode = &afs_async_incoming_call;
690 call->
type = &afs_RXCMxxxx;
692 skb_queue_head_init(&call->
rx_queue);
693 call->
state = AFS_CALL_AWAIT_OP_ID;
695 _debug(
"CALL %p{%s} [%d]",
696 call, call->
type->name,
702 (
unsigned long) call);
703 if (!IS_ERR(rxcall)) {
716 static int afs_deliver_cm_op_id(
struct afs_call *call,
struct sk_buff *skb,
730 if (!pskb_pull(skb, len))
736 _leave(
" = -EBADMSG [op ID short]");
739 _leave(
" = 0 [incomplete]");
743 call->
state = AFS_CALL_AWAIT_REQUEST;
752 return call->
type->deliver(call, skb, last);
775 call->
state = AFS_CALL_AWAIT_ACK;
787 call->
type->destructor(call);
815 call->
state = AFS_CALL_AWAIT_ACK;
827 call->
type->destructor(call);
836 bool last,
void *
buf,
size_t count)
838 size_t len = skb->
len;
840 _enter(
"{%u},{%zu},%d,,%zu", call->
offset, len, last, count);
846 !pskb_pull(skb, len))
850 if (call->
offset < count) {