Lines Matching refs:call

108 bool afs_cm_incoming_call(struct afs_call *call)  in afs_cm_incoming_call()  argument
110 _enter("{%u, CB.OP %u}", call->service_id, call->operation_ID); in afs_cm_incoming_call()
112 switch (call->operation_ID) { in afs_cm_incoming_call()
114 call->type = &afs_SRXCBCallBack; in afs_cm_incoming_call()
117 call->type = &afs_SRXCBInitCallBackState; in afs_cm_incoming_call()
120 call->type = &afs_SRXCBInitCallBackState3; in afs_cm_incoming_call()
123 call->type = &afs_SRXCBProbe; in afs_cm_incoming_call()
126 call->type = &afs_SRXCBProbeUuid; in afs_cm_incoming_call()
129 call->type = &afs_SRXCBTellMeAboutYourself; in afs_cm_incoming_call()
132 if (call->service_id != YFS_CM_SERVICE) in afs_cm_incoming_call()
134 call->type = &afs_SRXYFSCB_CallBack; in afs_cm_incoming_call()
145 static int afs_find_cm_server_by_peer(struct afs_call *call) in afs_find_cm_server_by_peer() argument
151 peer = rxrpc_kernel_get_call_peer(call->net->socket, call->rxcall); in afs_find_cm_server_by_peer()
153 server = afs_find_server(call->net, peer); in afs_find_cm_server_by_peer()
155 trace_afs_cm_no_server(call, &srx); in afs_find_cm_server_by_peer()
159 call->server = server; in afs_find_cm_server_by_peer()
167 static int afs_find_cm_server_by_uuid(struct afs_call *call, in afs_find_cm_server_by_uuid() argument
173 server = afs_find_server_by_uuid(call->net, call->request); in afs_find_cm_server_by_uuid()
176 trace_afs_cm_no_server_u(call, call->request); in afs_find_cm_server_by_uuid()
180 call->server = server; in afs_find_cm_server_by_uuid()
187 static void afs_cm_destructor(struct afs_call *call) in afs_cm_destructor() argument
189 kfree(call->buffer); in afs_cm_destructor()
190 call->buffer = NULL; in afs_cm_destructor()
196 static void afs_abort_service_call(struct afs_call *call, u32 abort_code, int error, in afs_abort_service_call() argument
199 rxrpc_kernel_abort_call(call->net->socket, call->rxcall, in afs_abort_service_call()
201 afs_set_call_complete(call, error, 0); in afs_abort_service_call()
209 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_CallBack() local
217 if (call->server) { in SRXAFSCB_CallBack()
218 trace_afs_server(call->server->debug_id, in SRXAFSCB_CallBack()
219 refcount_read(&call->server->ref), in SRXAFSCB_CallBack()
220 atomic_read(&call->server->active), in SRXAFSCB_CallBack()
222 afs_break_callbacks(call->server, call->count, call->request); in SRXAFSCB_CallBack()
225 afs_send_empty_reply(call); in SRXAFSCB_CallBack()
226 afs_put_call(call); in SRXAFSCB_CallBack()
233 static int afs_deliver_cb_callback(struct afs_call *call) in afs_deliver_cb_callback() argument
239 _enter("{%u}", call->unmarshall); in afs_deliver_cb_callback()
241 switch (call->unmarshall) { in afs_deliver_cb_callback()
243 afs_extract_to_tmp(call); in afs_deliver_cb_callback()
244 call->unmarshall++; in afs_deliver_cb_callback()
250 ret = afs_extract_data(call, true); in afs_deliver_cb_callback()
254 call->count = ntohl(call->tmp); in afs_deliver_cb_callback()
255 _debug("FID count: %u", call->count); in afs_deliver_cb_callback()
256 if (call->count > AFSCBMAX) in afs_deliver_cb_callback()
257 return afs_protocol_error(call, afs_eproto_cb_fid_count); in afs_deliver_cb_callback()
259 call->buffer = kmalloc(array3_size(call->count, 3, 4), in afs_deliver_cb_callback()
261 if (!call->buffer) in afs_deliver_cb_callback()
263 afs_extract_to_buf(call, call->count * 3 * 4); in afs_deliver_cb_callback()
264 call->unmarshall++; in afs_deliver_cb_callback()
269 ret = afs_extract_data(call, true); in afs_deliver_cb_callback()
274 call->request = kcalloc(call->count, in afs_deliver_cb_callback()
277 if (!call->request) in afs_deliver_cb_callback()
280 cb = call->request; in afs_deliver_cb_callback()
281 bp = call->buffer; in afs_deliver_cb_callback()
282 for (loop = call->count; loop > 0; loop--, cb++) { in afs_deliver_cb_callback()
288 afs_extract_to_tmp(call); in afs_deliver_cb_callback()
289 call->unmarshall++; in afs_deliver_cb_callback()
295 ret = afs_extract_data(call, true); in afs_deliver_cb_callback()
299 call->count2 = ntohl(call->tmp); in afs_deliver_cb_callback()
300 _debug("CB count: %u", call->count2); in afs_deliver_cb_callback()
301 if (call->count2 != call->count && call->count2 != 0) in afs_deliver_cb_callback()
302 return afs_protocol_error(call, afs_eproto_cb_count); in afs_deliver_cb_callback()
303 call->iter = &call->def_iter; in afs_deliver_cb_callback()
304 iov_iter_discard(&call->def_iter, ITER_DEST, call->count2 * 3 * 4); in afs_deliver_cb_callback()
305 call->unmarshall++; in afs_deliver_cb_callback()
310 iov_iter_count(call->iter), call->count2 * 3 * 4); in afs_deliver_cb_callback()
312 ret = afs_extract_data(call, false); in afs_deliver_cb_callback()
316 call->unmarshall++; in afs_deliver_cb_callback()
323 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_callback()
324 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_callback()
328 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_callback()
336 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_InitCallBackState() local
338 _enter("{%p}", call->server); in SRXAFSCB_InitCallBackState()
340 if (call->server) in SRXAFSCB_InitCallBackState()
341 afs_init_callback_state(call->server); in SRXAFSCB_InitCallBackState()
342 afs_send_empty_reply(call); in SRXAFSCB_InitCallBackState()
343 afs_put_call(call); in SRXAFSCB_InitCallBackState()
350 static int afs_deliver_cb_init_call_back_state(struct afs_call *call) in afs_deliver_cb_init_call_back_state() argument
356 afs_extract_discard(call, 0); in afs_deliver_cb_init_call_back_state()
357 ret = afs_extract_data(call, false); in afs_deliver_cb_init_call_back_state()
363 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_init_call_back_state()
369 static int afs_deliver_cb_init_call_back_state3(struct afs_call *call) in afs_deliver_cb_init_call_back_state3() argument
378 _enter("{%u}", call->unmarshall); in afs_deliver_cb_init_call_back_state3()
380 switch (call->unmarshall) { in afs_deliver_cb_init_call_back_state3()
382 call->buffer = kmalloc_array(11, sizeof(__be32), GFP_KERNEL); in afs_deliver_cb_init_call_back_state3()
383 if (!call->buffer) in afs_deliver_cb_init_call_back_state3()
385 afs_extract_to_buf(call, 11 * sizeof(__be32)); in afs_deliver_cb_init_call_back_state3()
386 call->unmarshall++; in afs_deliver_cb_init_call_back_state3()
391 ret = afs_extract_data(call, false); in afs_deliver_cb_init_call_back_state3()
399 call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL); in afs_deliver_cb_init_call_back_state3()
400 if (!call->request) in afs_deliver_cb_init_call_back_state3()
403 b = call->buffer; in afs_deliver_cb_init_call_back_state3()
404 r = call->request; in afs_deliver_cb_init_call_back_state3()
414 call->unmarshall++; in afs_deliver_cb_init_call_back_state3()
421 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_init_call_back_state3()
422 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_init_call_back_state3()
426 return afs_find_cm_server_by_uuid(call, call->request); in afs_deliver_cb_init_call_back_state3()
434 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_Probe() local
437 afs_send_empty_reply(call); in SRXAFSCB_Probe()
438 afs_put_call(call); in SRXAFSCB_Probe()
445 static int afs_deliver_cb_probe(struct afs_call *call) in afs_deliver_cb_probe() argument
451 afs_extract_discard(call, 0); in afs_deliver_cb_probe()
452 ret = afs_extract_data(call, false); in afs_deliver_cb_probe()
456 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_probe()
457 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_probe()
458 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_probe()
467 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_ProbeUuid() local
468 struct afs_uuid *r = call->request; in SRXAFSCB_ProbeUuid()
472 if (memcmp(r, &call->net->uuid, sizeof(call->net->uuid)) == 0) in SRXAFSCB_ProbeUuid()
473 afs_send_empty_reply(call); in SRXAFSCB_ProbeUuid()
475 afs_abort_service_call(call, 1, 1, afs_abort_probeuuid_negative); in SRXAFSCB_ProbeUuid()
477 afs_put_call(call); in SRXAFSCB_ProbeUuid()
484 static int afs_deliver_cb_probe_uuid(struct afs_call *call) in afs_deliver_cb_probe_uuid() argument
491 _enter("{%u}", call->unmarshall); in afs_deliver_cb_probe_uuid()
493 switch (call->unmarshall) { in afs_deliver_cb_probe_uuid()
495 call->buffer = kmalloc_array(11, sizeof(__be32), GFP_KERNEL); in afs_deliver_cb_probe_uuid()
496 if (!call->buffer) in afs_deliver_cb_probe_uuid()
498 afs_extract_to_buf(call, 11 * sizeof(__be32)); in afs_deliver_cb_probe_uuid()
499 call->unmarshall++; in afs_deliver_cb_probe_uuid()
504 ret = afs_extract_data(call, false); in afs_deliver_cb_probe_uuid()
512 call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL); in afs_deliver_cb_probe_uuid()
513 if (!call->request) in afs_deliver_cb_probe_uuid()
516 b = call->buffer; in afs_deliver_cb_probe_uuid()
517 r = call->request; in afs_deliver_cb_probe_uuid()
527 call->unmarshall++; in afs_deliver_cb_probe_uuid()
534 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_probe_uuid()
535 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_probe_uuid()
536 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_probe_uuid()
544 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_TellMeAboutYourself() local
565 reply.ia.uuid[0] = call->net->uuid.time_low; in SRXAFSCB_TellMeAboutYourself()
566 reply.ia.uuid[1] = htonl(ntohs(call->net->uuid.time_mid)); in SRXAFSCB_TellMeAboutYourself()
567 reply.ia.uuid[2] = htonl(ntohs(call->net->uuid.time_hi_and_version)); in SRXAFSCB_TellMeAboutYourself()
568 reply.ia.uuid[3] = htonl((s8) call->net->uuid.clock_seq_hi_and_reserved); in SRXAFSCB_TellMeAboutYourself()
569 reply.ia.uuid[4] = htonl((s8) call->net->uuid.clock_seq_low); in SRXAFSCB_TellMeAboutYourself()
571 reply.ia.uuid[loop + 5] = htonl((s8) call->net->uuid.node[loop]); in SRXAFSCB_TellMeAboutYourself()
575 afs_send_simple_reply(call, &reply, sizeof(reply)); in SRXAFSCB_TellMeAboutYourself()
576 afs_put_call(call); in SRXAFSCB_TellMeAboutYourself()
583 static int afs_deliver_cb_tell_me_about_yourself(struct afs_call *call) in afs_deliver_cb_tell_me_about_yourself() argument
589 afs_extract_discard(call, 0); in afs_deliver_cb_tell_me_about_yourself()
590 ret = afs_extract_data(call, false); in afs_deliver_cb_tell_me_about_yourself()
594 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_tell_me_about_yourself()
595 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_tell_me_about_yourself()
596 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_tell_me_about_yourself()
602 static int afs_deliver_yfs_cb_callback(struct afs_call *call) in afs_deliver_yfs_cb_callback() argument
609 _enter("{%u}", call->unmarshall); in afs_deliver_yfs_cb_callback()
611 switch (call->unmarshall) { in afs_deliver_yfs_cb_callback()
613 afs_extract_to_tmp(call); in afs_deliver_yfs_cb_callback()
614 call->unmarshall++; in afs_deliver_yfs_cb_callback()
620 ret = afs_extract_data(call, true); in afs_deliver_yfs_cb_callback()
624 call->count = ntohl(call->tmp); in afs_deliver_yfs_cb_callback()
625 _debug("FID count: %u", call->count); in afs_deliver_yfs_cb_callback()
626 if (call->count > YFSCBMAX) in afs_deliver_yfs_cb_callback()
627 return afs_protocol_error(call, afs_eproto_cb_fid_count); in afs_deliver_yfs_cb_callback()
629 size = array_size(call->count, sizeof(struct yfs_xdr_YFSFid)); in afs_deliver_yfs_cb_callback()
630 call->buffer = kmalloc(size, GFP_KERNEL); in afs_deliver_yfs_cb_callback()
631 if (!call->buffer) in afs_deliver_yfs_cb_callback()
633 afs_extract_to_buf(call, size); in afs_deliver_yfs_cb_callback()
634 call->unmarshall++; in afs_deliver_yfs_cb_callback()
639 ret = afs_extract_data(call, false); in afs_deliver_yfs_cb_callback()
644 call->request = kcalloc(call->count, in afs_deliver_yfs_cb_callback()
647 if (!call->request) in afs_deliver_yfs_cb_callback()
650 cb = call->request; in afs_deliver_yfs_cb_callback()
651 bp = call->buffer; in afs_deliver_yfs_cb_callback()
652 for (loop = call->count; loop > 0; loop--, cb++) { in afs_deliver_yfs_cb_callback()
660 afs_extract_to_tmp(call); in afs_deliver_yfs_cb_callback()
661 call->unmarshall++; in afs_deliver_yfs_cb_callback()
668 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_yfs_cb_callback()
669 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_yfs_cb_callback()
674 return afs_find_cm_server_by_peer(call); in afs_deliver_yfs_cb_callback()