Lines Matching refs:gss_msg
328 gss_release_msg(struct gss_upcall_msg *gss_msg) in gss_release_msg() argument
330 struct net *net = gss_msg->auth->net; in gss_release_msg()
331 if (!atomic_dec_and_test(&gss_msg->count)) in gss_release_msg()
334 BUG_ON(!list_empty(&gss_msg->list)); in gss_release_msg()
335 if (gss_msg->ctx != NULL) in gss_release_msg()
336 gss_put_ctx(gss_msg->ctx); in gss_release_msg()
337 rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue); in gss_release_msg()
338 gss_put_auth(gss_msg->auth); in gss_release_msg()
339 kfree(gss_msg); in gss_release_msg()
362 gss_add_msg(struct gss_upcall_msg *gss_msg) in gss_add_msg() argument
364 struct rpc_pipe *pipe = gss_msg->pipe; in gss_add_msg()
368 old = __gss_find_upcall(pipe, gss_msg->uid); in gss_add_msg()
370 atomic_inc(&gss_msg->count); in gss_add_msg()
371 list_add(&gss_msg->list, &pipe->in_downcall); in gss_add_msg()
373 gss_msg = old; in gss_add_msg()
375 return gss_msg; in gss_add_msg()
379 __gss_unhash_msg(struct gss_upcall_msg *gss_msg) in __gss_unhash_msg() argument
381 list_del_init(&gss_msg->list); in __gss_unhash_msg()
382 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in __gss_unhash_msg()
383 wake_up_all(&gss_msg->waitqueue); in __gss_unhash_msg()
384 atomic_dec(&gss_msg->count); in __gss_unhash_msg()
388 gss_unhash_msg(struct gss_upcall_msg *gss_msg) in gss_unhash_msg() argument
390 struct rpc_pipe *pipe = gss_msg->pipe; in gss_unhash_msg()
392 if (list_empty(&gss_msg->list)) in gss_unhash_msg()
395 if (!list_empty(&gss_msg->list)) in gss_unhash_msg()
396 __gss_unhash_msg(gss_msg); in gss_unhash_msg()
401 gss_handle_downcall_result(struct gss_cred *gss_cred, struct gss_upcall_msg *gss_msg) in gss_handle_downcall_result() argument
403 switch (gss_msg->msg.errno) { in gss_handle_downcall_result()
405 if (gss_msg->ctx == NULL) in gss_handle_downcall_result()
408 gss_cred_set_ctx(&gss_cred->gc_base, gss_msg->ctx); in gss_handle_downcall_result()
415 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); in gss_handle_downcall_result()
423 struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; in gss_upcall_callback() local
424 struct rpc_pipe *pipe = gss_msg->pipe; in gss_upcall_callback()
427 gss_handle_downcall_result(gss_cred, gss_msg); in gss_upcall_callback()
429 task->tk_status = gss_msg->msg.errno; in gss_upcall_callback()
430 gss_release_msg(gss_msg); in gss_upcall_callback()
433 static void gss_encode_v0_msg(struct gss_upcall_msg *gss_msg) in gss_encode_v0_msg() argument
435 uid_t uid = from_kuid(&init_user_ns, gss_msg->uid); in gss_encode_v0_msg()
436 memcpy(gss_msg->databuf, &uid, sizeof(uid)); in gss_encode_v0_msg()
437 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v0_msg()
438 gss_msg->msg.len = sizeof(uid); in gss_encode_v0_msg()
440 BUILD_BUG_ON(sizeof(uid) > sizeof(gss_msg->databuf)); in gss_encode_v0_msg()
443 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(&init_user_ns, gss_msg->uid)); in gss_encode_v1_msg()
456 gss_msg->msg.len = len; in gss_encode_v1_msg()
461 gss_msg->msg.len += len; in gss_encode_v1_msg()
467 gss_msg->msg.len += len; in gss_encode_v1_msg()
474 gss_msg->msg.len += len; in gss_encode_v1_msg()
479 gss_msg->msg.len += len; in gss_encode_v1_msg()
481 gss_msg->msg.data = gss_msg->databuf; in gss_encode_v1_msg()
492 struct gss_upcall_msg *gss_msg; in gss_alloc_msg() local
496 gss_msg = kzalloc(sizeof(*gss_msg), GFP_NOFS); in gss_alloc_msg()
497 if (gss_msg == NULL) in gss_alloc_msg()
503 gss_msg->pipe = gss_auth->gss_pipe[vers]->pipe; in gss_alloc_msg()
504 INIT_LIST_HEAD(&gss_msg->list); in gss_alloc_msg()
505 rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); in gss_alloc_msg()
506 init_waitqueue_head(&gss_msg->waitqueue); in gss_alloc_msg()
507 atomic_set(&gss_msg->count, 1); in gss_alloc_msg()
508 gss_msg->uid = uid; in gss_alloc_msg()
509 gss_msg->auth = gss_auth; in gss_alloc_msg()
512 gss_encode_v0_msg(gss_msg); in gss_alloc_msg()
515 err = gss_encode_v1_msg(gss_msg, service_name, gss_auth->target_name); in gss_alloc_msg()
520 return gss_msg; in gss_alloc_msg()
524 kfree(gss_msg); in gss_alloc_msg()
534 struct gss_upcall_msg *gss_new, *gss_msg; in gss_setup_upcall() local
540 gss_msg = gss_add_msg(gss_new); in gss_setup_upcall()
541 if (gss_msg == gss_new) { in gss_setup_upcall()
545 gss_msg = ERR_PTR(res); in gss_setup_upcall()
549 return gss_msg; in gss_setup_upcall()
565 struct gss_upcall_msg *gss_msg; in gss_refresh_upcall() local
571 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_refresh_upcall()
572 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_refresh_upcall()
580 if (IS_ERR(gss_msg)) { in gss_refresh_upcall()
581 err = PTR_ERR(gss_msg); in gss_refresh_upcall()
584 pipe = gss_msg->pipe; in gss_refresh_upcall()
588 else if (gss_msg->ctx == NULL && gss_msg->msg.errno >= 0) { in gss_refresh_upcall()
590 gss_cred->gc_upcall = gss_msg; in gss_refresh_upcall()
592 atomic_inc(&gss_msg->count); in gss_refresh_upcall()
593 rpc_sleep_on(&gss_msg->rpc_waitqueue, task, gss_upcall_callback); in gss_refresh_upcall()
595 gss_handle_downcall_result(gss_cred, gss_msg); in gss_refresh_upcall()
596 err = gss_msg->msg.errno; in gss_refresh_upcall()
599 gss_release_msg(gss_msg); in gss_refresh_upcall()
614 struct gss_upcall_msg *gss_msg; in gss_create_upcall() local
627 gss_msg = gss_setup_upcall(gss_auth, cred); in gss_create_upcall()
628 if (PTR_ERR(gss_msg) == -EAGAIN) { in gss_create_upcall()
639 if (IS_ERR(gss_msg)) { in gss_create_upcall()
640 err = PTR_ERR(gss_msg); in gss_create_upcall()
643 pipe = gss_msg->pipe; in gss_create_upcall()
645 prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE); in gss_create_upcall()
647 if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) { in gss_create_upcall()
657 if (gss_msg->ctx) in gss_create_upcall()
658 gss_cred_set_ctx(cred, gss_msg->ctx); in gss_create_upcall()
660 err = gss_msg->msg.errno; in gss_create_upcall()
663 finish_wait(&gss_msg->waitqueue, &wait); in gss_create_upcall()
664 gss_release_msg(gss_msg); in gss_create_upcall()
678 struct gss_upcall_msg *gss_msg; in gss_pipe_downcall() local
717 gss_msg = __gss_find_upcall(pipe, uid); in gss_pipe_downcall()
718 if (gss_msg == NULL) { in gss_pipe_downcall()
722 list_del_init(&gss_msg->list); in gss_pipe_downcall()
725 p = gss_fill_context(p, end, ctx, gss_msg->auth->mech); in gss_pipe_downcall()
731 gss_msg->msg.errno = err; in gss_pipe_downcall()
738 gss_msg->msg.errno = -EAGAIN; in gss_pipe_downcall()
747 gss_msg->ctx = gss_get_ctx(ctx); in gss_pipe_downcall()
752 __gss_unhash_msg(gss_msg); in gss_pipe_downcall()
754 gss_release_msg(gss_msg); in gss_pipe_downcall()
803 struct gss_upcall_msg *gss_msg; in gss_pipe_release() local
807 list_for_each_entry(gss_msg, &pipe->in_downcall, list) { in gss_pipe_release()
809 if (!list_empty(&gss_msg->msg.list)) in gss_pipe_release()
811 gss_msg->msg.errno = -EPIPE; in gss_pipe_release()
812 atomic_inc(&gss_msg->count); in gss_pipe_release()
813 __gss_unhash_msg(gss_msg); in gss_pipe_release()
815 gss_release_msg(gss_msg); in gss_pipe_release()
826 struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg); in gss_pipe_destroy_msg() local
830 __func__, gss_msg); in gss_pipe_destroy_msg()
831 atomic_inc(&gss_msg->count); in gss_pipe_destroy_msg()
832 gss_unhash_msg(gss_msg); in gss_pipe_destroy_msg()
835 gss_release_msg(gss_msg); in gss_pipe_destroy_msg()