Lines Matching refs:gss_msg
310 gss_release_msg(struct gss_upcall_msg *gss_msg) in gss_release_msg() argument
312 struct net *net = gss_msg->auth->net; in gss_release_msg()
313 if (!refcount_dec_and_test(&gss_msg->count)) in gss_release_msg()
316 BUG_ON(!list_empty(&gss_msg->list)); in gss_release_msg()
317 if (gss_msg->ctx != NULL) in gss_release_msg()
318 gss_put_ctx(gss_msg->ctx); in gss_release_msg()
319 rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue); in gss_release_msg()
320 gss_put_auth(gss_msg->auth); in gss_release_msg()
321 kfree_const(gss_msg->service_name); in gss_release_msg()
322 kfree(gss_msg); in gss_release_msg()
345 gss_add_msg(struct gss_upcall_msg *gss_msg) in gss_add_msg() argument
347 struct rpc_pipe *pipe = gss_msg->pipe; in gss_add_msg()
351 old = __gss_find_upcall(pipe, gss_msg->uid, gss_msg->auth); in gss_add_msg()
353 refcount_inc(&gss_msg->count); in gss_add_msg()
354 list_add(&gss_msg->list, &pipe->in_downcall); in gss_add_msg()
356 gss_msg = old; in gss_add_msg()
358 return gss_msg; in gss_add_msg()
362 __gss_unhash_msg(struct gss_upcall_msg *gss_msg) in __gss_unhash_msg() argument
364 list_del_init(&gss_msg->list); in __gss_unhash_msg()
365 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in __gss_unhash_msg()
366 wake_up_all(&gss_msg->waitqueue); in __gss_unhash_msg()
367 refcount_dec(&gss_msg->count); in __gss_unhash_msg()
371 gss_unhash_msg(struct gss_upcall_msg *gss_msg) in gss_unhash_msg() argument
373 struct rpc_pipe *pipe = gss_msg->pipe; in gss_unhash_msg()
375 if (list_empty(&gss_msg->list)) in gss_unhash_msg()
378 if (!list_empty(&gss_msg->list)) in gss_unhash_msg()
379 __gss_unhash_msg(gss_msg); in gss_unhash_msg()
384 gss_handle_downcall_result(struct gss_cred *gss_cred, struct gss_upcall_msg *gss_msg) in gss_handle_downcall_result() argument
386 switch (gss_msg->msg.errno) { in gss_handle_downcall_result()
388 if (gss_msg->ctx == NULL) in gss_handle_downcall_result()
391 gss_cred_set_ctx(&gss_cred->gc_base, gss_msg->ctx); in gss_handle_downcall_result()
398 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in gss_handle_downcall_result()
406 struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; in gss_upcall_callback() local
407 struct rpc_pipe *pipe = gss_msg->pipe; in gss_upcall_callback()
410 gss_handle_downcall_result(gss_cred, gss_msg); in gss_upcall_callback()
412 task->tk_status = gss_msg->msg.errno; in gss_upcall_callback()
413 gss_release_msg(gss_msg); in gss_upcall_callback()
416 static void gss_encode_v0_msg(struct gss_upcall_msg *gss_msg, in gss_encode_v0_msg() argument
421 uid_t uid = from_kuid_munged(userns, gss_msg->uid); in gss_encode_v0_msg()
422 memcpy(gss_msg->databuf, &uid, sizeof(uid)); in gss_encode_v0_msg()
423 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v0_msg()
424 gss_msg->msg.len = sizeof(uid); in gss_encode_v0_msg()
426 BUILD_BUG_ON(sizeof(uid) > sizeof(gss_msg->databuf)); in gss_encode_v0_msg()
433 struct gss_upcall_msg *gss_msg = container_of(msg, in gss_v0_upcall() local
437 gss_encode_v0_msg(gss_msg, file->f_cred); in gss_v0_upcall()
441 static int gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, in gss_encode_v1_msg() argument
447 struct gss_api_mech *mech = gss_msg->auth->mech; in gss_encode_v1_msg()
448 char *p = gss_msg->databuf; in gss_encode_v1_msg()
449 size_t buflen = sizeof(gss_msg->databuf); in gss_encode_v1_msg()
453 from_kuid_munged(userns, gss_msg->uid)); in gss_encode_v1_msg()
456 gss_msg->msg.len = len; in gss_encode_v1_msg()
466 gss_msg->msg.len += len; in gss_encode_v1_msg()
492 gss_msg->msg.len += len; in gss_encode_v1_msg()
500 gss_msg->msg.len += len; in gss_encode_v1_msg()
502 trace_rpcgss_upcall_msg(gss_msg->databuf); in gss_encode_v1_msg()
506 gss_msg->msg.len += len; in gss_encode_v1_msg()
507 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v1_msg()
518 struct gss_upcall_msg *gss_msg = container_of(msg, in gss_v1_upcall() local
523 err = gss_encode_v1_msg(gss_msg, in gss_v1_upcall()
524 gss_msg->service_name, in gss_v1_upcall()
525 gss_msg->auth->target_name, in gss_v1_upcall()
537 struct gss_upcall_msg *gss_msg; in gss_alloc_msg() local
541 gss_msg = kzalloc(sizeof(*gss_msg), GFP_NOFS); in gss_alloc_msg()
542 if (gss_msg == NULL) in gss_alloc_msg()
548 gss_msg->pipe = gss_auth->gss_pipe[vers]->pipe; in gss_alloc_msg()
549 INIT_LIST_HEAD(&gss_msg->list); in gss_alloc_msg()
550 rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); in gss_alloc_msg()
551 init_waitqueue_head(&gss_msg->waitqueue); in gss_alloc_msg()
552 refcount_set(&gss_msg->count, 1); in gss_alloc_msg()
553 gss_msg->uid = uid; in gss_alloc_msg()
554 gss_msg->auth = gss_auth; in gss_alloc_msg()
557 gss_msg->service_name = kstrdup_const(service_name, GFP_NOFS); in gss_alloc_msg()
558 if (!gss_msg->service_name) { in gss_alloc_msg()
563 return gss_msg; in gss_alloc_msg()
567 kfree(gss_msg); in gss_alloc_msg()
577 struct gss_upcall_msg *gss_new, *gss_msg; in gss_setup_upcall() local
583 gss_msg = gss_add_msg(gss_new); in gss_setup_upcall()
584 if (gss_msg == gss_new) { in gss_setup_upcall()
586 refcount_inc(&gss_msg->count); in gss_setup_upcall()
590 refcount_dec(&gss_msg->count); in gss_setup_upcall()
592 gss_msg = ERR_PTR(res); in gss_setup_upcall()
596 return gss_msg; in gss_setup_upcall()
612 struct gss_upcall_msg *gss_msg; in gss_refresh_upcall() local
616 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_refresh_upcall()
617 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_refresh_upcall()
626 if (IS_ERR(gss_msg)) { in gss_refresh_upcall()
627 err = PTR_ERR(gss_msg); in gss_refresh_upcall()
630 pipe = gss_msg->pipe; in gss_refresh_upcall()
634 else if (gss_msg->ctx == NULL && gss_msg->msg.errno >= 0) { in gss_refresh_upcall()
635 gss_cred->gc_upcall = gss_msg; in gss_refresh_upcall()
637 refcount_inc(&gss_msg->count); in gss_refresh_upcall()
638 rpc_sleep_on(&gss_msg->rpc_waitqueue, task, gss_upcall_callback); in gss_refresh_upcall()
640 gss_handle_downcall_result(gss_cred, gss_msg); in gss_refresh_upcall()
641 err = gss_msg->msg.errno; in gss_refresh_upcall()
644 gss_release_msg(gss_msg); in gss_refresh_upcall()
658 struct gss_upcall_msg *gss_msg; in gss_create_upcall() local
670 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_create_upcall()
671 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_create_upcall()
682 if (IS_ERR(gss_msg)) { in gss_create_upcall()
683 err = PTR_ERR(gss_msg); in gss_create_upcall()
686 pipe = gss_msg->pipe; in gss_create_upcall()
688 prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE); in gss_create_upcall()
690 if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) { in gss_create_upcall()
700 if (gss_msg->ctx) { in gss_create_upcall()
702 gss_cred_set_ctx(cred, gss_msg->ctx); in gss_create_upcall()
704 err = gss_msg->msg.errno; in gss_create_upcall()
708 finish_wait(&gss_msg->waitqueue, &wait); in gss_create_upcall()
709 gss_release_msg(gss_msg); in gss_create_upcall()
723 struct gss_upcall_msg *gss_msg; in gss_pipe_downcall() local
762 gss_msg = __gss_find_upcall(pipe, uid, NULL); in gss_pipe_downcall()
763 if (gss_msg == NULL) { in gss_pipe_downcall()
767 list_del_init(&gss_msg->list); in gss_pipe_downcall()
770 p = gss_fill_context(p, end, ctx, gss_msg->auth->mech); in gss_pipe_downcall()
776 gss_msg->msg.errno = err; in gss_pipe_downcall()
783 gss_msg->msg.errno = -EAGAIN; in gss_pipe_downcall()
788 gss_msg->msg.errno = -EIO; in gss_pipe_downcall()
792 gss_msg->ctx = gss_get_ctx(ctx); in gss_pipe_downcall()
797 __gss_unhash_msg(gss_msg); in gss_pipe_downcall()
799 gss_release_msg(gss_msg); in gss_pipe_downcall()
847 struct gss_upcall_msg *gss_msg; in gss_pipe_release() local
851 list_for_each_entry(gss_msg, &pipe->in_downcall, list) { in gss_pipe_release()
853 if (!list_empty(&gss_msg->msg.list)) in gss_pipe_release()
855 gss_msg->msg.errno = -EPIPE; in gss_pipe_release()
856 refcount_inc(&gss_msg->count); in gss_pipe_release()
857 __gss_unhash_msg(gss_msg); in gss_pipe_release()
859 gss_release_msg(gss_msg); in gss_pipe_release()
870 struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg); in gss_pipe_destroy_msg() local
873 refcount_inc(&gss_msg->count); in gss_pipe_destroy_msg()
874 gss_unhash_msg(gss_msg); in gss_pipe_destroy_msg()
877 gss_release_msg(gss_msg); in gss_pipe_destroy_msg()
879 gss_release_msg(gss_msg); in gss_pipe_destroy_msg()