diff options
Diffstat (limited to 'fs/nfsd/nfs4proc.c')
| -rw-r--r-- | fs/nfsd/nfs4proc.c | 21 | 
1 files changed, 16 insertions, 5 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index e466cf52d7d7..7f7e6bb23a90 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -988,10 +988,11 @@ nfsd4_read(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,  static void  nfsd4_read_release(union nfsd4_op_u *u)  { -	if (u->read.rd_nf) +	if (u->read.rd_nf) { +		trace_nfsd_read_done(u->read.rd_rqstp, u->read.rd_fhp, +				     u->read.rd_offset, u->read.rd_length);  		nfsd_file_put(u->read.rd_nf); -	trace_nfsd_read_done(u->read.rd_rqstp, u->read.rd_fhp, -			     u->read.rd_offset, u->read.rd_length); +	}  }  static __be32 @@ -2892,10 +2893,20 @@ nfsd4_proc_compound(struct svc_rqst *rqstp)  	rqstp->rq_lease_breaker = (void **)&cstate->clp; -	trace_nfsd_compound(rqstp, args->tag, args->taglen, args->opcnt); +	trace_nfsd_compound(rqstp, args->tag, args->taglen, args->client_opcnt);  	while (!status && resp->opcnt < args->opcnt) {  		op = &args->ops[resp->opcnt++]; +		if (unlikely(resp->opcnt == NFSD_MAX_OPS_PER_COMPOUND)) { +			/* If there are still more operations to process, +			 * stop here and report NFS4ERR_RESOURCE. */ +			if (cstate->minorversion == 0 && +			    args->client_opcnt > resp->opcnt) { +				op->status = nfserr_resource; +				goto encode_op; +			} +		} +  		/*  		 * The XDR decode routines may have pre-set op->status;  		 * for example, if there is a miscellaneous XDR error @@ -2972,7 +2983,7 @@ encode_op:  			status = op->status;  		} -		trace_nfsd_compound_status(args->opcnt, resp->opcnt, +		trace_nfsd_compound_status(args->client_opcnt, resp->opcnt,  					   status, nfsd4_op_name(op->opnum));  		nfsd4_cstate_clear_replay(cstate);  | 
