From: NeilBrown Call a helper function from svcauth_unix_accept() and svcauth_null_accept() instead of duplicating code. Signed-off-by: J. Bruce Fields Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- 25-akpm/net/sunrpc/svcauth_unix.c | 88 +++++++++++++++----------------------- 1 files changed, 36 insertions(+), 52 deletions(-) diff -puN net/sunrpc/svcauth_unix.c~knfsd-svcrpc-share-code-duplicated-between-auth_unix-and-auth_null net/sunrpc/svcauth_unix.c --- 25/net/sunrpc/svcauth_unix.c~knfsd-svcrpc-share-code-duplicated-between-auth_unix-and-auth_null 2004-11-15 22:06:54.217468080 -0800 +++ 25-akpm/net/sunrpc/svcauth_unix.c 2004-11-15 22:08:23.459901168 -0800 @@ -329,6 +329,38 @@ void svcauth_unix_purge(void) cache_purge(&auth_domain_cache); } +static int +svcauth_unix_set_client(struct svc_rqst *rqstp) +{ + struct ip_map key, *ipm; + + rqstp->rq_client = NULL; + if (rqstp->rq_proc == 0) + return SVC_OK; + + strcpy(key.m_class, rqstp->rq_server->sv_program->pg_class); + key.m_addr = rqstp->rq_addr.sin_addr; + + ipm = ip_map_lookup(&key, 0); + + if (ipm == NULL) + return SVC_DENIED; + + switch (cache_check(&ip_map_cache, &ipm->h, &rqstp->rq_chandle)) { + default: + BUG(); + case -EAGAIN: + return SVC_DROP; + case -ENOENT: + return SVC_DENIED; + case 0: + rqstp->rq_client = &ipm->m_client->h; + cache_get(&rqstp->rq_client->h); + ip_map_put(&ipm->h, &ip_map_cache); + break; + } + return SVC_OK; +} static int svcauth_null_accept(struct svc_rqst *rqstp, u32 *authp) @@ -337,7 +369,6 @@ svcauth_null_accept(struct svc_rqst *rqs struct kvec *resv = &rqstp->rq_res.head[0]; struct svc_cred *cred = &rqstp->rq_cred; int rv=0; - struct ip_map key, *ipm; cred->cr_group_info = NULL; rqstp->rq_client = NULL; @@ -363,30 +394,8 @@ svcauth_null_accept(struct svc_rqst *rqs if (cred->cr_group_info == NULL) return SVC_DROP; /* kmalloc failure - client must retry */ - strcpy(key.m_class, rqstp->rq_server->sv_program->pg_class); - key.m_addr = rqstp->rq_addr.sin_addr; - - ipm = ip_map_lookup(&key, 0); - - if (ipm) - switch (cache_check(&ip_map_cache, &ipm->h, &rqstp->rq_chandle)) { - case -EAGAIN: - rv = SVC_DROP; - break; - case -ENOENT: - rv = SVC_OK; /* rq_client is NULL */ - break; - case 0: - rqstp->rq_client = &ipm->m_client->h; - cache_get(&rqstp->rq_client->h); - ip_map_put(&ipm->h, &ip_map_cache); - rv = SVC_OK; - break; - default: BUG(); - } - else rv = SVC_DROP; - - if (rv == SVC_OK && rqstp->rq_client == NULL && rqstp->rq_proc != 0) + rv = svcauth_unix_set_client(rqstp); + if (rv == SVC_DENIED) goto badcred; /* Put NULL verifier */ @@ -432,7 +441,6 @@ svcauth_unix_accept(struct svc_rqst *rqs u32 slen, i; int len = argv->iov_len; int rv=0; - struct ip_map key, *ipm; cred->cr_group_info = NULL; rqstp->rq_client = NULL; @@ -464,32 +472,8 @@ svcauth_unix_accept(struct svc_rqst *rqs return SVC_DENIED; } - - strcpy(key.m_class, rqstp->rq_server->sv_program->pg_class); - key.m_addr = rqstp->rq_addr.sin_addr; - - - ipm = ip_map_lookup(&key, 0); - - if (ipm) - switch (cache_check(&ip_map_cache, &ipm->h, &rqstp->rq_chandle)) { - case -EAGAIN: - rv = SVC_DROP; - break; - case -ENOENT: - rv = SVC_OK; /* rq_client is NULL */ - break; - case 0: - rqstp->rq_client = &ipm->m_client->h; - cache_get(&rqstp->rq_client->h); - ip_map_put(&ipm->h, &ip_map_cache); - rv = SVC_OK; - break; - default: BUG(); - } - else rv = SVC_DROP; - - if (rv == SVC_OK && rqstp->rq_client == NULL && rqstp->rq_proc != 0) + rv = svcauth_unix_set_client(rqstp); + if (rv == SVC_DENIED) goto badcred; /* Put NULL verifier */ _