diff options
Diffstat (limited to 'net/sunrpc/auth_gss/auth_gss.c')
-rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index e451d104a434..fe06acd6029b 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c | |||
@@ -234,6 +234,7 @@ struct gss_upcall_msg { | |||
234 | struct rpc_pipe_msg msg; | 234 | struct rpc_pipe_msg msg; |
235 | struct list_head list; | 235 | struct list_head list; |
236 | struct gss_auth *auth; | 236 | struct gss_auth *auth; |
237 | struct rpc_inode *inode; | ||
237 | struct rpc_wait_queue rpc_waitqueue; | 238 | struct rpc_wait_queue rpc_waitqueue; |
238 | wait_queue_head_t waitqueue; | 239 | wait_queue_head_t waitqueue; |
239 | struct gss_cl_ctx *ctx; | 240 | struct gss_cl_ctx *ctx; |
@@ -296,8 +297,8 @@ __gss_find_upcall(struct rpc_inode *rpci, uid_t uid) | |||
296 | static inline struct gss_upcall_msg * | 297 | static inline struct gss_upcall_msg * |
297 | gss_add_msg(struct gss_auth *gss_auth, struct gss_upcall_msg *gss_msg) | 298 | gss_add_msg(struct gss_auth *gss_auth, struct gss_upcall_msg *gss_msg) |
298 | { | 299 | { |
299 | struct inode *inode = gss_auth->dentry->d_inode; | 300 | struct rpc_inode *rpci = gss_msg->inode; |
300 | struct rpc_inode *rpci = RPC_I(inode); | 301 | struct inode *inode = &rpci->vfs_inode; |
301 | struct gss_upcall_msg *old; | 302 | struct gss_upcall_msg *old; |
302 | 303 | ||
303 | spin_lock(&inode->i_lock); | 304 | spin_lock(&inode->i_lock); |
@@ -323,8 +324,7 @@ __gss_unhash_msg(struct gss_upcall_msg *gss_msg) | |||
323 | static void | 324 | static void |
324 | gss_unhash_msg(struct gss_upcall_msg *gss_msg) | 325 | gss_unhash_msg(struct gss_upcall_msg *gss_msg) |
325 | { | 326 | { |
326 | struct gss_auth *gss_auth = gss_msg->auth; | 327 | struct inode *inode = &gss_msg->inode->vfs_inode; |
327 | struct inode *inode = gss_auth->dentry->d_inode; | ||
328 | 328 | ||
329 | if (list_empty(&gss_msg->list)) | 329 | if (list_empty(&gss_msg->list)) |
330 | return; | 330 | return; |
@@ -340,7 +340,7 @@ gss_upcall_callback(struct rpc_task *task) | |||
340 | struct gss_cred *gss_cred = container_of(task->tk_msg.rpc_cred, | 340 | struct gss_cred *gss_cred = container_of(task->tk_msg.rpc_cred, |
341 | struct gss_cred, gc_base); | 341 | struct gss_cred, gc_base); |
342 | struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; | 342 | struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; |
343 | struct inode *inode = gss_msg->auth->dentry->d_inode; | 343 | struct inode *inode = &gss_msg->inode->vfs_inode; |
344 | 344 | ||
345 | spin_lock(&inode->i_lock); | 345 | spin_lock(&inode->i_lock); |
346 | if (gss_msg->ctx) | 346 | if (gss_msg->ctx) |
@@ -367,6 +367,7 @@ gss_alloc_msg(struct gss_auth *gss_auth, uid_t uid) | |||
367 | kfree(gss_msg); | 367 | kfree(gss_msg); |
368 | return ERR_PTR(vers); | 368 | return ERR_PTR(vers); |
369 | } | 369 | } |
370 | gss_msg->inode = RPC_I(gss_auth->dentry->d_inode); | ||
370 | INIT_LIST_HEAD(&gss_msg->list); | 371 | INIT_LIST_HEAD(&gss_msg->list); |
371 | rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); | 372 | rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); |
372 | init_waitqueue_head(&gss_msg->waitqueue); | 373 | init_waitqueue_head(&gss_msg->waitqueue); |
@@ -395,7 +396,8 @@ gss_setup_upcall(struct rpc_clnt *clnt, struct gss_auth *gss_auth, struct rpc_cr | |||
395 | return gss_new; | 396 | return gss_new; |
396 | gss_msg = gss_add_msg(gss_auth, gss_new); | 397 | gss_msg = gss_add_msg(gss_auth, gss_new); |
397 | if (gss_msg == gss_new) { | 398 | if (gss_msg == gss_new) { |
398 | int res = rpc_queue_upcall(gss_auth->dentry->d_inode, &gss_new->msg); | 399 | struct inode *inode = &gss_new->inode->vfs_inode; |
400 | int res = rpc_queue_upcall(inode, &gss_new->msg); | ||
399 | if (res) { | 401 | if (res) { |
400 | gss_unhash_msg(gss_new); | 402 | gss_unhash_msg(gss_new); |
401 | gss_msg = ERR_PTR(res); | 403 | gss_msg = ERR_PTR(res); |
@@ -426,7 +428,7 @@ gss_refresh_upcall(struct rpc_task *task) | |||
426 | struct gss_cred *gss_cred = container_of(cred, | 428 | struct gss_cred *gss_cred = container_of(cred, |
427 | struct gss_cred, gc_base); | 429 | struct gss_cred, gc_base); |
428 | struct gss_upcall_msg *gss_msg; | 430 | struct gss_upcall_msg *gss_msg; |
429 | struct inode *inode = gss_auth->dentry->d_inode; | 431 | struct inode *inode; |
430 | int err = 0; | 432 | int err = 0; |
431 | 433 | ||
432 | dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid, | 434 | dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid, |
@@ -444,6 +446,7 @@ gss_refresh_upcall(struct rpc_task *task) | |||
444 | err = PTR_ERR(gss_msg); | 446 | err = PTR_ERR(gss_msg); |
445 | goto out; | 447 | goto out; |
446 | } | 448 | } |
449 | inode = &gss_msg->inode->vfs_inode; | ||
447 | spin_lock(&inode->i_lock); | 450 | spin_lock(&inode->i_lock); |
448 | if (gss_cred->gc_upcall != NULL) | 451 | if (gss_cred->gc_upcall != NULL) |
449 | rpc_sleep_on(&gss_cred->gc_upcall->rpc_waitqueue, task, NULL); | 452 | rpc_sleep_on(&gss_cred->gc_upcall->rpc_waitqueue, task, NULL); |
@@ -470,7 +473,7 @@ out: | |||
470 | static inline int | 473 | static inline int |
471 | gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred) | 474 | gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred) |
472 | { | 475 | { |
473 | struct inode *inode = gss_auth->dentry->d_inode; | 476 | struct inode *inode; |
474 | struct rpc_cred *cred = &gss_cred->gc_base; | 477 | struct rpc_cred *cred = &gss_cred->gc_base; |
475 | struct gss_upcall_msg *gss_msg; | 478 | struct gss_upcall_msg *gss_msg; |
476 | DEFINE_WAIT(wait); | 479 | DEFINE_WAIT(wait); |
@@ -492,6 +495,7 @@ retry: | |||
492 | err = PTR_ERR(gss_msg); | 495 | err = PTR_ERR(gss_msg); |
493 | goto out; | 496 | goto out; |
494 | } | 497 | } |
498 | inode = &gss_msg->inode->vfs_inode; | ||
495 | for (;;) { | 499 | for (;;) { |
496 | prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_INTERRUPTIBLE); | 500 | prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_INTERRUPTIBLE); |
497 | spin_lock(&inode->i_lock); | 501 | spin_lock(&inode->i_lock); |