diff options
Diffstat (limited to 'fs/nfs/nfs4xdr.c')
| -rw-r--r-- | fs/nfs/nfs4xdr.c | 49 | 
1 files changed, 44 insertions, 5 deletions
| diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 69862bf6db00..8e70b92df4cc 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -3533,6 +3533,42 @@ static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint  	return 0;  } +static int decode_attr_case_insensitive(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res) +{ +	__be32 *p; + +	*res = 0; +	if (unlikely(bitmap[0] & (FATTR4_WORD0_CASE_INSENSITIVE - 1U))) +		return -EIO; +	if (likely(bitmap[0] & FATTR4_WORD0_CASE_INSENSITIVE)) { +		p = xdr_inline_decode(xdr, 4); +		if (unlikely(!p)) +			return -EIO; +		*res = be32_to_cpup(p); +		bitmap[0] &= ~FATTR4_WORD0_CASE_INSENSITIVE; +	} +	dprintk("%s: case_insensitive=%s\n", __func__, *res == 0 ? "false" : "true"); +	return 0; +} + +static int decode_attr_case_preserving(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *res) +{ +	__be32 *p; + +	*res = 0; +	if (unlikely(bitmap[0] & (FATTR4_WORD0_CASE_PRESERVING - 1U))) +		return -EIO; +	if (likely(bitmap[0] & FATTR4_WORD0_CASE_PRESERVING)) { +		p = xdr_inline_decode(xdr, 4); +		if (unlikely(!p)) +			return -EIO; +		*res = be32_to_cpup(p); +		bitmap[0] &= ~FATTR4_WORD0_CASE_PRESERVING; +	} +	dprintk("%s: case_preserving=%s\n", __func__, *res == 0 ? "false" : "true"); +	return 0; +} +  static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *fileid)  {  	__be32 *p; @@ -3696,8 +3732,6 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st  	if (unlikely(!p))  		goto out_eio;  	n = be32_to_cpup(p); -	if (n <= 0) -		goto out_eio;  	for (res->nlocations = 0; res->nlocations < n; res->nlocations++) {  		u32 m;  		struct nfs4_fs_location *loc; @@ -4200,10 +4234,11 @@ static int decode_attr_security_label(struct xdr_stream *xdr, uint32_t *bitmap,  		} else  			printk(KERN_WARNING "%s: label too long (%u)!\n",  					__func__, len); +		if (label && label->label) +			dprintk("%s: label=%.*s, len=%d, PI=%d, LFS=%d\n", +				__func__, label->len, (char *)label->label, +				label->len, label->pi, label->lfs);  	} -	if (label && label->label) -		dprintk("%s: label=%s, len=%d, PI=%d, LFS=%d\n", __func__, -			(char *)label->label, label->len, label->pi, label->lfs);  	return status;  } @@ -4412,6 +4447,10 @@ static int decode_server_caps(struct xdr_stream *xdr, struct nfs4_server_caps_re  		goto xdr_error;  	if ((status = decode_attr_aclsupport(xdr, bitmap, &res->acl_bitmask)) != 0)  		goto xdr_error; +	if ((status = decode_attr_case_insensitive(xdr, bitmap, &res->case_insensitive)) != 0) +		goto xdr_error; +	if ((status = decode_attr_case_preserving(xdr, bitmap, &res->case_preserving)) != 0) +		goto xdr_error;  	if ((status = decode_attr_exclcreat_supported(xdr, bitmap,  				res->exclcreat_bitmask)) != 0)  		goto xdr_error; |