Lines Matching refs:gss_msg

282 gss_release_msg(struct gss_upcall_msg *gss_msg)  in gss_release_msg()  argument
284 struct net *net = gss_msg->auth->net; in gss_release_msg()
285 if (!refcount_dec_and_test(&gss_msg->count)) in gss_release_msg()
288 BUG_ON(!list_empty(&gss_msg->list)); in gss_release_msg()
289 if (gss_msg->ctx != NULL) in gss_release_msg()
290 gss_put_ctx(gss_msg->ctx); in gss_release_msg()
291 rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue); in gss_release_msg()
292 gss_put_auth(gss_msg->auth); in gss_release_msg()
293 kfree_const(gss_msg->service_name); in gss_release_msg()
294 kfree(gss_msg); in gss_release_msg()
317 gss_add_msg(struct gss_upcall_msg *gss_msg) in gss_add_msg() argument
319 struct rpc_pipe *pipe = gss_msg->pipe; in gss_add_msg()
323 old = __gss_find_upcall(pipe, gss_msg->uid, gss_msg->auth); in gss_add_msg()
325 refcount_inc(&gss_msg->count); in gss_add_msg()
326 list_add(&gss_msg->list, &pipe->in_downcall); in gss_add_msg()
328 gss_msg = old; in gss_add_msg()
330 return gss_msg; in gss_add_msg()
334 __gss_unhash_msg(struct gss_upcall_msg *gss_msg) in __gss_unhash_msg() argument
336 list_del_init(&gss_msg->list); in __gss_unhash_msg()
337 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in __gss_unhash_msg()
338 wake_up_all(&gss_msg->waitqueue); in __gss_unhash_msg()
339 refcount_dec(&gss_msg->count); in __gss_unhash_msg()
343 gss_unhash_msg(struct gss_upcall_msg *gss_msg) in gss_unhash_msg() argument
345 struct rpc_pipe *pipe = gss_msg->pipe; in gss_unhash_msg()
347 if (list_empty(&gss_msg->list)) in gss_unhash_msg()
350 if (!list_empty(&gss_msg->list)) in gss_unhash_msg()
351 __gss_unhash_msg(gss_msg); in gss_unhash_msg()
356 gss_handle_downcall_result(struct gss_cred *gss_cred, struct gss_upcall_msg *gss_msg) in gss_handle_downcall_result() argument
358 switch (gss_msg->msg.errno) { in gss_handle_downcall_result()
360 if (gss_msg->ctx == NULL) in gss_handle_downcall_result()
363 gss_cred_set_ctx(&gss_cred->gc_base, gss_msg->ctx); in gss_handle_downcall_result()
370 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in gss_handle_downcall_result()
378 struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; in gss_upcall_callback() local
379 struct rpc_pipe *pipe = gss_msg->pipe; in gss_upcall_callback()
382 gss_handle_downcall_result(gss_cred, gss_msg); in gss_upcall_callback()
384 task->tk_status = gss_msg->msg.errno; in gss_upcall_callback()
385 gss_release_msg(gss_msg); in gss_upcall_callback()
388 static void gss_encode_v0_msg(struct gss_upcall_msg *gss_msg, in gss_encode_v0_msg() argument
393 uid_t uid = from_kuid_munged(userns, gss_msg->uid); in gss_encode_v0_msg()
394 memcpy(gss_msg->databuf, &uid, sizeof(uid)); in gss_encode_v0_msg()
395 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v0_msg()
396 gss_msg->msg.len = sizeof(uid); in gss_encode_v0_msg()
398 BUILD_BUG_ON(sizeof(uid) > sizeof(gss_msg->databuf)); in gss_encode_v0_msg()
405 struct gss_upcall_msg *gss_msg = container_of(msg, in gss_v0_upcall() local
409 gss_encode_v0_msg(gss_msg, file->f_cred); in gss_v0_upcall()
413 static int gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, in gss_encode_v1_msg() argument
419 struct gss_api_mech *mech = gss_msg->auth->mech; in gss_encode_v1_msg()
420 char *p = gss_msg->databuf; in gss_encode_v1_msg()
421 size_t buflen = sizeof(gss_msg->databuf); in gss_encode_v1_msg()
425 from_kuid_munged(userns, gss_msg->uid)); in gss_encode_v1_msg()
428 gss_msg->msg.len = len; in gss_encode_v1_msg()
438 gss_msg->msg.len += len; in gss_encode_v1_msg()
464 gss_msg->msg.len += len; in gss_encode_v1_msg()
472 gss_msg->msg.len += len; in gss_encode_v1_msg()
474 trace_rpcgss_upcall_msg(gss_msg->databuf); in gss_encode_v1_msg()
478 gss_msg->msg.len += len; in gss_encode_v1_msg()
479 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v1_msg()
490 struct gss_upcall_msg *gss_msg = container_of(msg, in gss_v1_upcall() local
495 err = gss_encode_v1_msg(gss_msg, in gss_v1_upcall()
496 gss_msg->service_name, in gss_v1_upcall()
497 gss_msg->auth->target_name, in gss_v1_upcall()
509 struct gss_upcall_msg *gss_msg; in gss_alloc_msg() local
513 gss_msg = kzalloc(sizeof(*gss_msg), GFP_NOFS); in gss_alloc_msg()
514 if (gss_msg == NULL) in gss_alloc_msg()
520 gss_msg->pipe = gss_auth->gss_pipe[vers]->pipe; in gss_alloc_msg()
521 INIT_LIST_HEAD(&gss_msg->list); in gss_alloc_msg()
522 rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); in gss_alloc_msg()
523 init_waitqueue_head(&gss_msg->waitqueue); in gss_alloc_msg()
524 refcount_set(&gss_msg->count, 1); in gss_alloc_msg()
525 gss_msg->uid = uid; in gss_alloc_msg()
526 gss_msg->auth = gss_auth; in gss_alloc_msg()
529 gss_msg->service_name = kstrdup_const(service_name, GFP_NOFS); in gss_alloc_msg()
530 if (!gss_msg->service_name) { in gss_alloc_msg()
535 return gss_msg; in gss_alloc_msg()
539 kfree(gss_msg); in gss_alloc_msg()
549 struct gss_upcall_msg *gss_new, *gss_msg; in gss_setup_upcall() local
555 gss_msg = gss_add_msg(gss_new); in gss_setup_upcall()
556 if (gss_msg == gss_new) { in gss_setup_upcall()
558 refcount_inc(&gss_msg->count); in gss_setup_upcall()
562 refcount_dec(&gss_msg->count); in gss_setup_upcall()
564 gss_msg = ERR_PTR(res); in gss_setup_upcall()
568 return gss_msg; in gss_setup_upcall()
584 struct gss_upcall_msg *gss_msg; in gss_refresh_upcall() local
588 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_refresh_upcall()
589 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_refresh_upcall()
598 if (IS_ERR(gss_msg)) { in gss_refresh_upcall()
599 err = PTR_ERR(gss_msg); in gss_refresh_upcall()
602 pipe = gss_msg->pipe; in gss_refresh_upcall()
606 else if (gss_msg->ctx == NULL && gss_msg->msg.errno >= 0) { in gss_refresh_upcall()
607 gss_cred->gc_upcall = gss_msg; in gss_refresh_upcall()
609 refcount_inc(&gss_msg->count); in gss_refresh_upcall()
610 rpc_sleep_on(&gss_msg->rpc_waitqueue, task, gss_upcall_callback); in gss_refresh_upcall()
612 gss_handle_downcall_result(gss_cred, gss_msg); in gss_refresh_upcall()
613 err = gss_msg->msg.errno; in gss_refresh_upcall()
616 gss_release_msg(gss_msg); in gss_refresh_upcall()
630 struct gss_upcall_msg *gss_msg; in gss_create_upcall() local
642 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_create_upcall()
643 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_create_upcall()
654 if (IS_ERR(gss_msg)) { in gss_create_upcall()
655 err = PTR_ERR(gss_msg); in gss_create_upcall()
658 pipe = gss_msg->pipe; in gss_create_upcall()
660 prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE); in gss_create_upcall()
662 if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) { in gss_create_upcall()
672 if (gss_msg->ctx) { in gss_create_upcall()
674 gss_cred_set_ctx(cred, gss_msg->ctx); in gss_create_upcall()
676 err = gss_msg->msg.errno; in gss_create_upcall()
680 finish_wait(&gss_msg->waitqueue, &wait); in gss_create_upcall()
681 gss_release_msg(gss_msg); in gss_create_upcall()
695 struct gss_upcall_msg *gss_msg; in gss_pipe_downcall() local
734 gss_msg = __gss_find_upcall(pipe, uid, NULL); in gss_pipe_downcall()
735 if (gss_msg == NULL) { in gss_pipe_downcall()
739 list_del_init(&gss_msg->list); in gss_pipe_downcall()
742 p = gss_fill_context(p, end, ctx, gss_msg->auth->mech); in gss_pipe_downcall()
748 gss_msg->msg.errno = err; in gss_pipe_downcall()
755 gss_msg->msg.errno = -EAGAIN; in gss_pipe_downcall()
760 gss_msg->msg.errno = -EIO; in gss_pipe_downcall()
764 gss_msg->ctx = gss_get_ctx(ctx); in gss_pipe_downcall()
769 __gss_unhash_msg(gss_msg); in gss_pipe_downcall()
771 gss_release_msg(gss_msg); in gss_pipe_downcall()
819 struct gss_upcall_msg *gss_msg; in gss_pipe_release() local
823 list_for_each_entry(gss_msg, &pipe->in_downcall, list) { in gss_pipe_release()
825 if (!list_empty(&gss_msg->msg.list)) in gss_pipe_release()
827 gss_msg->msg.errno = -EPIPE; in gss_pipe_release()
828 refcount_inc(&gss_msg->count); in gss_pipe_release()
829 __gss_unhash_msg(gss_msg); in gss_pipe_release()
831 gss_release_msg(gss_msg); in gss_pipe_release()
842 struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg); in gss_pipe_destroy_msg() local
845 refcount_inc(&gss_msg->count); in gss_pipe_destroy_msg()
846 gss_unhash_msg(gss_msg); in gss_pipe_destroy_msg()
849 gss_release_msg(gss_msg); in gss_pipe_destroy_msg()
851 gss_release_msg(gss_msg); in gss_pipe_destroy_msg()