Lines Matching refs:gss_msg

333 gss_release_msg(struct gss_upcall_msg *gss_msg)  in gss_release_msg()  argument
335 struct net *net = gss_msg->auth->net; in gss_release_msg()
336 if (!refcount_dec_and_test(&gss_msg->count)) in gss_release_msg()
339 BUG_ON(!list_empty(&gss_msg->list)); in gss_release_msg()
340 if (gss_msg->ctx != NULL) in gss_release_msg()
341 gss_put_ctx(gss_msg->ctx); in gss_release_msg()
342 rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue); in gss_release_msg()
343 gss_put_auth(gss_msg->auth); in gss_release_msg()
344 kfree(gss_msg); in gss_release_msg()
369 gss_add_msg(struct gss_upcall_msg *gss_msg) in gss_add_msg() argument
371 struct rpc_pipe *pipe = gss_msg->pipe; in gss_add_msg()
375 old = __gss_find_upcall(pipe, gss_msg->uid, gss_msg->auth); in gss_add_msg()
377 refcount_inc(&gss_msg->count); in gss_add_msg()
378 list_add(&gss_msg->list, &pipe->in_downcall); in gss_add_msg()
380 gss_msg = old; in gss_add_msg()
382 return gss_msg; in gss_add_msg()
386 __gss_unhash_msg(struct gss_upcall_msg *gss_msg) in __gss_unhash_msg() argument
388 list_del_init(&gss_msg->list); in __gss_unhash_msg()
389 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in __gss_unhash_msg()
390 wake_up_all(&gss_msg->waitqueue); in __gss_unhash_msg()
391 refcount_dec(&gss_msg->count); in __gss_unhash_msg()
395 gss_unhash_msg(struct gss_upcall_msg *gss_msg) in gss_unhash_msg() argument
397 struct rpc_pipe *pipe = gss_msg->pipe; in gss_unhash_msg()
399 if (list_empty(&gss_msg->list)) in gss_unhash_msg()
402 if (!list_empty(&gss_msg->list)) in gss_unhash_msg()
403 __gss_unhash_msg(gss_msg); in gss_unhash_msg()
408 gss_handle_downcall_result(struct gss_cred *gss_cred, struct gss_upcall_msg *gss_msg) in gss_handle_downcall_result() argument
410 switch (gss_msg->msg.errno) { in gss_handle_downcall_result()
412 if (gss_msg->ctx == NULL) in gss_handle_downcall_result()
415 gss_cred_set_ctx(&gss_cred->gc_base, gss_msg->ctx); in gss_handle_downcall_result()
422 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in gss_handle_downcall_result()
430 struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; in gss_upcall_callback() local
431 struct rpc_pipe *pipe = gss_msg->pipe; in gss_upcall_callback()
434 gss_handle_downcall_result(gss_cred, gss_msg); in gss_upcall_callback()
436 task->tk_status = gss_msg->msg.errno; in gss_upcall_callback()
437 gss_release_msg(gss_msg); in gss_upcall_callback()
440 static void gss_encode_v0_msg(struct gss_upcall_msg *gss_msg) in gss_encode_v0_msg() argument
442 uid_t uid = from_kuid(&init_user_ns, gss_msg->uid); in gss_encode_v0_msg()
443 memcpy(gss_msg->databuf, &uid, sizeof(uid)); in gss_encode_v0_msg()
444 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v0_msg()
445 gss_msg->msg.len = sizeof(uid); in gss_encode_v0_msg()
447 BUILD_BUG_ON(sizeof(uid) > sizeof(gss_msg->databuf)); in gss_encode_v0_msg()
450 static int gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, in gss_encode_v1_msg() argument
454 struct gss_api_mech *mech = gss_msg->auth->mech; in gss_encode_v1_msg()
455 char *p = gss_msg->databuf; in gss_encode_v1_msg()
456 size_t buflen = sizeof(gss_msg->databuf); in gss_encode_v1_msg()
460 from_kuid(&init_user_ns, gss_msg->uid)); in gss_encode_v1_msg()
463 gss_msg->msg.len = len; in gss_encode_v1_msg()
473 gss_msg->msg.len += len; in gss_encode_v1_msg()
499 gss_msg->msg.len += len; in gss_encode_v1_msg()
507 gss_msg->msg.len += len; in gss_encode_v1_msg()
512 gss_msg->msg.len += len; in gss_encode_v1_msg()
514 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v1_msg()
525 struct gss_upcall_msg *gss_msg; in gss_alloc_msg() local
529 gss_msg = kzalloc(sizeof(*gss_msg), GFP_NOFS); in gss_alloc_msg()
530 if (gss_msg == NULL) in gss_alloc_msg()
536 gss_msg->pipe = gss_auth->gss_pipe[vers]->pipe; in gss_alloc_msg()
537 INIT_LIST_HEAD(&gss_msg->list); in gss_alloc_msg()
538 rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); in gss_alloc_msg()
539 init_waitqueue_head(&gss_msg->waitqueue); in gss_alloc_msg()
540 refcount_set(&gss_msg->count, 1); in gss_alloc_msg()
541 gss_msg->uid = uid; in gss_alloc_msg()
542 gss_msg->auth = gss_auth; in gss_alloc_msg()
545 gss_encode_v0_msg(gss_msg); in gss_alloc_msg()
548 err = gss_encode_v1_msg(gss_msg, service_name, gss_auth->target_name); in gss_alloc_msg()
553 return gss_msg; in gss_alloc_msg()
557 kfree(gss_msg); in gss_alloc_msg()
567 struct gss_upcall_msg *gss_new, *gss_msg; in gss_setup_upcall() local
573 gss_msg = gss_add_msg(gss_new); in gss_setup_upcall()
574 if (gss_msg == gss_new) { in gss_setup_upcall()
576 refcount_inc(&gss_msg->count); in gss_setup_upcall()
580 refcount_dec(&gss_msg->count); in gss_setup_upcall()
582 gss_msg = ERR_PTR(res); in gss_setup_upcall()
586 return gss_msg; in gss_setup_upcall()
602 struct gss_upcall_msg *gss_msg; in gss_refresh_upcall() local
608 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_refresh_upcall()
609 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_refresh_upcall()
617 if (IS_ERR(gss_msg)) { in gss_refresh_upcall()
618 err = PTR_ERR(gss_msg); in gss_refresh_upcall()
621 pipe = gss_msg->pipe; in gss_refresh_upcall()
625 else if (gss_msg->ctx == NULL && gss_msg->msg.errno >= 0) { in gss_refresh_upcall()
627 gss_cred->gc_upcall = gss_msg; in gss_refresh_upcall()
629 refcount_inc(&gss_msg->count); in gss_refresh_upcall()
630 rpc_sleep_on(&gss_msg->rpc_waitqueue, task, gss_upcall_callback); in gss_refresh_upcall()
632 gss_handle_downcall_result(gss_cred, gss_msg); in gss_refresh_upcall()
633 err = gss_msg->msg.errno; in gss_refresh_upcall()
636 gss_release_msg(gss_msg); in gss_refresh_upcall()
651 struct gss_upcall_msg *gss_msg; in gss_create_upcall() local
664 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_create_upcall()
665 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_create_upcall()
676 if (IS_ERR(gss_msg)) { in gss_create_upcall()
677 err = PTR_ERR(gss_msg); in gss_create_upcall()
680 pipe = gss_msg->pipe; in gss_create_upcall()
682 prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE); in gss_create_upcall()
684 if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) { in gss_create_upcall()
694 if (gss_msg->ctx) in gss_create_upcall()
695 gss_cred_set_ctx(cred, gss_msg->ctx); in gss_create_upcall()
697 err = gss_msg->msg.errno; in gss_create_upcall()
700 finish_wait(&gss_msg->waitqueue, &wait); in gss_create_upcall()
701 gss_release_msg(gss_msg); in gss_create_upcall()
715 struct gss_upcall_msg *gss_msg; in gss_pipe_downcall() local
754 gss_msg = __gss_find_upcall(pipe, uid, NULL); in gss_pipe_downcall()
755 if (gss_msg == NULL) { in gss_pipe_downcall()
759 list_del_init(&gss_msg->list); in gss_pipe_downcall()
762 p = gss_fill_context(p, end, ctx, gss_msg->auth->mech); in gss_pipe_downcall()
768 gss_msg->msg.errno = err; in gss_pipe_downcall()
775 gss_msg->msg.errno = -EAGAIN; in gss_pipe_downcall()
780 gss_msg->msg.errno = -EIO; in gss_pipe_downcall()
784 gss_msg->ctx = gss_get_ctx(ctx); in gss_pipe_downcall()
789 __gss_unhash_msg(gss_msg); in gss_pipe_downcall()
791 gss_release_msg(gss_msg); in gss_pipe_downcall()
840 struct gss_upcall_msg *gss_msg; in gss_pipe_release() local
844 list_for_each_entry(gss_msg, &pipe->in_downcall, list) { in gss_pipe_release()
846 if (!list_empty(&gss_msg->msg.list)) in gss_pipe_release()
848 gss_msg->msg.errno = -EPIPE; in gss_pipe_release()
849 refcount_inc(&gss_msg->count); in gss_pipe_release()
850 __gss_unhash_msg(gss_msg); in gss_pipe_release()
852 gss_release_msg(gss_msg); in gss_pipe_release()
863 struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg); in gss_pipe_destroy_msg() local
867 __func__, gss_msg); in gss_pipe_destroy_msg()
868 refcount_inc(&gss_msg->count); in gss_pipe_destroy_msg()
869 gss_unhash_msg(gss_msg); in gss_pipe_destroy_msg()
872 gss_release_msg(gss_msg); in gss_pipe_destroy_msg()
874 gss_release_msg(gss_msg); in gss_pipe_destroy_msg()