]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] kNFSd: Assort fixes to nfsd auth cache stuff.
authorNeil Brown <neilb@cse.unsw.edu.au>
Fri, 14 Mar 2003 10:11:49 +0000 (02:11 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 14 Mar 2003 10:11:49 +0000 (02:11 -0800)
1/ call cache_fresh when replacing a cache entry (instead of only
  when updating) so that up-calls waiting on the replaced entry continue.

2/ in svcauth_unix_accept, don't put the verifier until all tests have
   succeeded.

3/ calculate size of request-being-deferred correctly.

include/linux/sunrpc/cache.h
net/sunrpc/svcauth_unix.c
net/sunrpc/svcsock.c

index a3cdc080dd85ff6091e2197b90b37928a959d3d5..1d3bccefe959f8a2b6fec335533506dddc9514ec 100644 (file)
@@ -190,6 +190,7 @@ RTN *FNAME ARGS                                                                             \
                        else read_unlock(&(DETAIL)->hash_lock);                         \
                        if (set)                                                        \
                                cache_fresh(DETAIL, &tmp->MEMBER, item->MEMBER.expiry_time); \
+                       if (set==1 && new) cache_fresh(DETAIL, &new->MEMBER, 0);        \
                        if (new) (DETAIL)->cache_put(&new->MEMBER, DETAIL);             \
                        return tmp;                                                     \
                }                                                                       \
index 4c3caba9f157bc2af35f5b64cda1dfd819b0b0b1..3397f58011e7f3dfb1dde72e7724385d0778c70a 100644 (file)
@@ -441,9 +441,6 @@ svcauth_unix_accept(struct svc_rqst *rqstp, u32 *authp)
                return SVC_DENIED;
        }
 
-       /* Put NULL verifier */
-       svc_putu32(resv, RPC_AUTH_NULL);
-       svc_putu32(resv, 0);
 
        key.m_class = rqstp->rq_server->sv_program->pg_class;
        key.m_addr = rqstp->rq_addr.sin_addr;
@@ -470,8 +467,13 @@ svcauth_unix_accept(struct svc_rqst *rqstp, u32 *authp)
                }
        else rv = SVC_DROP;
 
-       if (rqstp->rq_client == NULL && rqstp->rq_proc != 0)
+       if (rv  == SVC_OK && rqstp->rq_client == NULL && rqstp->rq_proc != 0)
                goto badcred;
+
+       /* Put NULL verifier */
+       svc_putu32(resv, RPC_AUTH_NULL);
+       svc_putu32(resv, 0);
+
        return rv;
 
 badcred:
index 671edb387e8cab95e8c8f5d4c65e0a7d9ecfe743..31eace23cab321e67ba65ac1b4dbaf68dabd64a4 100644 (file)
@@ -1438,7 +1438,7 @@ static struct cache_deferred_req *
 svc_defer(struct cache_req *req)
 {
        struct svc_rqst *rqstp = container_of(req, struct svc_rqst, rq_chandle);
-       int size = sizeof(struct svc_deferred_req) + (rqstp->rq_arg.head[0].iov_len);
+       int size = sizeof(struct svc_deferred_req) + (rqstp->rq_arg.len);
        struct svc_deferred_req *dr;
 
        if (rqstp->rq_arg.page_len)
@@ -1447,6 +1447,7 @@ svc_defer(struct cache_req *req)
                dr = rqstp->rq_deferred;
                rqstp->rq_deferred = NULL;
        } else {
+               int skip  = rqstp->rq_arg.len - rqstp->rq_arg.head[0].iov_len;
                /* FIXME maybe discard if size too large */
                dr = kmalloc(size, GFP_KERNEL);
                if (dr == NULL)
@@ -1455,8 +1456,8 @@ svc_defer(struct cache_req *req)
                dr->serv = rqstp->rq_server;
                dr->prot = rqstp->rq_prot;
                dr->addr = rqstp->rq_addr;
-               dr->argslen = rqstp->rq_arg.head[0].iov_len >> 2;
-               memcpy(dr->args, rqstp->rq_arg.head[0].iov_base, dr->argslen<<2);
+               dr->argslen = rqstp->rq_arg.len >> 2;
+               memcpy(dr->args, rqstp->rq_arg.head[0].iov_base-skip, dr->argslen<<2);
        }
        spin_lock(&rqstp->rq_server->sv_lock);
        rqstp->rq_sock->sk_inuse++;