Lines Matching refs:call

63 	struct afs_call *call = container_of(work, struct afs_call, async_work);  in afs_async_workfn()  local
65 call->async_workfn(call); in afs_async_workfn()
177 static void afs_free_call(struct afs_call *call) in afs_free_call() argument
180 call, call->type->name, atomic_read(&afs_outstanding_calls)); in afs_free_call()
184 ASSERTCMP(call->rxcall, ==, NULL); in afs_free_call()
185 ASSERT(!work_pending(&call->async_work)); in afs_free_call()
186 ASSERT(skb_queue_empty(&call->rx_queue)); in afs_free_call()
187 ASSERT(call->type->name != NULL); in afs_free_call()
189 kfree(call->request); in afs_free_call()
190 kfree(call); in afs_free_call()
196 static void afs_end_call_nofree(struct afs_call *call) in afs_end_call_nofree() argument
198 if (call->rxcall) { in afs_end_call_nofree()
199 rxrpc_kernel_end_call(call->rxcall); in afs_end_call_nofree()
200 call->rxcall = NULL; in afs_end_call_nofree()
202 if (call->type->destructor) in afs_end_call_nofree()
203 call->type->destructor(call); in afs_end_call_nofree()
209 static void afs_end_call(struct afs_call *call) in afs_end_call() argument
211 afs_end_call_nofree(call); in afs_end_call()
212 afs_free_call(call); in afs_end_call()
221 struct afs_call *call; in afs_alloc_flat_call() local
223 call = kzalloc(sizeof(*call), GFP_NOFS); in afs_alloc_flat_call()
224 if (!call) in afs_alloc_flat_call()
228 call, type->name, atomic_read(&afs_outstanding_calls)); in afs_alloc_flat_call()
231 call->type = type; in afs_alloc_flat_call()
232 call->request_size = request_size; in afs_alloc_flat_call()
233 call->reply_max = reply_size; in afs_alloc_flat_call()
236 call->request = kmalloc(request_size, GFP_NOFS); in afs_alloc_flat_call()
237 if (!call->request) in afs_alloc_flat_call()
242 call->buffer = kmalloc(reply_size, GFP_NOFS); in afs_alloc_flat_call()
243 if (!call->buffer) in afs_alloc_flat_call()
247 init_waitqueue_head(&call->waitq); in afs_alloc_flat_call()
248 skb_queue_head_init(&call->rx_queue); in afs_alloc_flat_call()
249 return call; in afs_alloc_flat_call()
252 afs_free_call(call); in afs_alloc_flat_call()
260 void afs_flat_call_destructor(struct afs_call *call) in afs_flat_call_destructor() argument
264 kfree(call->request); in afs_flat_call_destructor()
265 call->request = NULL; in afs_flat_call_destructor()
266 kfree(call->buffer); in afs_flat_call_destructor()
267 call->buffer = NULL; in afs_flat_call_destructor()
273 static int afs_send_pages(struct afs_call *call, struct msghdr *msg, in afs_send_pages() argument
278 pgoff_t first = call->first, last = call->last; in afs_send_pages()
283 offset = call->first_offset; in afs_send_pages()
284 call->first_offset = 0; in afs_send_pages()
292 n = find_get_pages_contig(call->mapping, first, count, pages); in afs_send_pages()
300 to = call->last_to; in afs_send_pages()
316 call->state = AFS_CALL_AWAIT_REPLY; in afs_send_pages()
317 ret = rxrpc_kernel_send_data(call->rxcall, msg, in afs_send_pages()
338 int afs_make_call(struct in_addr *addr, struct afs_call *call, gfp_t gfp, in afs_make_call() argument
348 _enter("%x,{%d},", addr->s_addr, ntohs(call->port)); in afs_make_call()
350 ASSERT(call->type != NULL); in afs_make_call()
351 ASSERT(call->type->name != NULL); in afs_make_call()
354 call, call->type->name, key_serial(call->key), in afs_make_call()
357 call->wait_mode = wait_mode; in afs_make_call()
358 call->async_workfn = afs_process_async_call; in afs_make_call()
359 INIT_WORK(&call->async_work, afs_async_workfn); in afs_make_call()
363 srx.srx_service = call->service_id; in afs_make_call()
367 srx.transport.sin.sin_port = call->port; in afs_make_call()
371 rxcall = rxrpc_kernel_begin_call(afs_socket, &srx, call->key, in afs_make_call()
372 (unsigned long) call, gfp); in afs_make_call()
373 call->key = NULL; in afs_make_call()
379 call->rxcall = rxcall; in afs_make_call()
382 iov[0].iov_base = call->request; in afs_make_call()
383 iov[0].iov_len = call->request_size; in afs_make_call()
388 call->request_size); in afs_make_call()
391 msg.msg_flags = (call->send_pages ? MSG_MORE : 0); in afs_make_call()
396 if (!call->send_pages) in afs_make_call()
397 call->state = AFS_CALL_AWAIT_REPLY; in afs_make_call()
398 ret = rxrpc_kernel_send_data(rxcall, &msg, call->request_size); in afs_make_call()
402 if (call->send_pages) { in afs_make_call()
403 ret = afs_send_pages(call, &msg, iov); in afs_make_call()
410 return wait_mode->wait(call); in afs_make_call()
414 while ((skb = skb_dequeue(&call->rx_queue))) in afs_make_call()
417 afs_end_call(call); in afs_make_call()
430 struct afs_call *call = (struct afs_call *) user_call_ID; in afs_rx_interceptor() local
432 _enter("%p,,%u", call, skb->mark); in afs_rx_interceptor()
440 if (!call) { in afs_rx_interceptor()
446 skb_queue_tail(&call->rx_queue, skb); in afs_rx_interceptor()
447 call->wait_mode->rx_wakeup(call); in afs_rx_interceptor()
456 static void afs_deliver_to_call(struct afs_call *call) in afs_deliver_to_call() argument
465 while ((call->state == AFS_CALL_AWAIT_REPLY || in afs_deliver_to_call()
466 call->state == AFS_CALL_AWAIT_OP_ID || in afs_deliver_to_call()
467 call->state == AFS_CALL_AWAIT_REQUEST || in afs_deliver_to_call()
468 call->state == AFS_CALL_AWAIT_ACK) && in afs_deliver_to_call()
469 (skb = skb_dequeue(&call->rx_queue))) { in afs_deliver_to_call()
474 ret = call->type->deliver(call, skb, last); in afs_deliver_to_call()
478 call->state == AFS_CALL_AWAIT_REPLY) in afs_deliver_to_call()
479 call->state = AFS_CALL_COMPLETE; in afs_deliver_to_call()
489 if (call->state != AFS_CALL_AWAIT_REPLY) in afs_deliver_to_call()
492 rxrpc_kernel_abort_call(call->rxcall, in afs_deliver_to_call()
494 call->error = ret; in afs_deliver_to_call()
495 call->state = AFS_CALL_ERROR; in afs_deliver_to_call()
503 call->state = AFS_CALL_COMPLETE; in afs_deliver_to_call()
507 call->error = -EBUSY; in afs_deliver_to_call()
508 call->state = AFS_CALL_BUSY; in afs_deliver_to_call()
512 call->error = call->type->abort_to_error(abort_code); in afs_deliver_to_call()
513 call->state = AFS_CALL_ABORTED; in afs_deliver_to_call()
514 _debug("Rcv ABORT %u -> %d", abort_code, call->error); in afs_deliver_to_call()
517 call->error = -rxrpc_kernel_get_error_number(skb); in afs_deliver_to_call()
518 call->state = AFS_CALL_ERROR; in afs_deliver_to_call()
519 _debug("Rcv NET ERROR %d", call->error); in afs_deliver_to_call()
522 call->error = -rxrpc_kernel_get_error_number(skb); in afs_deliver_to_call()
523 call->state = AFS_CALL_ERROR; in afs_deliver_to_call()
524 _debug("Rcv LOCAL ERROR %d", call->error); in afs_deliver_to_call()
536 if (call->state >= AFS_CALL_COMPLETE) { in afs_deliver_to_call()
537 while ((skb = skb_dequeue(&call->rx_queue))) in afs_deliver_to_call()
539 if (call->incoming) in afs_deliver_to_call()
540 afs_end_call(call); in afs_deliver_to_call()
549 static int afs_wait_for_call_to_complete(struct afs_call *call) in afs_wait_for_call_to_complete() argument
558 add_wait_queue(&call->waitq, &myself); in afs_wait_for_call_to_complete()
563 if (!skb_queue_empty(&call->rx_queue)) { in afs_wait_for_call_to_complete()
565 afs_deliver_to_call(call); in afs_wait_for_call_to_complete()
569 ret = call->error; in afs_wait_for_call_to_complete()
570 if (call->state >= AFS_CALL_COMPLETE) in afs_wait_for_call_to_complete()
578 remove_wait_queue(&call->waitq, &myself); in afs_wait_for_call_to_complete()
582 if (call->state < AFS_CALL_COMPLETE) { in afs_wait_for_call_to_complete()
584 rxrpc_kernel_abort_call(call->rxcall, RX_CALL_DEAD); in afs_wait_for_call_to_complete()
585 while ((skb = skb_dequeue(&call->rx_queue))) in afs_wait_for_call_to_complete()
590 afs_end_call(call); in afs_wait_for_call_to_complete()
598 static void afs_wake_up_call_waiter(struct afs_call *call) in afs_wake_up_call_waiter() argument
600 wake_up(&call->waitq); in afs_wake_up_call_waiter()
606 static void afs_wake_up_async_call(struct afs_call *call) in afs_wake_up_async_call() argument
609 queue_work(afs_async_calls, &call->async_work); in afs_wake_up_async_call()
617 static int afs_dont_wait_for_call_to_complete(struct afs_call *call) in afs_dont_wait_for_call_to_complete() argument
626 static void afs_delete_async_call(struct afs_call *call) in afs_delete_async_call() argument
630 afs_free_call(call); in afs_delete_async_call()
640 static void afs_process_async_call(struct afs_call *call) in afs_process_async_call() argument
644 if (!skb_queue_empty(&call->rx_queue)) in afs_process_async_call()
645 afs_deliver_to_call(call); in afs_process_async_call()
647 if (call->state >= AFS_CALL_COMPLETE && call->wait_mode) { in afs_process_async_call()
648 if (call->wait_mode->async_complete) in afs_process_async_call()
649 call->wait_mode->async_complete(call->reply, in afs_process_async_call()
650 call->error); in afs_process_async_call()
651 call->reply = NULL; in afs_process_async_call()
654 afs_end_call_nofree(call); in afs_process_async_call()
658 call->async_workfn = afs_delete_async_call; in afs_process_async_call()
659 queue_work(afs_async_calls, &call->async_work); in afs_process_async_call()
668 void afs_transfer_reply(struct afs_call *call, struct sk_buff *skb) in afs_transfer_reply() argument
672 if (skb_copy_bits(skb, 0, call->buffer + call->reply_size, len) < 0) in afs_transfer_reply()
674 call->reply_size += len; in afs_transfer_reply()
683 struct afs_call *call = NULL; in afs_collect_incoming_call() local
692 if (!call) { in afs_collect_incoming_call()
693 call = kzalloc(sizeof(struct afs_call), GFP_KERNEL); in afs_collect_incoming_call()
694 if (!call) { in afs_collect_incoming_call()
699 call->async_workfn = afs_process_async_call; in afs_collect_incoming_call()
700 INIT_WORK(&call->async_work, afs_async_workfn); in afs_collect_incoming_call()
701 call->wait_mode = &afs_async_incoming_call; in afs_collect_incoming_call()
702 call->type = &afs_RXCMxxxx; in afs_collect_incoming_call()
703 init_waitqueue_head(&call->waitq); in afs_collect_incoming_call()
704 skb_queue_head_init(&call->rx_queue); in afs_collect_incoming_call()
705 call->state = AFS_CALL_AWAIT_OP_ID; in afs_collect_incoming_call()
708 call, call->type->name, in afs_collect_incoming_call()
714 (unsigned long) call); in afs_collect_incoming_call()
716 call->rxcall = rxcall; in afs_collect_incoming_call()
717 call = NULL; in afs_collect_incoming_call()
721 if (call) in afs_collect_incoming_call()
722 afs_free_call(call); in afs_collect_incoming_call()
728 static int afs_deliver_cm_op_id(struct afs_call *call, struct sk_buff *skb, in afs_deliver_cm_op_id() argument
732 void *oibuf = (void *) &call->operation_ID; in afs_deliver_cm_op_id()
734 _enter("{%u},{%zu},%d", call->offset, len, last); in afs_deliver_cm_op_id()
736 ASSERTCMP(call->offset, <, 4); in afs_deliver_cm_op_id()
739 len = min_t(size_t, len, 4 - call->offset); in afs_deliver_cm_op_id()
740 if (skb_copy_bits(skb, 0, oibuf + call->offset, len) < 0) in afs_deliver_cm_op_id()
744 call->offset += len; in afs_deliver_cm_op_id()
746 if (call->offset < 4) { in afs_deliver_cm_op_id()
755 call->state = AFS_CALL_AWAIT_REQUEST; in afs_deliver_cm_op_id()
759 if (!afs_cm_incoming_call(call)) in afs_deliver_cm_op_id()
764 return call->type->deliver(call, skb, last); in afs_deliver_cm_op_id()
770 void afs_send_empty_reply(struct afs_call *call) in afs_send_empty_reply() argument
783 call->state = AFS_CALL_AWAIT_ACK; in afs_send_empty_reply()
784 switch (rxrpc_kernel_send_data(call->rxcall, &msg, 0)) { in afs_send_empty_reply()
791 rxrpc_kernel_abort_call(call->rxcall, RX_USER_ABORT); in afs_send_empty_reply()
793 afs_end_call(call); in afs_send_empty_reply()
802 void afs_send_simple_reply(struct afs_call *call, const void *buf, size_t len) in afs_send_simple_reply() argument
819 call->state = AFS_CALL_AWAIT_ACK; in afs_send_simple_reply()
820 n = rxrpc_kernel_send_data(call->rxcall, &msg, len); in afs_send_simple_reply()
829 rxrpc_kernel_abort_call(call->rxcall, RX_USER_ABORT); in afs_send_simple_reply()
831 afs_end_call(call); in afs_send_simple_reply()
838 int afs_extract_data(struct afs_call *call, struct sk_buff *skb, in afs_extract_data() argument
843 _enter("{%u},{%zu},%d,,%zu", call->offset, len, last, count); in afs_extract_data()
845 ASSERTCMP(call->offset, <, count); in afs_extract_data()
847 len = min_t(size_t, len, count - call->offset); in afs_extract_data()
848 if (skb_copy_bits(skb, 0, buf + call->offset, len) < 0 || in afs_extract_data()
851 call->offset += len; in afs_extract_data()
853 if (call->offset < count) { in afs_extract_data()
855 _leave(" = -EBADMSG [%d < %zu]", call->offset, count); in afs_extract_data()