Re: [PATCH 3/6] sunrpc: close connection when a request is irretrievably lost.

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

 



Apologies for the delay getting to the rest of these.

On Thu, Aug 12, 2010 at 05:04:07PM +1000, NeilBrown wrote:
> If we drop a request in the sunrpc layer, either due kmalloc failure,
> or due to a cache miss when we could not queue the request for later
> replay, then close the connection to encourage the client to retry sooner.
> 
> Note that if the drop happens in the NFS layer, NFSERR_JUKEBOX
> (aka NFS4ERR_DELAY) is returned to guide the client concerning
> replay.

Looks fine, but:

> diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
> index d9017d6..6359c42 100644
> --- a/net/sunrpc/svc.c
> +++ b/net/sunrpc/svc.c
> @@ -1055,6 +1055,9 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
>  		goto err_bad;
>  	case SVC_DENIED:
>  		goto err_bad_auth;
> +	case SVC_CLOSE:
> +		if (test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
> +			svc_close_xprt(rqstp->rq_xprt);

There are also dropit's later in svc_process_common when xdr encoding
fails.  I wonder if we should close there?

Well, it's an odd case.  Seems like it should almost be declared a
programming error and made a WARN().

Applying as is.--b.

>  	case SVC_DROP:
>  		goto dropit;
>  	case SVC_COMPLETE:
> diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c
> index 2073116..e91b550 100644
> --- a/net/sunrpc/svcauth_unix.c
> +++ b/net/sunrpc/svcauth_unix.c
> @@ -674,6 +674,8 @@ static struct group_info *unix_gid_find(uid_t uid, struct svc_rqst *rqstp)
>  	switch (ret) {
>  	case -ENOENT:
>  		return ERR_PTR(-ENOENT);
> +	case -ETIMEDOUT:
> +		return ERR_PTR(-ESHUTDOWN);
>  	case 0:
>  		gi = get_group_info(ug->gi);
>  		cache_put(&ug->h, &unix_gid_cache);
> @@ -720,8 +722,9 @@ svcauth_unix_set_client(struct svc_rqst *rqstp)
>  	switch (cache_check(&ip_map_cache, &ipm->h, &rqstp->rq_chandle)) {
>  		default:
>  			BUG();
> -		case -EAGAIN:
>  		case -ETIMEDOUT:
> +			return SVC_CLOSE;
> +		case -EAGAIN:
>  			return SVC_DROP;
>  		case -ENOENT:
>  			return SVC_DENIED;
> @@ -736,6 +739,8 @@ svcauth_unix_set_client(struct svc_rqst *rqstp)
>  	switch (PTR_ERR(gi)) {
>  	case -EAGAIN:
>  		return SVC_DROP;
> +	case -ESHUTDOWN:
> +		return SVC_CLOSE;
>  	case -ENOENT:
>  		break;
>  	default:
> @@ -776,7 +781,7 @@ svcauth_null_accept(struct svc_rqst *rqstp, __be32 *authp)
>  	cred->cr_gid = (gid_t) -1;
>  	cred->cr_group_info = groups_alloc(0);
>  	if (cred->cr_group_info == NULL)
> -		return SVC_DROP; /* kmalloc failure - client must retry */
> +		return SVC_CLOSE; /* kmalloc failure - client must retry */
>  
>  	/* Put NULL verifier */
>  	svc_putnl(resv, RPC_AUTH_NULL);
> @@ -840,7 +845,7 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
>  		goto badcred;
>  	cred->cr_group_info = groups_alloc(slen);
>  	if (cred->cr_group_info == NULL)
> -		return SVC_DROP;
> +		return SVC_CLOSE;
>  	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) {
> 
> 
--
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