When handling the gssd downcall, the kernel should distinguish between a successful downcall that contains an error code and a failed downcall (i.e. where the parsing failed or some other sort of problem occurred). In the former case, gss_pipe_downcall should be returning the number of bytes written to the pipe instead of an error. Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> --- net/sunrpc/auth_gss/auth_gss.c | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-) diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 3c3c50f..03cc5a4 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c @@ -184,7 +184,8 @@ gss_alloc_context(void) #define GSSD_MIN_TIMEOUT (60 * 60) static const void * -gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct gss_api_mech *gm) +gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, + struct gss_api_mech *gm, ssize_t *downcall_err) { const void *q; unsigned int seclen; @@ -208,6 +209,7 @@ gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct if (ctx->gc_win == 0) { /* in which case, p points to an error code which we ignore */ p = ERR_PTR(-EACCES); + *downcall_err = -EACCES; goto err; } /* copy the opaque wire context */ @@ -641,10 +643,21 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) list_del_init(&gss_msg->list); spin_unlock(&inode->i_lock); - p = gss_fill_context(p, end, ctx, gss_msg->auth->mech); + err = 0; + p = gss_fill_context(p, end, ctx, gss_msg->auth->mech, &err); if (IS_ERR(p)) { - err = PTR_ERR(p); - gss_msg->msg.errno = (err == -EAGAIN) ? -EAGAIN : -EACCES; + /* + * a non-zero downcall_err indicates that downcall write was + * OK, but contained a zero gc_win (and hence an error code). + */ + if (err) { + gss_msg->msg.errno = err; + err = mlen; + } else { + err = PTR_ERR(p); + gss_msg->msg.errno = (err == -EAGAIN) ? + -EAGAIN : -EACCES; + } goto err_release_msg; } gss_msg->ctx = gss_get_ctx(ctx); -- 1.6.5.2 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html