SUNRPC: Fix "EPIPE" error on mount of rpcsec_gss-protected partitions
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Mon, 19 Dec 2005 22:11:22 +0000 (17:11 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 20 Dec 2005 04:12:21 +0000 (23:12 -0500)
 gss_create_upcall() should not error just because rpc.gssd closed the
 pipe on its end. Instead, it should requeue the pending requests and then
 retry.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/rpc_pipe.c

index f44f46f1d8e053c0d330b442c2f3788cf4073dd4..8d782282ec194c6f682fd71b2a100c25141c45c0 100644 (file)
@@ -638,7 +638,7 @@ gss_pipe_destroy_msg(struct rpc_pipe_msg *msg)
                                gss_msg);
                atomic_inc(&gss_msg->count);
                gss_unhash_msg(gss_msg);
-               if (msg->errno == -ETIMEDOUT || msg->errno == -EPIPE) {
+               if (msg->errno == -ETIMEDOUT) {
                        unsigned long now = jiffies;
                        if (time_after(now, ratelimit)) {
                                printk(KERN_WARNING "RPC: AUTH_GSS upcall timed out.\n"
@@ -786,7 +786,9 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int taskflags)
        cred->gc_flags = 0;
        cred->gc_base.cr_ops = &gss_credops;
        cred->gc_service = gss_auth->service;
-       err = gss_create_upcall(gss_auth, cred);
+       do {
+               err = gss_create_upcall(gss_auth, cred);
+       } while (err == -EAGAIN);
        if (err < 0)
                goto out_err;
 
index c76ea221798caf96666ef99ac3ce5c1694c832b7..16a2458f38f7055d889548289945cae243c5d844 100644 (file)
@@ -174,7 +174,7 @@ rpc_pipe_release(struct inode *inode, struct file *filp)
                goto out;
        msg = (struct rpc_pipe_msg *)filp->private_data;
        if (msg != NULL) {
-               msg->errno = -EPIPE;
+               msg->errno = -EAGAIN;
                list_del_init(&msg->list);
                rpci->ops->destroy_msg(msg);
        }
@@ -183,7 +183,7 @@ rpc_pipe_release(struct inode *inode, struct file *filp)
        if (filp->f_mode & FMODE_READ)
                rpci->nreaders --;
        if (!rpci->nreaders)
-               __rpc_purge_upcall(inode, -EPIPE);
+               __rpc_purge_upcall(inode, -EAGAIN);
        if (rpci->ops->release_pipe)
                rpci->ops->release_pipe(inode);
 out: