Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48e49187 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Fix "EPIPE" error on mount of rpcsec_gss-protected partitions



 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: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 29884df0
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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;
	do {
		err = gss_create_upcall(gss_auth, cred);
	} while (err == -EAGAIN);
	if (err < 0)
		goto out_err;

+2 −2
Original line number Diff line number Diff line
@@ -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: