From: "Brian J. Murrell" <brian@interlinx.bc.ca>
To: Trond.Myklebust@netapp.com
Cc: linux-nfs@vger.kernel.org
Subject: Re: different kernels mean NFS4/GSSAPI works or doesn't
Date: Fri, 01 Apr 2011 09:02:33 -0400 [thread overview]
Message-ID: <4D95CCE9.1060103@interlinx.bc.ca> (raw)
In-Reply-To: <4D931D67.3050003@interlinx.bc.ca>
[-- Attachment #1: Type: text/plain, Size: 9526 bytes --]
On 11-03-30 08:09 AM, Brian J. Murrell wrote:
>
> OK. So I have linux-2.6.32.11.tar.bz2 and patch-2.6.32.12.bz2 from
> kernel.org.
>
> patch-2.6.32.12.bz2 doesn't apply cleanly to the linux-2.6.32.11 tree
> that's in linux-2.6.32.11.tar.bz2 though:
>
> # bzcat ../patch-2.6.32.12.bz2 | patch -p1 --dry-run
> patching file Documentation/Changes
> Reversed (or previously applied) patch detected! Assume -R? [n]
OK. I figured this out. .12 patch is to 2.6.32 not 2.6.32.11.
Any ideas on which of the below I should try backing out in my .12 build
to see which might be causing the problem?
> diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c
> index fc6a43c..2370ab4 100644
> --- a/net/sunrpc/auth_gss/auth_gss.c
> +++ b/net/sunrpc/auth_gss/auth_gss.c
> @@ -485,7 +485,7 @@ gss_refresh_upcall(struct rpc_task *task)
> dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid,
> cred->cr_uid);
> gss_msg = gss_setup_upcall(task->tk_client, gss_auth, cred);
> - if (IS_ERR(gss_msg) == -EAGAIN) {
> + if (PTR_ERR(gss_msg) == -EAGAIN) {
> /* XXX: warning on the first, under the assumption we
> * shouldn't normally hit this case on a refresh. */
> warn_gssd();
> @@ -644,7 +644,22 @@ gss_pipe_downcall(struct file *filp, const char
> __user *src, size_t mlen)
> p = gss_fill_context(p, end, ctx, gss_msg->auth->mech);
> if (IS_ERR(p)) {
> err = PTR_ERR(p);
> - gss_msg->msg.errno = (err == -EAGAIN) ? -EAGAIN : -EACCES;
> + switch (err) {
> + case -EACCES:
> + gss_msg->msg.errno = err;
> + err = mlen;
> + break;
> + case -EFAULT:
> + case -ENOMEM:
> + case -EINVAL:
> + case -ENOSYS:
> + gss_msg->msg.errno = -EAGAIN;
> + break;
> + default:
> + printk(KERN_CRIT "%s: bad return from "
> + "gss_fill_context: %ld\n", __func__, err);
> + BUG();
> + }
> goto err_release_msg;
> }
> gss_msg->ctx = gss_get_ctx(ctx);
> @@ -1258,9 +1273,8 @@ alloc_enc_pages(struct rpc_rqst *rqstp)
> rqstp->rq_release_snd_buf = priv_release_snd_buf;
> return 0;
> out_free:
> - for (i--; i >= 0; i--) {
> - __free_page(rqstp->rq_enc_pages[i]);
> - }
> + rqstp->rq_enc_pages_num = i;
> + priv_release_snd_buf(rqstp);
> out:
> return -EAGAIN;
> }
> diff --git a/net/sunrpc/auth_gss/gss_krb5_mech.c
> b/net/sunrpc/auth_gss/gss_krb5_mech.c
> index ef45eba..2deb0ed 100644
> --- a/net/sunrpc/auth_gss/gss_krb5_mech.c
> +++ b/net/sunrpc/auth_gss/gss_krb5_mech.c
> @@ -131,8 +131,10 @@ gss_import_sec_context_kerberos(const void *p,
> struct krb5_ctx *ctx;
> int tmp;
>
> - if (!(ctx = kzalloc(sizeof(*ctx), GFP_NOFS)))
> + if (!(ctx = kzalloc(sizeof(*ctx), GFP_NOFS))) {
> + p = ERR_PTR(-ENOMEM);
> goto out_err;
> + }
>
> p = simple_get_bytes(p, end, &ctx->initiate, sizeof(ctx->initiate));
> if (IS_ERR(p))
> diff --git a/net/sunrpc/auth_gss/gss_mech_switch.c
> b/net/sunrpc/auth_gss/gss_mech_switch.c
> index 6efbb0c..76e4c6f 100644
> --- a/net/sunrpc/auth_gss/gss_mech_switch.c
> +++ b/net/sunrpc/auth_gss/gss_mech_switch.c
> @@ -252,7 +252,7 @@ gss_import_sec_context(const void *input_token,
> size_t bufsize,
> struct gss_ctx **ctx_id)
> {
> if (!(*ctx_id = kzalloc(sizeof(**ctx_id), GFP_KERNEL)))
> - return GSS_S_FAILURE;
> + return -ENOMEM;
> (*ctx_id)->mech_type = gss_mech_get(mech);
>
> return mech->gm_ops
> diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
> index 49278f8..27a2378 100644
> --- a/net/sunrpc/rpc_pipe.c
> +++ b/net/sunrpc/rpc_pipe.c
> @@ -587,6 +587,8 @@ static struct dentry
> *__rpc_lookup_create_exclusive(struct dentry *parent,
> struct dentry *dentry;
>
> dentry = __rpc_lookup_create(parent, name);
> + if (IS_ERR(dentry))
> + return dentry;
> if (dentry->d_inode == NULL)
> return dentry;
> dput(dentry);
> diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
> index df124f7..3fbd6ba 100644
> --- a/net/sunrpc/svc_xprt.c
> +++ b/net/sunrpc/svc_xprt.c
> @@ -711,7 +711,10 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
> spin_unlock_bh(&pool->sp_lock);
>
> len = 0;
> - if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) {
> + if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
> + dprintk("svc_recv: found XPT_CLOSE\n");
> + svc_delete_xprt(xprt);
> + } else if (test_bit(XPT_LISTENER, &xprt->xpt_flags)) {
> struct svc_xprt *newxpt;
> newxpt = xprt->xpt_ops->xpo_accept(xprt);
> if (newxpt) {
> @@ -737,7 +740,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
> svc_xprt_received(newxpt);
> }
> svc_xprt_received(xprt);
> - } else if (!test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
> + } else {
> dprintk("svc: server %p, pool %u, transport %p, inuse=%d\n",
> rqstp, pool->sp_id, xprt,
> atomic_read(&xprt->xpt_ref.refcount));
> @@ -750,11 +753,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
> dprintk("svc: got len=%d\n", len);
> }
>
> - if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {
> - dprintk("svc_recv: found XPT_CLOSE\n");
> - svc_delete_xprt(xprt);
> - }
> -
> /* No data, incomplete (TCP) read, or accept() */
> if (len == 0 || len == -EAGAIN) {
> rqstp->rq_res.len = 0;
> @@ -900,11 +898,8 @@ void svc_delete_xprt(struct svc_xprt *xprt)
> if (test_bit(XPT_TEMP, &xprt->xpt_flags))
> serv->sv_tmpcnt--;
>
> - for (dr = svc_deferred_dequeue(xprt); dr;
> - dr = svc_deferred_dequeue(xprt)) {
> - svc_xprt_put(xprt);
> + while ((dr = svc_deferred_dequeue(xprt)) != NULL)
> kfree(dr);
> - }
>
> svc_xprt_put(xprt);
> spin_unlock_bh(&serv->sv_lock);
> diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c
> index 117f68a..97cc3de 100644
> --- a/net/sunrpc/svcauth_unix.c
> +++ b/net/sunrpc/svcauth_unix.c
> @@ -655,23 +655,25 @@ static struct unix_gid *unix_gid_lookup(uid_t uid)
> return NULL;
> }
>
> -static int unix_gid_find(uid_t uid, struct group_info **gip,
> - struct svc_rqst *rqstp)
> +static struct group_info *unix_gid_find(uid_t uid, struct svc_rqst *rqstp)
> {
> - struct unix_gid *ug = unix_gid_lookup(uid);
> + struct unix_gid *ug;
> + struct group_info *gi;
> + int ret;
> +
> + ug = unix_gid_lookup(uid);
> if (!ug)
> - return -EAGAIN;
> - switch (cache_check(&unix_gid_cache, &ug->h, &rqstp->rq_chandle)) {
> + return ERR_PTR(-EAGAIN);
> + ret = cache_check(&unix_gid_cache, &ug->h, &rqstp->rq_chandle);
> + switch (ret) {
> case -ENOENT:
> - *gip = NULL;
> - return 0;
> + return ERR_PTR(-ENOENT);
> case 0:
> - *gip = ug->gi;
> - get_group_info(*gip);
> + gi = get_group_info(ug->gi);
> cache_put(&ug->h, &unix_gid_cache);
> - return 0;
> + return gi;
> default:
> - return -EAGAIN;
> + return ERR_PTR(-EAGAIN);
> }
> }
>
> @@ -681,6 +683,8 @@ svcauth_unix_set_client(struct svc_rqst *rqstp)
> struct sockaddr_in *sin;
> struct sockaddr_in6 *sin6, sin6_storage;
> struct ip_map *ipm;
> + struct group_info *gi;
> + struct svc_cred *cred = &rqstp->rq_cred;
>
> switch (rqstp->rq_addr.ss_family) {
> case AF_INET:
> @@ -722,6 +726,17 @@ svcauth_unix_set_client(struct svc_rqst *rqstp)
> ip_map_cached_put(rqstp, ipm);
> break;
> }
> +
> + gi = unix_gid_find(cred->cr_uid, rqstp);
> + switch (PTR_ERR(gi)) {
> + case -EAGAIN:
> + return SVC_DROP;
> + case -ENOENT:
> + break;
> + default:
> + put_group_info(cred->cr_group_info);
> + cred->cr_group_info = gi;
> + }
> return SVC_OK;
> }
>
> @@ -818,19 +833,11 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32
> *authp)
> slen = svc_getnl(argv); /* gids length */
> if (slen > 16 || (len -= (slen + 2)*4) < 0)
> goto badcred;
> - if (unix_gid_find(cred->cr_uid, &cred->cr_group_info, rqstp)
> - == -EAGAIN)
> + cred->cr_group_info = groups_alloc(slen);
> + if (cred->cr_group_info == NULL)
> return SVC_DROP;
> - if (cred->cr_group_info == NULL) {
> - cred->cr_group_info = groups_alloc(slen);
> - if (cred->cr_group_info == NULL)
> - return SVC_DROP;
> - for (i = 0; i < slen; i++)
> - GROUP_AT(cred->cr_group_info, i) = svc_getnl(argv);
> - } else {
> - for (i = 0; i < slen ; i++)
> - svc_getnl(argv);
> - }
> + for (i = 0; i < slen; i++)
> + GROUP_AT(cred->cr_group_info, i) = svc_getnl(argv);
> if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
> *authp = rpc_autherr_badverf;
> return SVC_DENIED;
> diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
> index 1c246a4..70b0a22 100644
> --- a/net/sunrpc/svcsock.c
> +++ b/net/sunrpc/svcsock.c
> @@ -968,6 +968,7 @@ static int svc_tcp_recv_record(struct svc_sock
> *svsk, struct svc_rqst *rqstp)
> return len;
> err_delete:
> set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags);
> + svc_xprt_received(&svsk->sk_xprt);
> err_again:
> return -EAGAIN;
> }
> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
> index 37c5475..5cdbf7c 100644
> --- a/net/sunrpc/xprtsock.c
> +++ b/net/sunrpc/xprtsock.c
> @@ -1926,6 +1926,11 @@ static void xs_tcp_setup_socket(struct rpc_xprt
> *xprt,
> case -EALREADY:
> xprt_clear_connecting(xprt);
> return;
> + case -EINVAL:
> + /* Happens, for instance, if the user specified a link
> + * local IPv6 address without a scope-id.
> + */
> + goto out;
> }
> out_eagain:
> status = -EAGAIN;
>
> Anything jump out at you?
>
> b.
>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
prev parent reply other threads:[~2011-04-01 13:02 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-22 23:27 different kernels mean NFS4/GSSAPI works or doesn't Brian J. Murrell
2011-03-23 2:41 ` Kevin Coffman
2011-03-23 11:03 ` Brian J. Murrell
2011-03-23 14:29 ` Kevin Coffman
[not found] ` <AANLkTi=b1z0MrYYQmidbra0EHanegcLO5qoOScLq21rb-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-03-23 15:07 ` Brian J. Murrell
2011-03-23 17:07 ` Trond Myklebust
2011-03-27 0:07 ` Brian J. Murrell
[not found] ` <1300900035.11677.12.camel-SyLVLa/KEI9HwK5hSS5vWB2eb7JE58TQ@public.gmane.org>
2011-03-27 12:42 ` Brian J. Murrell
2011-03-30 12:09 ` Brian J. Murrell
2011-04-01 13:02 ` Brian J. Murrell [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D95CCE9.1060103@interlinx.bc.ca \
--to=brian@interlinx.bc.ca \
--cc=Trond.Myklebust@netapp.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).