diff options
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
| -rw-r--r-- | fs/nfs/nfs4xdr.c | 31 | 
1 files changed, 24 insertions, 7 deletions
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 8dba6bd4855..40836ee5dc3 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -447,12 +447,14 @@ static int nfs4_stat_to_errno(int);  				encode_sequence_maxsz + \  				encode_putfh_maxsz + \  				encode_open_maxsz + \ +				encode_access_maxsz + \  				encode_getfh_maxsz + \  				encode_getattr_maxsz)  #define NFS4_dec_open_sz        (compound_decode_hdr_maxsz + \  				decode_sequence_maxsz + \  				decode_putfh_maxsz + \  				decode_open_maxsz + \ +				decode_access_maxsz + \  				decode_getfh_maxsz + \  				decode_getattr_maxsz)  #define NFS4_enc_open_confirm_sz \ @@ -467,11 +469,13 @@ static int nfs4_stat_to_errno(int);  					encode_sequence_maxsz + \  					encode_putfh_maxsz + \  					encode_open_maxsz + \ +					encode_access_maxsz + \  					encode_getattr_maxsz)  #define NFS4_dec_open_noattr_sz	(compound_decode_hdr_maxsz + \  					decode_sequence_maxsz + \  					decode_putfh_maxsz + \  					decode_open_maxsz + \ +					decode_access_maxsz + \  					decode_getattr_maxsz)  #define NFS4_enc_open_downgrade_sz \  				(compound_encode_hdr_maxsz + \ @@ -1509,8 +1513,12 @@ static void encode_open_stateid(struct xdr_stream *xdr,  	nfs4_stateid stateid;  	if (ctx->state != NULL) { +		const struct nfs_lockowner *lockowner = NULL; + +		if (l_ctx != NULL) +			lockowner = &l_ctx->lockowner;  		nfs4_select_rw_stateid(&stateid, ctx->state, -				fmode, l_ctx->lockowner, l_ctx->pid); +				fmode, lockowner);  		if (zero_seqid)  			stateid.seqid = 0;  		encode_nfs4_stateid(xdr, &stateid); @@ -2216,6 +2224,8 @@ static void nfs4_xdr_enc_open(struct rpc_rqst *req, struct xdr_stream *xdr,  	encode_putfh(xdr, args->fh, &hdr);  	encode_open(xdr, args, &hdr);  	encode_getfh(xdr, &hdr); +	if (args->access) +		encode_access(xdr, args->access, &hdr);  	encode_getfattr_open(xdr, args->bitmask, args->open_bitmap, &hdr);  	encode_nops(&hdr);  } @@ -2252,7 +2262,9 @@ static void nfs4_xdr_enc_open_noattr(struct rpc_rqst *req,  	encode_sequence(xdr, &args->seq_args, &hdr);  	encode_putfh(xdr, args->fh, &hdr);  	encode_open(xdr, args, &hdr); -	encode_getfattr(xdr, args->bitmask, &hdr); +	if (args->access) +		encode_access(xdr, args->access, &hdr); +	encode_getfattr_open(xdr, args->bitmask, args->open_bitmap, &hdr);  	encode_nops(&hdr);  } @@ -4095,7 +4107,7 @@ out_overflow:  	return -EIO;  } -static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access) +static int decode_access(struct xdr_stream *xdr, u32 *supported, u32 *access)  {  	__be32 *p;  	uint32_t supp, acc; @@ -4109,8 +4121,8 @@ static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access)  		goto out_overflow;  	supp = be32_to_cpup(p++);  	acc = be32_to_cpup(p); -	access->supported = supp; -	access->access = acc; +	*supported = supp; +	*access = acc;  	return 0;  out_overflow:  	print_overflow_msg(__func__, xdr); @@ -5642,7 +5654,8 @@ static int decode_getdeviceinfo(struct xdr_stream *xdr,  	 * and places the remaining xdr data in xdr_buf->tail  	 */  	pdev->mincount = be32_to_cpup(p); -	xdr_read_pages(xdr, pdev->mincount); /* include space for the length */ +	if (xdr_read_pages(xdr, pdev->mincount) != pdev->mincount) +		goto out_overflow;  	/* Parse notification bitmap, verifying that it is zero. */  	p = xdr_inline_decode(xdr, 4); @@ -5887,7 +5900,7 @@ static int nfs4_xdr_dec_access(struct rpc_rqst *rqstp, struct xdr_stream *xdr,  	status = decode_putfh(xdr);  	if (status != 0)  		goto out; -	status = decode_access(xdr, res); +	status = decode_access(xdr, &res->supported, &res->access);  	if (status != 0)  		goto out;  	decode_getfattr(xdr, res->fattr, res->server); @@ -6228,6 +6241,8 @@ static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr,  	status = decode_getfh(xdr, &res->fh);  	if (status)  		goto out; +	if (res->access_request) +		decode_access(xdr, &res->access_supported, &res->access_result);  	decode_getfattr(xdr, res->f_attr, res->server);  out:  	return status; @@ -6276,6 +6291,8 @@ static int nfs4_xdr_dec_open_noattr(struct rpc_rqst *rqstp,  	status = decode_open(xdr, res);  	if (status)  		goto out; +	if (res->access_request) +		decode_access(xdr, &res->access_supported, &res->access_result);  	decode_getfattr(xdr, res->f_attr, res->server);  out:  	return status;  |