Lines Matching refs:call
117 bool afs_cm_incoming_call(struct afs_call *call) in afs_cm_incoming_call() argument
119 _enter("{%u, CB.OP %u}", call->service_id, call->operation_ID); in afs_cm_incoming_call()
121 call->epoch = rxrpc_kernel_get_epoch(call->net->socket, call->rxcall); in afs_cm_incoming_call()
123 switch (call->operation_ID) { in afs_cm_incoming_call()
125 call->type = &afs_SRXCBCallBack; in afs_cm_incoming_call()
128 call->type = &afs_SRXCBInitCallBackState; in afs_cm_incoming_call()
131 call->type = &afs_SRXCBInitCallBackState3; in afs_cm_incoming_call()
134 call->type = &afs_SRXCBProbe; in afs_cm_incoming_call()
137 call->type = &afs_SRXCBProbeUuid; in afs_cm_incoming_call()
140 call->type = &afs_SRXCBTellMeAboutYourself; in afs_cm_incoming_call()
143 if (call->service_id != YFS_CM_SERVICE) in afs_cm_incoming_call()
145 call->type = &afs_SRXYFSCB_CallBack; in afs_cm_incoming_call()
155 static int afs_record_cm_probe(struct afs_call *call, struct afs_server *server) in afs_record_cm_probe() argument
161 if (server->cm_epoch == call->epoch) in afs_record_cm_probe()
173 server->cm_epoch = call->epoch; in afs_record_cm_probe()
174 server->probe.cm_epoch = call->epoch; in afs_record_cm_probe()
179 call->epoch != server->probe.cm_epoch && in afs_record_cm_probe()
186 if (!server->probe.cm_probed || call->epoch == server->cm_epoch) in afs_record_cm_probe()
199 static int afs_find_cm_server_by_peer(struct afs_call *call) in afs_find_cm_server_by_peer() argument
204 rxrpc_kernel_get_peer(call->net->socket, call->rxcall, &srx); in afs_find_cm_server_by_peer()
206 server = afs_find_server(call->net, &srx); in afs_find_cm_server_by_peer()
208 trace_afs_cm_no_server(call, &srx); in afs_find_cm_server_by_peer()
212 call->server = server; in afs_find_cm_server_by_peer()
213 return afs_record_cm_probe(call, server); in afs_find_cm_server_by_peer()
220 static int afs_find_cm_server_by_uuid(struct afs_call *call, in afs_find_cm_server_by_uuid() argument
226 server = afs_find_server_by_uuid(call->net, call->request); in afs_find_cm_server_by_uuid()
229 trace_afs_cm_no_server_u(call, call->request); in afs_find_cm_server_by_uuid()
233 call->server = server; in afs_find_cm_server_by_uuid()
234 return afs_record_cm_probe(call, server); in afs_find_cm_server_by_uuid()
240 static void afs_cm_destructor(struct afs_call *call) in afs_cm_destructor() argument
242 kfree(call->buffer); in afs_cm_destructor()
243 call->buffer = NULL; in afs_cm_destructor()
251 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_CallBack() local
259 if (call->server) { in SRXAFSCB_CallBack()
260 trace_afs_server(call->server, atomic_read(&call->server->usage), in SRXAFSCB_CallBack()
262 afs_break_callbacks(call->server, call->count, call->request); in SRXAFSCB_CallBack()
265 afs_send_empty_reply(call); in SRXAFSCB_CallBack()
266 afs_put_call(call); in SRXAFSCB_CallBack()
273 static int afs_deliver_cb_callback(struct afs_call *call) in afs_deliver_cb_callback() argument
279 _enter("{%u}", call->unmarshall); in afs_deliver_cb_callback()
281 switch (call->unmarshall) { in afs_deliver_cb_callback()
283 afs_extract_to_tmp(call); in afs_deliver_cb_callback()
284 call->unmarshall++; in afs_deliver_cb_callback()
290 ret = afs_extract_data(call, true); in afs_deliver_cb_callback()
294 call->count = ntohl(call->tmp); in afs_deliver_cb_callback()
295 _debug("FID count: %u", call->count); in afs_deliver_cb_callback()
296 if (call->count > AFSCBMAX) in afs_deliver_cb_callback()
297 return afs_protocol_error(call, -EBADMSG, in afs_deliver_cb_callback()
300 call->buffer = kmalloc(array3_size(call->count, 3, 4), in afs_deliver_cb_callback()
302 if (!call->buffer) in afs_deliver_cb_callback()
304 afs_extract_to_buf(call, call->count * 3 * 4); in afs_deliver_cb_callback()
305 call->unmarshall++; in afs_deliver_cb_callback()
310 ret = afs_extract_data(call, true); in afs_deliver_cb_callback()
315 call->request = kcalloc(call->count, in afs_deliver_cb_callback()
318 if (!call->request) in afs_deliver_cb_callback()
321 cb = call->request; in afs_deliver_cb_callback()
322 bp = call->buffer; in afs_deliver_cb_callback()
323 for (loop = call->count; loop > 0; loop--, cb++) { in afs_deliver_cb_callback()
329 afs_extract_to_tmp(call); in afs_deliver_cb_callback()
330 call->unmarshall++; in afs_deliver_cb_callback()
336 ret = afs_extract_data(call, true); in afs_deliver_cb_callback()
340 call->count2 = ntohl(call->tmp); in afs_deliver_cb_callback()
341 _debug("CB count: %u", call->count2); in afs_deliver_cb_callback()
342 if (call->count2 != call->count && call->count2 != 0) in afs_deliver_cb_callback()
343 return afs_protocol_error(call, -EBADMSG, in afs_deliver_cb_callback()
345 call->_iter = &call->iter; in afs_deliver_cb_callback()
346 iov_iter_discard(&call->iter, READ, call->count2 * 3 * 4); in afs_deliver_cb_callback()
347 call->unmarshall++; in afs_deliver_cb_callback()
352 iov_iter_count(&call->iter), call->count2 * 3 * 4); in afs_deliver_cb_callback()
354 ret = afs_extract_data(call, false); in afs_deliver_cb_callback()
358 call->unmarshall++; in afs_deliver_cb_callback()
363 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_callback()
364 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_callback()
368 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_callback()
376 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_InitCallBackState() local
378 _enter("{%p}", call->server); in SRXAFSCB_InitCallBackState()
380 if (call->server) in SRXAFSCB_InitCallBackState()
381 afs_init_callback_state(call->server); in SRXAFSCB_InitCallBackState()
382 afs_send_empty_reply(call); in SRXAFSCB_InitCallBackState()
383 afs_put_call(call); in SRXAFSCB_InitCallBackState()
390 static int afs_deliver_cb_init_call_back_state(struct afs_call *call) in afs_deliver_cb_init_call_back_state() argument
396 afs_extract_discard(call, 0); in afs_deliver_cb_init_call_back_state()
397 ret = afs_extract_data(call, false); in afs_deliver_cb_init_call_back_state()
403 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_init_call_back_state()
409 static int afs_deliver_cb_init_call_back_state3(struct afs_call *call) in afs_deliver_cb_init_call_back_state3() argument
418 _enter("{%u}", call->unmarshall); in afs_deliver_cb_init_call_back_state3()
420 switch (call->unmarshall) { in afs_deliver_cb_init_call_back_state3()
422 call->buffer = kmalloc_array(11, sizeof(__be32), GFP_KERNEL); in afs_deliver_cb_init_call_back_state3()
423 if (!call->buffer) in afs_deliver_cb_init_call_back_state3()
425 afs_extract_to_buf(call, 11 * sizeof(__be32)); in afs_deliver_cb_init_call_back_state3()
426 call->unmarshall++; in afs_deliver_cb_init_call_back_state3()
431 ret = afs_extract_data(call, false); in afs_deliver_cb_init_call_back_state3()
439 call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL); in afs_deliver_cb_init_call_back_state3()
440 if (!call->request) in afs_deliver_cb_init_call_back_state3()
443 b = call->buffer; in afs_deliver_cb_init_call_back_state3()
444 r = call->request; in afs_deliver_cb_init_call_back_state3()
454 call->unmarshall++; in afs_deliver_cb_init_call_back_state3()
460 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_init_call_back_state3()
461 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_init_call_back_state3()
465 return afs_find_cm_server_by_uuid(call, call->request); in afs_deliver_cb_init_call_back_state3()
473 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_Probe() local
476 afs_send_empty_reply(call); in SRXAFSCB_Probe()
477 afs_put_call(call); in SRXAFSCB_Probe()
484 static int afs_deliver_cb_probe(struct afs_call *call) in afs_deliver_cb_probe() argument
490 afs_extract_discard(call, 0); in afs_deliver_cb_probe()
491 ret = afs_extract_data(call, false); in afs_deliver_cb_probe()
495 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_probe()
496 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_probe()
497 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_probe()
505 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_ProbeUuid() local
506 struct afs_uuid *r = call->request; in SRXAFSCB_ProbeUuid()
510 if (memcmp(r, &call->net->uuid, sizeof(call->net->uuid)) == 0) in SRXAFSCB_ProbeUuid()
511 afs_send_empty_reply(call); in SRXAFSCB_ProbeUuid()
513 rxrpc_kernel_abort_call(call->net->socket, call->rxcall, in SRXAFSCB_ProbeUuid()
516 afs_put_call(call); in SRXAFSCB_ProbeUuid()
523 static int afs_deliver_cb_probe_uuid(struct afs_call *call) in afs_deliver_cb_probe_uuid() argument
530 _enter("{%u}", call->unmarshall); in afs_deliver_cb_probe_uuid()
532 switch (call->unmarshall) { in afs_deliver_cb_probe_uuid()
534 call->buffer = kmalloc_array(11, sizeof(__be32), GFP_KERNEL); in afs_deliver_cb_probe_uuid()
535 if (!call->buffer) in afs_deliver_cb_probe_uuid()
537 afs_extract_to_buf(call, 11 * sizeof(__be32)); in afs_deliver_cb_probe_uuid()
538 call->unmarshall++; in afs_deliver_cb_probe_uuid()
543 ret = afs_extract_data(call, false); in afs_deliver_cb_probe_uuid()
551 call->request = kmalloc(sizeof(struct afs_uuid), GFP_KERNEL); in afs_deliver_cb_probe_uuid()
552 if (!call->request) in afs_deliver_cb_probe_uuid()
555 b = call->buffer; in afs_deliver_cb_probe_uuid()
556 r = call->request; in afs_deliver_cb_probe_uuid()
566 call->unmarshall++; in afs_deliver_cb_probe_uuid()
572 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_probe_uuid()
573 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_probe_uuid()
574 return afs_find_cm_server_by_uuid(call, call->request); in afs_deliver_cb_probe_uuid()
582 struct afs_call *call = container_of(work, struct afs_call, work); in SRXAFSCB_TellMeAboutYourself() local
603 reply.ia.uuid[0] = call->net->uuid.time_low; in SRXAFSCB_TellMeAboutYourself()
604 reply.ia.uuid[1] = htonl(ntohs(call->net->uuid.time_mid)); in SRXAFSCB_TellMeAboutYourself()
605 reply.ia.uuid[2] = htonl(ntohs(call->net->uuid.time_hi_and_version)); in SRXAFSCB_TellMeAboutYourself()
606 reply.ia.uuid[3] = htonl((s8) call->net->uuid.clock_seq_hi_and_reserved); in SRXAFSCB_TellMeAboutYourself()
607 reply.ia.uuid[4] = htonl((s8) call->net->uuid.clock_seq_low); in SRXAFSCB_TellMeAboutYourself()
609 reply.ia.uuid[loop + 5] = htonl((s8) call->net->uuid.node[loop]); in SRXAFSCB_TellMeAboutYourself()
613 afs_send_simple_reply(call, &reply, sizeof(reply)); in SRXAFSCB_TellMeAboutYourself()
614 afs_put_call(call); in SRXAFSCB_TellMeAboutYourself()
621 static int afs_deliver_cb_tell_me_about_yourself(struct afs_call *call) in afs_deliver_cb_tell_me_about_yourself() argument
627 afs_extract_discard(call, 0); in afs_deliver_cb_tell_me_about_yourself()
628 ret = afs_extract_data(call, false); in afs_deliver_cb_tell_me_about_yourself()
632 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_cb_tell_me_about_yourself()
633 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_cb_tell_me_about_yourself()
634 return afs_find_cm_server_by_peer(call); in afs_deliver_cb_tell_me_about_yourself()
640 static int afs_deliver_yfs_cb_callback(struct afs_call *call) in afs_deliver_yfs_cb_callback() argument
647 _enter("{%u}", call->unmarshall); in afs_deliver_yfs_cb_callback()
649 switch (call->unmarshall) { in afs_deliver_yfs_cb_callback()
651 afs_extract_to_tmp(call); in afs_deliver_yfs_cb_callback()
652 call->unmarshall++; in afs_deliver_yfs_cb_callback()
658 ret = afs_extract_data(call, true); in afs_deliver_yfs_cb_callback()
662 call->count = ntohl(call->tmp); in afs_deliver_yfs_cb_callback()
663 _debug("FID count: %u", call->count); in afs_deliver_yfs_cb_callback()
664 if (call->count > YFSCBMAX) in afs_deliver_yfs_cb_callback()
665 return afs_protocol_error(call, -EBADMSG, in afs_deliver_yfs_cb_callback()
668 size = array_size(call->count, sizeof(struct yfs_xdr_YFSFid)); in afs_deliver_yfs_cb_callback()
669 call->buffer = kmalloc(size, GFP_KERNEL); in afs_deliver_yfs_cb_callback()
670 if (!call->buffer) in afs_deliver_yfs_cb_callback()
672 afs_extract_to_buf(call, size); in afs_deliver_yfs_cb_callback()
673 call->unmarshall++; in afs_deliver_yfs_cb_callback()
678 ret = afs_extract_data(call, false); in afs_deliver_yfs_cb_callback()
683 call->request = kcalloc(call->count, in afs_deliver_yfs_cb_callback()
686 if (!call->request) in afs_deliver_yfs_cb_callback()
689 cb = call->request; in afs_deliver_yfs_cb_callback()
690 bp = call->buffer; in afs_deliver_yfs_cb_callback()
691 for (loop = call->count; loop > 0; loop--, cb++) { in afs_deliver_yfs_cb_callback()
699 afs_extract_to_tmp(call); in afs_deliver_yfs_cb_callback()
700 call->unmarshall++; in afs_deliver_yfs_cb_callback()
706 if (!afs_check_call_state(call, AFS_CALL_SV_REPLYING)) in afs_deliver_yfs_cb_callback()
707 return afs_io_error(call, afs_io_error_cm_reply); in afs_deliver_yfs_cb_callback()
712 return afs_find_cm_server_by_peer(call); in afs_deliver_yfs_cb_callback()