aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/auth_gss/auth_gss.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sunrpc/auth_gss/auth_gss.c')
-rw-r--r--net/sunrpc/auth_gss/auth_gss.c76
1 files changed, 38 insertions, 38 deletions
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
index 4157e3151581..304b8309f217 100644
--- a/net/sunrpc/auth_gss/auth_gss.c
+++ b/net/sunrpc/auth_gss/auth_gss.c
@@ -112,7 +112,7 @@ gss_put_ctx(struct gss_cl_ctx *ctx)
112/* gss_cred_set_ctx: 112/* gss_cred_set_ctx:
113 * called by gss_upcall_callback and gss_create_upcall in order 113 * called by gss_upcall_callback and gss_create_upcall in order
114 * to set the gss context. The actual exchange of an old context 114 * to set the gss context. The actual exchange of an old context
115 * and a new one is protected by the rpci->pipe->lock. 115 * and a new one is protected by the pipe->lock.
116 */ 116 */
117static void 117static void
118gss_cred_set_ctx(struct rpc_cred *cred, struct gss_cl_ctx *ctx) 118gss_cred_set_ctx(struct rpc_cred *cred, struct gss_cl_ctx *ctx)
@@ -251,7 +251,7 @@ struct gss_upcall_msg {
251 struct rpc_pipe_msg msg; 251 struct rpc_pipe_msg msg;
252 struct list_head list; 252 struct list_head list;
253 struct gss_auth *auth; 253 struct gss_auth *auth;
254 struct rpc_inode *inode; 254 struct rpc_pipe *pipe;
255 struct rpc_wait_queue rpc_waitqueue; 255 struct rpc_wait_queue rpc_waitqueue;
256 wait_queue_head_t waitqueue; 256 wait_queue_head_t waitqueue;
257 struct gss_cl_ctx *ctx; 257 struct gss_cl_ctx *ctx;
@@ -294,10 +294,10 @@ gss_release_msg(struct gss_upcall_msg *gss_msg)
294} 294}
295 295
296static struct gss_upcall_msg * 296static struct gss_upcall_msg *
297__gss_find_upcall(struct rpc_inode *rpci, uid_t uid) 297__gss_find_upcall(struct rpc_pipe *pipe, uid_t uid)
298{ 298{
299 struct gss_upcall_msg *pos; 299 struct gss_upcall_msg *pos;
300 list_for_each_entry(pos, &rpci->pipe->in_downcall, list) { 300 list_for_each_entry(pos, &pipe->in_downcall, list) {
301 if (pos->uid != uid) 301 if (pos->uid != uid)
302 continue; 302 continue;
303 atomic_inc(&pos->count); 303 atomic_inc(&pos->count);
@@ -315,17 +315,17 @@ __gss_find_upcall(struct rpc_inode *rpci, uid_t uid)
315static inline struct gss_upcall_msg * 315static inline struct gss_upcall_msg *
316gss_add_msg(struct gss_upcall_msg *gss_msg) 316gss_add_msg(struct gss_upcall_msg *gss_msg)
317{ 317{
318 struct rpc_inode *rpci = gss_msg->inode; 318 struct rpc_pipe *pipe = gss_msg->pipe;
319 struct gss_upcall_msg *old; 319 struct gss_upcall_msg *old;
320 320
321 spin_lock(&rpci->pipe->lock); 321 spin_lock(&pipe->lock);
322 old = __gss_find_upcall(rpci, gss_msg->uid); 322 old = __gss_find_upcall(pipe, gss_msg->uid);
323 if (old == NULL) { 323 if (old == NULL) {
324 atomic_inc(&gss_msg->count); 324 atomic_inc(&gss_msg->count);
325 list_add(&gss_msg->list, &rpci->pipe->in_downcall); 325 list_add(&gss_msg->list, &pipe->in_downcall);
326 } else 326 } else
327 gss_msg = old; 327 gss_msg = old;
328 spin_unlock(&rpci->pipe->lock); 328 spin_unlock(&pipe->lock);
329 return gss_msg; 329 return gss_msg;
330} 330}
331 331
@@ -341,14 +341,14 @@ __gss_unhash_msg(struct gss_upcall_msg *gss_msg)
341static void 341static void
342gss_unhash_msg(struct gss_upcall_msg *gss_msg) 342gss_unhash_msg(struct gss_upcall_msg *gss_msg)
343{ 343{
344 struct rpc_inode *rpci = gss_msg->inode; 344 struct rpc_pipe *pipe = gss_msg->pipe;
345 345
346 if (list_empty(&gss_msg->list)) 346 if (list_empty(&gss_msg->list))
347 return; 347 return;
348 spin_lock(&rpci->pipe->lock); 348 spin_lock(&pipe->lock);
349 if (!list_empty(&gss_msg->list)) 349 if (!list_empty(&gss_msg->list))
350 __gss_unhash_msg(gss_msg); 350 __gss_unhash_msg(gss_msg);
351 spin_unlock(&rpci->pipe->lock); 351 spin_unlock(&pipe->lock);
352} 352}
353 353
354static void 354static void
@@ -375,11 +375,11 @@ gss_upcall_callback(struct rpc_task *task)
375 struct gss_cred *gss_cred = container_of(task->tk_rqstp->rq_cred, 375 struct gss_cred *gss_cred = container_of(task->tk_rqstp->rq_cred,
376 struct gss_cred, gc_base); 376 struct gss_cred, gc_base);
377 struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; 377 struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall;
378 struct rpc_inode *rpci = gss_msg->inode; 378 struct rpc_pipe *pipe = gss_msg->pipe;
379 379
380 spin_lock(&rpci->pipe->lock); 380 spin_lock(&pipe->lock);
381 gss_handle_downcall_result(gss_cred, gss_msg); 381 gss_handle_downcall_result(gss_cred, gss_msg);
382 spin_unlock(&rpci->pipe->lock); 382 spin_unlock(&pipe->lock);
383 task->tk_status = gss_msg->msg.errno; 383 task->tk_status = gss_msg->msg.errno;
384 gss_release_msg(gss_msg); 384 gss_release_msg(gss_msg);
385} 385}
@@ -449,7 +449,7 @@ gss_alloc_msg(struct gss_auth *gss_auth, struct rpc_clnt *clnt,
449 kfree(gss_msg); 449 kfree(gss_msg);
450 return ERR_PTR(vers); 450 return ERR_PTR(vers);
451 } 451 }
452 gss_msg->inode = RPC_I(gss_auth->dentry[vers]->d_inode); 452 gss_msg->pipe = RPC_I(gss_auth->dentry[vers]->d_inode)->pipe;
453 INIT_LIST_HEAD(&gss_msg->list); 453 INIT_LIST_HEAD(&gss_msg->list);
454 rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); 454 rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq");
455 init_waitqueue_head(&gss_msg->waitqueue); 455 init_waitqueue_head(&gss_msg->waitqueue);
@@ -473,7 +473,7 @@ gss_setup_upcall(struct rpc_clnt *clnt, struct gss_auth *gss_auth, struct rpc_cr
473 return gss_new; 473 return gss_new;
474 gss_msg = gss_add_msg(gss_new); 474 gss_msg = gss_add_msg(gss_new);
475 if (gss_msg == gss_new) { 475 if (gss_msg == gss_new) {
476 int res = rpc_queue_upcall(gss_new->inode->pipe, &gss_new->msg); 476 int res = rpc_queue_upcall(gss_new->pipe, &gss_new->msg);
477 if (res) { 477 if (res) {
478 gss_unhash_msg(gss_new); 478 gss_unhash_msg(gss_new);
479 gss_msg = ERR_PTR(res); 479 gss_msg = ERR_PTR(res);
@@ -504,7 +504,7 @@ gss_refresh_upcall(struct rpc_task *task)
504 struct gss_cred *gss_cred = container_of(cred, 504 struct gss_cred *gss_cred = container_of(cred,
505 struct gss_cred, gc_base); 505 struct gss_cred, gc_base);
506 struct gss_upcall_msg *gss_msg; 506 struct gss_upcall_msg *gss_msg;
507 struct rpc_inode *rpci; 507 struct rpc_pipe *pipe;
508 int err = 0; 508 int err = 0;
509 509
510 dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid, 510 dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid,
@@ -522,8 +522,8 @@ gss_refresh_upcall(struct rpc_task *task)
522 err = PTR_ERR(gss_msg); 522 err = PTR_ERR(gss_msg);
523 goto out; 523 goto out;
524 } 524 }
525 rpci = gss_msg->inode; 525 pipe = gss_msg->pipe;
526 spin_lock(&rpci->pipe->lock); 526 spin_lock(&pipe->lock);
527 if (gss_cred->gc_upcall != NULL) 527 if (gss_cred->gc_upcall != NULL)
528 rpc_sleep_on(&gss_cred->gc_upcall->rpc_waitqueue, task, NULL); 528 rpc_sleep_on(&gss_cred->gc_upcall->rpc_waitqueue, task, NULL);
529 else if (gss_msg->ctx == NULL && gss_msg->msg.errno >= 0) { 529 else if (gss_msg->ctx == NULL && gss_msg->msg.errno >= 0) {
@@ -536,7 +536,7 @@ gss_refresh_upcall(struct rpc_task *task)
536 gss_handle_downcall_result(gss_cred, gss_msg); 536 gss_handle_downcall_result(gss_cred, gss_msg);
537 err = gss_msg->msg.errno; 537 err = gss_msg->msg.errno;
538 } 538 }
539 spin_unlock(&rpci->pipe->lock); 539 spin_unlock(&pipe->lock);
540 gss_release_msg(gss_msg); 540 gss_release_msg(gss_msg);
541out: 541out:
542 dprintk("RPC: %5u gss_refresh_upcall for uid %u result %d\n", 542 dprintk("RPC: %5u gss_refresh_upcall for uid %u result %d\n",
@@ -547,7 +547,7 @@ out:
547static inline int 547static inline int
548gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred) 548gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred)
549{ 549{
550 struct rpc_inode *rpci; 550 struct rpc_pipe *pipe;
551 struct rpc_cred *cred = &gss_cred->gc_base; 551 struct rpc_cred *cred = &gss_cred->gc_base;
552 struct gss_upcall_msg *gss_msg; 552 struct gss_upcall_msg *gss_msg;
553 DEFINE_WAIT(wait); 553 DEFINE_WAIT(wait);
@@ -571,14 +571,14 @@ retry:
571 err = PTR_ERR(gss_msg); 571 err = PTR_ERR(gss_msg);
572 goto out; 572 goto out;
573 } 573 }
574 rpci = gss_msg->inode; 574 pipe = gss_msg->pipe;
575 for (;;) { 575 for (;;) {
576 prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE); 576 prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE);
577 spin_lock(&rpci->pipe->lock); 577 spin_lock(&pipe->lock);
578 if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) { 578 if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) {
579 break; 579 break;
580 } 580 }
581 spin_unlock(&rpci->pipe->lock); 581 spin_unlock(&pipe->lock);
582 if (fatal_signal_pending(current)) { 582 if (fatal_signal_pending(current)) {
583 err = -ERESTARTSYS; 583 err = -ERESTARTSYS;
584 goto out_intr; 584 goto out_intr;
@@ -589,7 +589,7 @@ retry:
589 gss_cred_set_ctx(cred, gss_msg->ctx); 589 gss_cred_set_ctx(cred, gss_msg->ctx);
590 else 590 else
591 err = gss_msg->msg.errno; 591 err = gss_msg->msg.errno;
592 spin_unlock(&rpci->pipe->lock); 592 spin_unlock(&pipe->lock);
593out_intr: 593out_intr:
594 finish_wait(&gss_msg->waitqueue, &wait); 594 finish_wait(&gss_msg->waitqueue, &wait);
595 gss_release_msg(gss_msg); 595 gss_release_msg(gss_msg);
@@ -607,7 +607,7 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
607 const void *p, *end; 607 const void *p, *end;
608 void *buf; 608 void *buf;
609 struct gss_upcall_msg *gss_msg; 609 struct gss_upcall_msg *gss_msg;
610 struct rpc_inode *rpci = RPC_I(filp->f_dentry->d_inode); 610 struct rpc_pipe *pipe = RPC_I(filp->f_dentry->d_inode)->pipe;
611 struct gss_cl_ctx *ctx; 611 struct gss_cl_ctx *ctx;
612 uid_t uid; 612 uid_t uid;
613 ssize_t err = -EFBIG; 613 ssize_t err = -EFBIG;
@@ -637,14 +637,14 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
637 637
638 err = -ENOENT; 638 err = -ENOENT;
639 /* Find a matching upcall */ 639 /* Find a matching upcall */
640 spin_lock(&rpci->pipe->lock); 640 spin_lock(&pipe->lock);
641 gss_msg = __gss_find_upcall(rpci, uid); 641 gss_msg = __gss_find_upcall(pipe, uid);
642 if (gss_msg == NULL) { 642 if (gss_msg == NULL) {
643 spin_unlock(&rpci->pipe->lock); 643 spin_unlock(&pipe->lock);
644 goto err_put_ctx; 644 goto err_put_ctx;
645 } 645 }
646 list_del_init(&gss_msg->list); 646 list_del_init(&gss_msg->list);
647 spin_unlock(&rpci->pipe->lock); 647 spin_unlock(&pipe->lock);
648 648
649 p = gss_fill_context(p, end, ctx, gss_msg->auth->mech); 649 p = gss_fill_context(p, end, ctx, gss_msg->auth->mech);
650 if (IS_ERR(p)) { 650 if (IS_ERR(p)) {
@@ -672,9 +672,9 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
672 err = mlen; 672 err = mlen;
673 673
674err_release_msg: 674err_release_msg:
675 spin_lock(&rpci->pipe->lock); 675 spin_lock(&pipe->lock);
676 __gss_unhash_msg(gss_msg); 676 __gss_unhash_msg(gss_msg);
677 spin_unlock(&rpci->pipe->lock); 677 spin_unlock(&pipe->lock);
678 gss_release_msg(gss_msg); 678 gss_release_msg(gss_msg);
679err_put_ctx: 679err_put_ctx:
680 gss_put_ctx(ctx); 680 gss_put_ctx(ctx);
@@ -720,23 +720,23 @@ static int gss_pipe_open_v1(struct inode *inode)
720static void 720static void
721gss_pipe_release(struct inode *inode) 721gss_pipe_release(struct inode *inode)
722{ 722{
723 struct rpc_inode *rpci = RPC_I(inode); 723 struct rpc_pipe *pipe = RPC_I(inode)->pipe;
724 struct gss_upcall_msg *gss_msg; 724 struct gss_upcall_msg *gss_msg;
725 725
726restart: 726restart:
727 spin_lock(&rpci->pipe->lock); 727 spin_lock(&pipe->lock);
728 list_for_each_entry(gss_msg, &rpci->pipe->in_downcall, list) { 728 list_for_each_entry(gss_msg, &pipe->in_downcall, list) {
729 729
730 if (!list_empty(&gss_msg->msg.list)) 730 if (!list_empty(&gss_msg->msg.list))
731 continue; 731 continue;
732 gss_msg->msg.errno = -EPIPE; 732 gss_msg->msg.errno = -EPIPE;
733 atomic_inc(&gss_msg->count); 733 atomic_inc(&gss_msg->count);
734 __gss_unhash_msg(gss_msg); 734 __gss_unhash_msg(gss_msg);
735 spin_unlock(&rpci->pipe->lock); 735 spin_unlock(&pipe->lock);
736 gss_release_msg(gss_msg); 736 gss_release_msg(gss_msg);
737 goto restart; 737 goto restart;
738 } 738 }
739 spin_unlock(&rpci->pipe->lock); 739 spin_unlock(&pipe->lock);
740 740
741 put_pipe_version(); 741 put_pipe_version();
742} 742}