Re: [PATCH 3/5] SUNRPC: split upcall function to extract reusable parts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Apr 17, 2012 at 09:39:06AM -0400, Simo Sorce wrote:
> This is needed to share code between the current server upcall mechanism
> and the new gssproxy upcall mechanism introduced in a following patch.

I'll go ahead and take this now, as it seems like reasonable cleanup
independent of the rest.

--b.

> 
> Signed-off-by: Simo Sorce <simo@xxxxxxxxxx>
> ---
>  net/sunrpc/auth_gss/svcauth_gss.c |  110 +++++++++++++++++++++++--------------
>  1 files changed, 69 insertions(+), 41 deletions(-)
> 
> diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c
> index 274df6410057fa23e991545d80fdb90ab37e0b6f..aa1b649749741c82e60f0f528ac645197fd7ab35 100644
> --- a/net/sunrpc/auth_gss/svcauth_gss.c
> +++ b/net/sunrpc/auth_gss/svcauth_gss.c
> @@ -965,16 +965,17 @@ svcauth_gss_set_client(struct svc_rqst *rqstp)
>  }
>  
>  static inline int
> -gss_write_init_verf(struct cache_detail *cd, struct svc_rqst *rqstp, struct rsi *rsip)
> +gss_write_init_verf(struct cache_detail *cd, struct svc_rqst *rqstp,
> +		struct xdr_netobj *out_handle, int *major_status)
>  {
>  	struct rsc *rsci;
>  	int        rc;
>  
> -	if (rsip->major_status != GSS_S_COMPLETE)
> +	if (*major_status != GSS_S_COMPLETE)
>  		return gss_write_null_verf(rqstp);
> -	rsci = gss_svc_searchbyctx(cd, &rsip->out_handle);
> +	rsci = gss_svc_searchbyctx(cd, out_handle);
>  	if (rsci == NULL) {
> -		rsip->major_status = GSS_S_NO_CONTEXT;
> +		*major_status = GSS_S_NO_CONTEXT;
>  		return gss_write_null_verf(rqstp);
>  	}
>  	rc = gss_write_verf(rqstp, rsci->mechctx, GSS_SEQ_WIN);
> @@ -982,6 +983,61 @@ gss_write_init_verf(struct cache_detail *cd, struct svc_rqst *rqstp, struct rsi
>  	return rc;
>  }
>  
> +static inline int
> +gss_read_verf(struct rpc_gss_wire_cred *gc,
> +	      struct kvec *argv, __be32 *authp,
> +	      struct xdr_netobj *in_handle,
> +	      struct xdr_netobj *in_token)
> +{
> +	struct xdr_netobj tmpobj;
> +
> +	/* Read the verifier; should be NULL: */
> +	*authp = rpc_autherr_badverf;
> +	if (argv->iov_len < 2 * 4)
> +		return SVC_DENIED;
> +	if (svc_getnl(argv) != RPC_AUTH_NULL)
> +		return SVC_DENIED;
> +	if (svc_getnl(argv) != 0)
> +		return SVC_DENIED;
> +	/* Martial context handle and token for upcall: */
> +	*authp = rpc_autherr_badcred;
> +	if (gc->gc_proc == RPC_GSS_PROC_INIT && gc->gc_ctx.len != 0)
> +		return SVC_DENIED;
> +	if (dup_netobj(in_handle, &gc->gc_ctx))
> +		return SVC_CLOSE;
> +	*authp = rpc_autherr_badverf;
> +	if (svc_safe_getnetobj(argv, &tmpobj)) {
> +		kfree(in_handle->data);
> +		return SVC_DENIED;
> +	}
> +	if (dup_netobj(in_token, &tmpobj)) {
> +		kfree(in_handle->data);
> +		return SVC_CLOSE;
> +	}
> +
> +	return 0;
> +}
> +
> +static inline int
> +gss_write_resv(struct kvec *resv, size_t size_limit,
> +	       struct xdr_netobj *out_handle, struct xdr_netobj *out_token,
> +	       int major_status, int minor_status)
> +{
> +	if (resv->iov_len + 4 > size_limit)
> +		return -1;
> +	svc_putnl(resv, RPC_SUCCESS);
> +	if (svc_safe_putnetobj(resv, out_handle))
> +		return -1;
> +	if (resv->iov_len + 3 * 4 > size_limit)
> +		return -1;
> +	svc_putnl(resv, major_status);
> +	svc_putnl(resv, minor_status);
> +	svc_putnl(resv, GSS_SEQ_WIN);
> +	if (svc_safe_putnetobj(resv, out_token))
> +		return -1;
> +	return 0;
> +}
> +
>  /*
>   * Having read the cred already and found we're in the context
>   * initiation case, read the verifier and initiate (or check the results
> @@ -994,36 +1050,15 @@ static int svcauth_gss_handle_init(struct svc_rqst *rqstp,
>  {
>  	struct kvec *argv = &rqstp->rq_arg.head[0];
>  	struct kvec *resv = &rqstp->rq_res.head[0];
> -	struct xdr_netobj tmpobj;
>  	struct rsi *rsip, rsikey;
>  	int ret;
>  	struct sunrpc_net *sn = net_generic(rqstp->rq_xprt->xpt_net, sunrpc_net_id);
>  
> -	/* Read the verifier; should be NULL: */
> -	*authp = rpc_autherr_badverf;
> -	if (argv->iov_len < 2 * 4)
> -		return SVC_DENIED;
> -	if (svc_getnl(argv) != RPC_AUTH_NULL)
> -		return SVC_DENIED;
> -	if (svc_getnl(argv) != 0)
> -		return SVC_DENIED;
> -
> -	/* Martial context handle and token for upcall: */
> -	*authp = rpc_autherr_badcred;
> -	if (gc->gc_proc == RPC_GSS_PROC_INIT && gc->gc_ctx.len != 0)
> -		return SVC_DENIED;
>  	memset(&rsikey, 0, sizeof(rsikey));
> -	if (dup_netobj(&rsikey.in_handle, &gc->gc_ctx))
> -		return SVC_CLOSE;
> -	*authp = rpc_autherr_badverf;
> -	if (svc_safe_getnetobj(argv, &tmpobj)) {
> -		kfree(rsikey.in_handle.data);
> -		return SVC_DENIED;
> -	}
> -	if (dup_netobj(&rsikey.in_token, &tmpobj)) {
> -		kfree(rsikey.in_handle.data);
> -		return SVC_CLOSE;
> -	}
> +	ret = gss_read_verf(gc, argv, authp,
> +			    &rsikey.in_handle, &rsikey.in_token);
> +	if (ret)
> +		return ret;
>  
>  	/* Perform upcall, or find upcall result: */
>  	rsip = rsi_lookup(sn->rsi_cache, &rsikey);
> @@ -1036,19 +1071,12 @@ static int svcauth_gss_handle_init(struct svc_rqst *rqstp,
>  
>  	ret = SVC_CLOSE;
>  	/* Got an answer to the upcall; use it: */
> -	if (gss_write_init_verf(sn->rsc_cache, rqstp, rsip))
> +	if (gss_write_init_verf(sn->rsc_cache, rqstp,
> +				&rsip->out_handle, &rsip->major_status))
>  		goto out;
> -	if (resv->iov_len + 4 > PAGE_SIZE)
> -		goto out;
> -	svc_putnl(resv, RPC_SUCCESS);
> -	if (svc_safe_putnetobj(resv, &rsip->out_handle))
> -		goto out;
> -	if (resv->iov_len + 3 * 4 > PAGE_SIZE)
> -		goto out;
> -	svc_putnl(resv, rsip->major_status);
> -	svc_putnl(resv, rsip->minor_status);
> -	svc_putnl(resv, GSS_SEQ_WIN);
> -	if (svc_safe_putnetobj(resv, &rsip->out_token))
> +	if (gss_write_resv(resv, PAGE_SIZE,
> +			   &rsip->out_handle, &rsip->out_token,
> +			   rsip->major_status, rsip->minor_status))
>  		goto out;
>  
>  	ret = SVC_COMPLETE;
> -- 
> 1.7.7.6
> 
--
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


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux