diff options
| -rw-r--r-- | fs/nfsd/nfs4xdr.c | 4 | ||||
| -rw-r--r-- | include/linux/sunrpc/svc_xprt.h | 1 | ||||
| -rw-r--r-- | net/sunrpc/auth_gss/svcauth_gss.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/svc_xprt.c | 10 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 2 | 
5 files changed, 12 insertions, 7 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 7ecf16be4a44..8fae53ce21d1 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2440,7 +2440,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,  	p++;                /* to be backfilled later */  	if (bmval0 & FATTR4_WORD0_SUPPORTED_ATTRS) { -		u32 *supp = nfsd_suppattrs[minorversion]; +		u32 supp[3]; + +		memcpy(supp, nfsd_suppattrs[minorversion], sizeof(supp));  		if (!IS_POSIXACL(dentry->d_inode))  			supp[0] &= ~FATTR4_WORD0_ACL; diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index e5d193440374..7440290f64ac 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h @@ -66,6 +66,7 @@ struct svc_xprt {  #define XPT_LISTENER	10		/* listening endpoint */  #define XPT_CACHE_AUTH	11		/* cache auth info */  #define XPT_LOCAL	12		/* connection from loopback interface */ +#define XPT_KILL_TEMP   13		/* call xpo_kill_temp_xprt before closing */  	struct svc_serv		*xpt_server;	/* service for transport */  	atomic_t    	    	xpt_reserved;	/* space on outq that is rsvd */ diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 886e9d381771..153082598522 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c @@ -1489,7 +1489,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp)  	case RPC_GSS_PROC_DESTROY:  		if (gss_write_verf(rqstp, rsci->mechctx, gc->gc_seq))  			goto auth_err; -		rsci->h.expiry_time = get_seconds(); +		rsci->h.expiry_time = seconds_since_boot();  		set_bit(CACHE_NEGATIVE, &rsci->h.flags);  		if (resv->iov_len + 4 > PAGE_SIZE)  			goto drop; diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 3bc1d61694cb..9c9db55a0c1e 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -799,6 +799,8 @@ static int svc_handle_xprt(struct svc_rqst *rqstp, struct svc_xprt *xprt)  	if (test_bit(XPT_CLOSE, &xprt->xpt_flags)) {  		dprintk("svc_recv: found XPT_CLOSE\n"); +		if (test_and_clear_bit(XPT_KILL_TEMP, &xprt->xpt_flags)) +			xprt->xpt_ops->xpo_kill_temp_xprt(xprt);  		svc_delete_xprt(xprt);  		/* Leave XPT_BUSY set on the dead xprt: */  		goto out; @@ -1020,9 +1022,11 @@ void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr)  		le = to_be_closed.next;  		list_del_init(le);  		xprt = list_entry(le, struct svc_xprt, xpt_list); -		dprintk("svc_age_temp_xprts_now: closing %p\n", xprt); -		xprt->xpt_ops->xpo_kill_temp_xprt(xprt); -		svc_close_xprt(xprt); +		set_bit(XPT_CLOSE, &xprt->xpt_flags); +		set_bit(XPT_KILL_TEMP, &xprt->xpt_flags); +		dprintk("svc_age_temp_xprts_now: queuing xprt %p for closing\n", +				xprt); +		svc_xprt_enqueue(xprt);  	}  }  EXPORT_SYMBOL_GPL(svc_age_temp_xprts_now); diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index 57d35fbb1c28..172b537f8cfc 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c @@ -347,8 +347,6 @@ int rdma_read_chunk_frmr(struct svcxprt_rdma *xprt,  	atomic_inc(&rdma_stat_read);  	return ret;   err: -	ib_dma_unmap_sg(xprt->sc_cm_id->device, -			frmr->sg, frmr->sg_nents, frmr->direction);  	svc_rdma_put_context(ctxt, 0);  	svc_rdma_put_frmr(xprt, frmr);  	return ret;  | 

