SUNRPC set gss gc_expiry to full lifetime
authorAndy Adamson <andros@netapp.com>
Tue, 27 Nov 2012 15:34:20 +0000 (10:34 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 12 Dec 2012 20:35:59 +0000 (15:35 -0500)
Only use the default GSSD_MIN_TIMEOUT if the gss downcall timeout is zero.
Store the full lifetime in gc_expiry (not 3/4 of the lifetime) as subsequent
patches will use the gc_expiry to determine buffered WRITE behavior in the
face of expired or soon to be expired gss credentials.

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

index 909dc0c..6e5c824 100644 (file)
@@ -192,17 +192,23 @@ gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct
        const void *q;
        unsigned int seclen;
        unsigned int timeout;
+       unsigned long now = jiffies;
        u32 window_size;
        int ret;
 
-       /* First unsigned int gives the lifetime (in seconds) of the cred */
+       /* First unsigned int gives the remaining lifetime in seconds of the
+        * credential - e.g. the remaining TGT lifetime for Kerberos or
+        * the -t value passed to GSSD.
+        */
        p = simple_get_bytes(p, end, &timeout, sizeof(timeout));
        if (IS_ERR(p))
                goto err;
        if (timeout == 0)
                timeout = GSSD_MIN_TIMEOUT;
-       ctx->gc_expiry = jiffies + (unsigned long)timeout * HZ * 3 / 4;
-       /* Sequence number window. Determines the maximum number of simultaneous requests */
+       ctx->gc_expiry = now + ((unsigned long)timeout * HZ);
+       /* Sequence number window. Determines the maximum number of
+        * simultaneous requests
+        */
        p = simple_get_bytes(p, end, &window_size, sizeof(window_size));
        if (IS_ERR(p))
                goto err;
@@ -237,9 +243,12 @@ gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct
                p = ERR_PTR(ret);
                goto err;
        }
+       dprintk("RPC:       %s Success. gc_expiry %lu now %lu timeout %u\n",
+               __func__, ctx->gc_expiry, now, timeout);
        return q;
 err:
-       dprintk("RPC:       %s returning %ld\n", __func__, -PTR_ERR(p));
+       dprintk("RPC:       %s returns %ld gc_expiry %lu now %lu timeout %u\n",
+               __func__, -PTR_ERR(p), ctx->gc_expiry, now, timeout);
        return p;
 }