nfs4xdr cleanup v2
Subsystems (3)
v2 cover nfs4xdr cleanup v2
Trond, thanks for your comments.
I believe I've fixed them all.
Changes from v1:
- dropped xdr_{en,de}code_int, open code cpu_to_be32 and be32_to_cpup instead.
- added helpers for decoding stateid, verifier, and sessionid using a common helper for decoding fixed size opaque arrays.
- COPYMEM calls all converted to memcpy (no need for returning ptr)
- READ_BUF open coded, callers use print_overflow_msg as you suggested.
- minor cleanup in encode_compound_hdr
- optimized nfs41 reserve_space usage
- optimized low level encoding
- simplified decode_exchange_id by reusing decode_opaque_inline
- optimized low level decoding
In this patchset:
[PATCH RFC v2 01/21] sunrpc: hton -> cpu_to_be*
[PATCH RFC v2 02/21] sunrpc: ntoh -> be*_to_cpu
[PATCH RFC v2 03/21] nfs: nfs4xdr: get rid of WRITE32
[PATCH RFC v2 04/21] nfs: nfs4xdr: get rid of WRITE64
[PATCH RFC v2 05/21] nfs: nfs4xdr: get rid of WRITEMEM
[PATCH RFC v2 06/21] nfs: nfs4xdr: optimize RESERVE_SPACE in encode_create_session and encode_sequence [PATCH RFC v2 07/21] nfs: nfs4xdr: encode_compound_hdr does not have to round up reserved bytes [PATCH RFC v2 08/21] nfs: nfs4xdr: change RESERVE_SPACE macro into a static helper [PATCH RFC v2 09/21] nfs: nfs4xdr: optimize low level encoding
[PATCH RFC v2 10/21] nfs: nfs4xdr: merge xdr_encode_int+xdr_encode_opaque_fixed into xdr_encode_opaque [PATCH RFC v2 11/21] nfs: nfs4xdr: get rid of READ32
[PATCH RFC v2 12/21] nfs: nfs4xdr: get rid of READ64
[PATCH RFC v2 13/21] nfs: nfs4xdr: get rid of READTIME
[PATCH RFC v2 14/21] nfs: nfs4xdr: introduce print_overflow_msg
[PATCH RFC v2 15/21] nfs: nfs4xdr: introduce decode_opaque_fixed and decode_stateid helpers [PATCH RFC v2 16/21] nfs: nfs4xdr: introduce decode_verifier helper
[PATCH RFC v2 17/21] nfs: nfs4xdr: introduce decode_sessionid helper
[PATCH RFC v2 18/21] nfs: nfs4xdr: get rid of COPYMEM
[PATCH RFC v2 19/21] nfs: nfs4xdr: simplify decode_exchange_id by reusing decode_opaque_inline [PATCH RFC v2 20/21] nfs: nfs4xdr: get rid of READ_BUF
[PATCH RFC v2 21/21] nfs: nfs4xdr: optimize low level decoding
Benny
RFC PATCH v2 1/21 sunrpc: hton -> cpu_to_be*
htonl is already defined as cpu_to_be32.cpu_to_be64 has architecture specific optimized implementations.
--- include/linux/sunrpc/xdr.h | 5 ++--- net/sunrpc/xdr.c | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-)
include/linux/sunrpc/xdr.h +2 -3
@@ -117,9 +117,8 @@ static inline __be32 *xdr_encode_array(__be32 *p, const void *s, unsigned int lestatic inline __be32 *xdr_encode_hyper (__be32 *p,__u64 val) { - *p++ =htonl (val >>32 ); - *p++ =htonl (val &0xFFFFFFFF ); -return p; + *(__be64 *)p =cpu_to_be64 (val); +return p +2 ; } static inline __be32 *
net/sunrpc/xdr.c +3 -3
@@ -24,7 +24,7 @@ xdr_encode_netobj(__be32 *p, const struct xdr_netobj *obj)unsigned int quadlen =XDR_QUADLEN (obj->len); p[quadlen] =0 ;/* zero trailing bytes */ - *p++ =htonl (obj->len); + *p++ =cpu_to_be32 (obj->len);memcpy (p, obj->data, obj->len);return p +XDR_QUADLEN (obj->len); }
@@ -83,7 +83,7 @@ EXPORT_SYMBOL_GPL(xdr_encode_opaque_fixed);*/ __be32 *xdr_encode_opaque (__be32 *p,const void *ptr,unsigned int nbytes) { - *p++ =htonl (nbytes); + *p++ =cpu_to_be32 (nbytes);return xdr_encode_opaque_fixed (p, ptr, nbytes); }EXPORT_SYMBOL_GPL (xdr_encode_opaque);
@@ -779,7 +779,7 @@ EXPORT_SYMBOL_GPL(xdr_decode_word);int xdr_encode_word (struct xdr_buf *buf,unsigned int base,u32 obj) { -__be32 raw =htonl (obj); +__be32 raw =cpu_to_be32 (obj);return write_bytes_to_xdr_buf (buf, base, &raw,sizeof (obj)); }
Signature · 1 line
1.6.4
RFC PATCH v2 2/21 sunrpc: ntoh -> be*_to_cpu
In reply to Benny Halevyntohl is already defined as be32_to_cpu.be64_to_cpu has architecture specific optimized implementations.
--- include/linux/sunrpc/xdr.h | 5 ++--- net/sunrpc/xdr.c | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-)
include/linux/sunrpc/xdr.h +2 -3
@@ -124,9 +124,8 @@ xdr_encode_hyper(__be32 *p, __u64 val)static inline __be32 *xdr_decode_hyper (__be32 *p,__u64 *valp) { - *valp = ((__u64 )ntohl (*p++)) <<32 ; - *valp |=ntohl (*p++); -return p; + *valp =be64_to_cpup ((__be64 *)p); +return p +2 ; }/*
net/sunrpc/xdr.c +3 -3
@@ -35,7 +35,7 @@ xdr_decode_netobj(__be32 *p, struct xdr_netobj *obj) {unsigned int len; -if ((len =ntohl (*p++)) >XDR_MAX_NETOBJ ) +if ((len =be32_to_cpu (*p++)) >XDR_MAX_NETOBJ )return NULL ; obj->len = len; obj->data = (u8 *) p;
@@ -101,7 +101,7 @@ xdr_decode_string_inplace(__be32 *p, char **sp, {u32 len; - len =ntohl (*p++); + len =be32_to_cpu (*p++);if (len > maxlen)return NULL ; *lenp = len;
@@ -771,7 +771,7 @@ xdr_decode_word(struct xdr_buf *buf, unsigned int base, u32 *obj) status =read_bytes_from_xdr_buf (buf, base, &raw,sizeof (*obj));if (status)return status; - *obj =ntohl (raw); + *obj =be32_to_cpu (raw);return 0 ; }EXPORT_SYMBOL_GPL (xdr_decode_word);
Signature · 1 line
1.6.4
RFC PATCH v2 3/21 nfs: nfs4xdr: get rid of WRITE32
In reply to Benny Halevys/WRITE32/*p++ = cpu_to_be32/
--- fs/nfs/nfs4xdr.c | 291 +++++++++++++++++++++++++++--------------------------- 1 files changed, 145 insertions(+), 146 deletions(-)
fs/nfs/nfs4xdr.c +145 -146
@@ -712,7 +712,6 @@ struct compound_hdr {* task to translate them into Linux-specific versions which are more * consistent with the style used in NFSv2/v3... */ -#define WRITE32 (n) *p++ = htonl(n)#define WRITE64 (n) do { \ *p++ = htonl((uint32_t)((n) >> 32)); \ *p++ = htonl((uint32_t)(n)); \
@@ -750,11 +749,11 @@ static void encode_compound_hdr(struct xdr_stream *xdr,dprintk ("encode_compound: tag=%.*s\n" , (int )hdr->taglen, hdr->tag);BUG_ON (hdr->taglen >NFS4_MAXTAGLEN );RESERVE_SPACE (12 +(XDR_QUADLEN (hdr->taglen)<<2 )); -WRITE32 (hdr->taglen); + *p++ =cpu_to_be32 (hdr->taglen);WRITEMEM (hdr->tag, hdr->taglen); -WRITE32 (hdr->minorversion); + *p++ =cpu_to_be32 (hdr->minorversion); hdr->nops_p = p; -WRITE32 (hdr->nops); + *p++ =cpu_to_be32 (hdr->nops); }static void encode_nops (struct compound_hdr *hdr)
@@ -835,7 +834,7 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const* We write the bitmap length now, but leave the bitmap and the attribute * buffer length to be backfilled at the end of this routine. */ -WRITE32 (2 ); + *p++ =cpu_to_be32 (2 ); q = p; p +=3 ;
@@ -845,39 +844,39 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const }if (iap->ia_valid &ATTR_MODE ) { bmval1 |=FATTR4_WORD1_MODE ; -WRITE32 (iap->ia_mode &S_IALLUGO ); + *p++ =cpu_to_be32 (iap->ia_mode &S_IALLUGO ); }if (iap->ia_valid &ATTR_UID ) { bmval1 |=FATTR4_WORD1_OWNER ; -WRITE32 (owner_namelen); + *p++ =cpu_to_be32 (owner_namelen);WRITEMEM (owner_name, owner_namelen); }if (iap->ia_valid &ATTR_GID ) { bmval1 |=FATTR4_WORD1_OWNER_GROUP ; -WRITE32 (owner_grouplen); + *p++ =cpu_to_be32 (owner_grouplen);WRITEMEM (owner_group, owner_grouplen); }if (iap->ia_valid &ATTR_ATIME_SET ) { bmval1 |=FATTR4_WORD1_TIME_ACCESS_SET ; -WRITE32 (NFS4_SET_TO_CLIENT_TIME ); -WRITE32 (0 ); -WRITE32 (iap->ia_mtime.tv_sec); -WRITE32 (iap->ia_mtime.tv_nsec); + *p++ =cpu_to_be32 (NFS4_SET_TO_CLIENT_TIME ); + *p++ =cpu_to_be32 (0 ); + *p++ =cpu_to_be32 (iap->ia_mtime.tv_sec); + *p++ =cpu_to_be32 (iap->ia_mtime.tv_nsec); }else if (iap->ia_valid &ATTR_ATIME ) { bmval1 |=FATTR4_WORD1_TIME_ACCESS_SET ; -WRITE32 (NFS4_SET_TO_SERVER_TIME ); + *p++ =cpu_to_be32 (NFS4_SET_TO_SERVER_TIME ); }if (iap->ia_valid &ATTR_MTIME_SET ) { bmval1 |=FATTR4_WORD1_TIME_MODIFY_SET ; -WRITE32 (NFS4_SET_TO_CLIENT_TIME ); -WRITE32 (0 ); -WRITE32 (iap->ia_mtime.tv_sec); -WRITE32 (iap->ia_mtime.tv_nsec); + *p++ =cpu_to_be32 (NFS4_SET_TO_CLIENT_TIME ); + *p++ =cpu_to_be32 (0 ); + *p++ =cpu_to_be32 (iap->ia_mtime.tv_sec); + *p++ =cpu_to_be32 (iap->ia_mtime.tv_nsec); }else if (iap->ia_valid &ATTR_MTIME ) { bmval1 |=FATTR4_WORD1_TIME_MODIFY_SET ; -WRITE32 (NFS4_SET_TO_SERVER_TIME ); + *p++ =cpu_to_be32 (NFS4_SET_TO_SERVER_TIME ); }/*
@@ -901,8 +900,8 @@ static void encode_access(struct xdr_stream *xdr, u32 access, struct compound_hd__be32 *p;RESERVE_SPACE (8 ); -WRITE32 (OP_ACCESS ); -WRITE32 (access); + *p++ =cpu_to_be32 (OP_ACCESS ); + *p++ =cpu_to_be32 (access); hdr->nops++; hdr->replen += decode_access_maxsz; }
@@ -912,8 +911,8 @@ static void encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg__be32 *p;RESERVE_SPACE (8 +NFS4_STATEID_SIZE ); -WRITE32 (OP_CLOSE ); -WRITE32 (arg->seqid->sequence->counter); + *p++ =cpu_to_be32 (OP_CLOSE ); + *p++ =cpu_to_be32 (arg->seqid->sequence->counter);WRITEMEM (arg->stateid->data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_close_maxsz;
@@ -924,9 +923,9 @@ static void encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *ar__be32 *p;RESERVE_SPACE (16 ); -WRITE32 (OP_COMMIT ); + *p++ =cpu_to_be32 (OP_COMMIT );WRITE64 (args->offset); -WRITE32 (args->count); + *p++ =cpu_to_be32 (args->count); hdr->nops++; hdr->replen += decode_commit_maxsz; }
@@ -936,20 +935,20 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *__be32 *p;RESERVE_SPACE (8 ); -WRITE32 (OP_CREATE ); -WRITE32 (create->ftype); + *p++ =cpu_to_be32 (OP_CREATE ); + *p++ =cpu_to_be32 (create->ftype);switch (create->ftype) {case NF4LNK :RESERVE_SPACE (4 ); -WRITE32 (create->u.symlink.len); + *p++ =cpu_to_be32 (create->u.symlink.len);xdr_write_pages (xdr, create->u.symlink.pages,0 , create->u.symlink.len);break ;case NF4BLK :case NF4CHR :RESERVE_SPACE (8 ); -WRITE32 (create->u.device.specdata1); -WRITE32 (create->u.device.specdata2); + *p++ =cpu_to_be32 (create->u.device.specdata1); + *p++ =cpu_to_be32 (create->u.device.specdata2);break ;default :
@@ -957,7 +956,7 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg * }RESERVE_SPACE (4 + create->name->len); -WRITE32 (create->name->len); + *p++ =cpu_to_be32 (create->name->len);WRITEMEM (create->name->name, create->name->len); hdr->nops++; hdr->replen += decode_create_maxsz;
@@ -970,9 +969,9 @@ static void encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap, struct c__be32 *p;RESERVE_SPACE (12 ); -WRITE32 (OP_GETATTR ); -WRITE32 (1 ); -WRITE32 (bitmap); + *p++ =cpu_to_be32 (OP_GETATTR ); + *p++ =cpu_to_be32 (1 ); + *p++ =cpu_to_be32 (bitmap); hdr->nops++; hdr->replen += decode_getattr_maxsz; }
@@ -982,10 +981,10 @@ static void encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm__be32 *p;RESERVE_SPACE (16 ); -WRITE32 (OP_GETATTR ); -WRITE32 (2 ); -WRITE32 (bm0); -WRITE32 (bm1); + *p++ =cpu_to_be32 (OP_GETATTR ); + *p++ =cpu_to_be32 (2 ); + *p++ =cpu_to_be32 (bm0); + *p++ =cpu_to_be32 (bm1); hdr->nops++; hdr->replen += decode_getattr_maxsz; }
@@ -1013,7 +1012,7 @@ static void encode_getfh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (OP_GETFH ); + *p++ =cpu_to_be32 (OP_GETFH ); hdr->nops++; hdr->replen += decode_getfh_maxsz; }
@@ -1023,8 +1022,8 @@ static void encode_link(struct xdr_stream *xdr, const struct qstr *name, struct__be32 *p;RESERVE_SPACE (8 + name->len); -WRITE32 (OP_LINK ); -WRITE32 (name->len); + *p++ =cpu_to_be32 (OP_LINK ); + *p++ =cpu_to_be32 (name->len);WRITEMEM (name->name, name->len); hdr->nops++; hdr->replen += decode_link_maxsz;
@@ -1053,26 +1052,26 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args__be32 *p;RESERVE_SPACE (32 ); -WRITE32 (OP_LOCK ); -WRITE32 (nfs4_lock_type (args->fl, args->block)); -WRITE32 (args->reclaim); + *p++ =cpu_to_be32 (OP_LOCK ); + *p++ =cpu_to_be32 (nfs4_lock_type (args->fl, args->block)); + *p++ =cpu_to_be32 (args->reclaim);WRITE64 (args->fl->fl_start);WRITE64 (nfs4_lock_length (args->fl)); -WRITE32 (args->new_lock_owner); + *p++ =cpu_to_be32 (args->new_lock_owner);if (args->new_lock_owner){RESERVE_SPACE (4 +NFS4_STATEID_SIZE +32 ); -WRITE32 (args->open_seqid->sequence->counter); + *p++ =cpu_to_be32 (args->open_seqid->sequence->counter);WRITEMEM (args->open_stateid->data,NFS4_STATEID_SIZE ); -WRITE32 (args->lock_seqid->sequence->counter); + *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter);WRITE64 (args->lock_owner.clientid); -WRITE32 (16 ); + *p++ =cpu_to_be32 (16 );WRITEMEM ("lock id:" ,8 );WRITE64 (args->lock_owner.id); }else {RESERVE_SPACE (NFS4_STATEID_SIZE +4 );WRITEMEM (args->lock_stateid->data,NFS4_STATEID_SIZE ); -WRITE32 (args->lock_seqid->sequence->counter); + *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter); } hdr->nops++; hdr->replen += decode_lock_maxsz;
@@ -1083,12 +1082,12 @@ static void encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *ar__be32 *p;RESERVE_SPACE (52 ); -WRITE32 (OP_LOCKT ); -WRITE32 (nfs4_lock_type (args->fl,0 )); + *p++ =cpu_to_be32 (OP_LOCKT ); + *p++ =cpu_to_be32 (nfs4_lock_type (args->fl,0 ));WRITE64 (args->fl->fl_start);WRITE64 (nfs4_lock_length (args->fl));WRITE64 (args->lock_owner.clientid); -WRITE32 (16 ); + *p++ =cpu_to_be32 (16 );WRITEMEM ("lock id:" ,8 );WRITE64 (args->lock_owner.id); hdr->nops++;
@@ -1100,9 +1099,9 @@ static void encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *ar__be32 *p;RESERVE_SPACE (12 +NFS4_STATEID_SIZE +16 ); -WRITE32 (OP_LOCKU ); -WRITE32 (nfs4_lock_type (args->fl,0 )); -WRITE32 (args->seqid->sequence->counter); + *p++ =cpu_to_be32 (OP_LOCKU ); + *p++ =cpu_to_be32 (nfs4_lock_type (args->fl,0 )); + *p++ =cpu_to_be32 (args->seqid->sequence->counter);WRITEMEM (args->stateid->data,NFS4_STATEID_SIZE );WRITE64 (args->fl->fl_start);WRITE64 (nfs4_lock_length (args->fl));
@@ -1116,8 +1115,8 @@ static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, struc__be32 *p;RESERVE_SPACE (8 + len); -WRITE32 (OP_LOOKUP ); -WRITE32 (len); + *p++ =cpu_to_be32 (OP_LOOKUP ); + *p++ =cpu_to_be32 (len);WRITEMEM (name->name, len); hdr->nops++; hdr->replen += decode_lookup_maxsz;
@@ -1130,18 +1129,18 @@ static void encode_share_access(struct xdr_stream *xdr, fmode_t fmode)RESERVE_SPACE (8 );switch (fmode & (FMODE_READ |FMODE_WRITE )) {case FMODE_READ : -WRITE32 (NFS4_SHARE_ACCESS_READ ); + *p++ =cpu_to_be32 (NFS4_SHARE_ACCESS_READ );break ;case FMODE_WRITE : -WRITE32 (NFS4_SHARE_ACCESS_WRITE ); + *p++ =cpu_to_be32 (NFS4_SHARE_ACCESS_WRITE );break ;case FMODE_READ |FMODE_WRITE : -WRITE32 (NFS4_SHARE_ACCESS_BOTH ); + *p++ =cpu_to_be32 (NFS4_SHARE_ACCESS_BOTH );break ;default : -WRITE32 (0 ); + *p++ =cpu_to_be32 (0 ); } -WRITE32 (0 );/* for linux, share_deny = 0 always */ + *p++ =cpu_to_be32 (0 );/* for linux, share_deny = 0 always */ }static inline void encode_openhdr (struct xdr_stream *xdr,const struct nfs_openargs *arg)
@@ -1152,12 +1151,12 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena* owner 4 = 32 */ RESERVE_SPACE (8 ); -WRITE32 (OP_OPEN ); -WRITE32 (arg->seqid->sequence->counter); + *p++ =cpu_to_be32 (OP_OPEN ); + *p++ =cpu_to_be32 (arg->seqid->sequence->counter);encode_share_access (xdr, arg->fmode);RESERVE_SPACE (28 );WRITE64 (arg->clientid); -WRITE32 (16 ); + *p++ =cpu_to_be32 (16 );WRITEMEM ("open id:" ,8 );WRITE64 (arg->id); }
@@ -1169,11 +1168,11 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_opRESERVE_SPACE (4 );switch (arg->open_flags &O_EXCL ) {case 0 : -WRITE32 (NFS4_CREATE_UNCHECKED ); + *p++ =cpu_to_be32 (NFS4_CREATE_UNCHECKED );encode_attrs (xdr, arg->u.attrs, arg->server);break ;default : -WRITE32 (NFS4_CREATE_EXCLUSIVE ); + *p++ =cpu_to_be32 (NFS4_CREATE_EXCLUSIVE );encode_nfs4_verifier (xdr, &arg->u.verifier); } }
@@ -1185,11 +1184,11 @@ static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *aRESERVE_SPACE (4 );switch (arg->open_flags &O_CREAT ) {case 0 : -WRITE32 (NFS4_OPEN_NOCREATE ); + *p++ =cpu_to_be32 (NFS4_OPEN_NOCREATE );break ;default :BUG_ON (arg->claim !=NFS4_OPEN_CLAIM_NULL ); -WRITE32 (NFS4_OPEN_CREATE ); + *p++ =cpu_to_be32 (NFS4_OPEN_CREATE );encode_createmode (xdr, arg); } }
@@ -1201,13 +1200,13 @@ static inline void encode_delegation_type(struct xdr_stream *xdr, fmode_t delegaRESERVE_SPACE (4 );switch (delegation_type) {case 0 : -WRITE32 (NFS4_OPEN_DELEGATE_NONE ); + *p++ =cpu_to_be32 (NFS4_OPEN_DELEGATE_NONE );break ;case FMODE_READ : -WRITE32 (NFS4_OPEN_DELEGATE_READ ); + *p++ =cpu_to_be32 (NFS4_OPEN_DELEGATE_READ );break ;case FMODE_WRITE |FMODE_READ : -WRITE32 (NFS4_OPEN_DELEGATE_WRITE ); + *p++ =cpu_to_be32 (NFS4_OPEN_DELEGATE_WRITE );break ;default :BUG ();
@@ -1219,7 +1218,7 @@ static inline void encode_claim_null(struct xdr_stream *xdr, const struct qstr *__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (NFS4_OPEN_CLAIM_NULL ); + *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_NULL );encode_string (xdr, name->len, name->name); }
@@ -1228,7 +1227,7 @@ static inline void encode_claim_previous(struct xdr_stream *xdr, fmode_t type)__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (NFS4_OPEN_CLAIM_PREVIOUS ); + *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_PREVIOUS );encode_delegation_type (xdr, type); }
@@ -1237,7 +1236,7 @@ static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const struc__be32 *p;RESERVE_SPACE (4 +NFS4_STATEID_SIZE ); -WRITE32 (NFS4_OPEN_CLAIM_DELEGATE_CUR ); + *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_DELEGATE_CUR );WRITEMEM (stateid->data,NFS4_STATEID_SIZE );encode_string (xdr, name->len, name->name); }
@@ -1268,9 +1267,9 @@ static void encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_co__be32 *p;RESERVE_SPACE (4 +NFS4_STATEID_SIZE +4 ); -WRITE32 (OP_OPEN_CONFIRM ); + *p++ =cpu_to_be32 (OP_OPEN_CONFIRM );WRITEMEM (arg->stateid->data,NFS4_STATEID_SIZE ); -WRITE32 (arg->seqid->sequence->counter); + *p++ =cpu_to_be32 (arg->seqid->sequence->counter); hdr->nops++; hdr->replen += decode_open_confirm_maxsz; }
@@ -1280,9 +1279,9 @@ static void encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_close__be32 *p;RESERVE_SPACE (4 +NFS4_STATEID_SIZE +4 ); -WRITE32 (OP_OPEN_DOWNGRADE ); + *p++ =cpu_to_be32 (OP_OPEN_DOWNGRADE );WRITEMEM (arg->stateid->data,NFS4_STATEID_SIZE ); -WRITE32 (arg->seqid->sequence->counter); + *p++ =cpu_to_be32 (arg->seqid->sequence->counter);encode_share_access (xdr, arg->fmode); hdr->nops++; hdr->replen += decode_open_downgrade_maxsz;
@@ -1295,8 +1294,8 @@ encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh, struct compound_hd__be32 *p;RESERVE_SPACE (8 + len); -WRITE32 (OP_PUTFH ); -WRITE32 (len); + *p++ =cpu_to_be32 (OP_PUTFH ); + *p++ =cpu_to_be32 (len);WRITEMEM (fh->data, len); hdr->nops++; hdr->replen += decode_putfh_maxsz;
@@ -1307,7 +1306,7 @@ static void encode_putrootfh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (OP_PUTROOTFH ); + *p++ =cpu_to_be32 (OP_PUTROOTFH ); hdr->nops++; hdr->replen += decode_putrootfh_maxsz; }
@@ -1330,13 +1329,13 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args,__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (OP_READ ); + *p++ =cpu_to_be32 (OP_READ );encode_stateid (xdr, args->context);RESERVE_SPACE (12 );WRITE64 (args->offset); -WRITE32 (args->count); + *p++ =cpu_to_be32 (args->count); hdr->nops++; hdr->replen += decode_read_maxsz; }
@@ -1350,19 +1349,19 @@ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg__be32 *p;RESERVE_SPACE (12 +NFS4_VERIFIER_SIZE +20 ); -WRITE32 (OP_READDIR ); + *p++ =cpu_to_be32 (OP_READDIR );WRITE64 (readdir->cookie);WRITEMEM (readdir->verifier.data,NFS4_VERIFIER_SIZE ); -WRITE32 (readdir->count >>1 );/* We're not doing readdirplus */ -WRITE32 (readdir->count); -WRITE32 (2 ); + *p++ =cpu_to_be32 (readdir->count >>1 );/* We're not doing readdirplus */ + *p++ =cpu_to_be32 (readdir->count); + *p++ =cpu_to_be32 (2 );/* Switch to mounted_on_fileid if the server supports it */ if (readdir->bitmask[1 ] &FATTR4_WORD1_MOUNTED_ON_FILEID ) attrs[0 ] &= ~FATTR4_WORD0_FILEID ;else attrs[1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ; -WRITE32 (attrs[0 ] & readdir->bitmask[0 ]); -WRITE32 (attrs[1 ] & readdir->bitmask[1 ]); + *p++ =cpu_to_be32 (attrs[0 ] & readdir->bitmask[0 ]); + *p++ =cpu_to_be32 (attrs[1 ] & readdir->bitmask[1 ]); hdr->nops++; hdr->replen += decode_readdir_maxsz; dprintk("%s: cookie = %Lu, verifier = %08x:%08x, bitmap = %08x:%08x\n",
@@ -1379,7 +1378,7 @@ static void encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink *__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (OP_READLINK ); + *p++ =cpu_to_be32 (OP_READLINK ); hdr->nops++; hdr->replen += decode_readlink_maxsz; }
@@ -1389,8 +1388,8 @@ static void encode_remove(struct xdr_stream *xdr, const struct qstr *name, struc__be32 *p;RESERVE_SPACE (8 + name->len); -WRITE32 (OP_REMOVE ); -WRITE32 (name->len); + *p++ =cpu_to_be32 (OP_REMOVE ); + *p++ =cpu_to_be32 (name->len);WRITEMEM (name->name, name->len); hdr->nops++; hdr->replen += decode_remove_maxsz;
@@ -1401,12 +1400,12 @@ static void encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, co__be32 *p;RESERVE_SPACE (8 + oldname->len); -WRITE32 (OP_RENAME ); -WRITE32 (oldname->len); + *p++ =cpu_to_be32 (OP_RENAME ); + *p++ =cpu_to_be32 (oldname->len);WRITEMEM (oldname->name, oldname->len);RESERVE_SPACE (4 + newname->len); -WRITE32 (newname->len); + *p++ =cpu_to_be32 (newname->len);WRITEMEM (newname->name, newname->len); hdr->nops++; hdr->replen += decode_rename_maxsz;
@@ -1417,7 +1416,7 @@ static void encode_renew(struct xdr_stream *xdr, const struct nfs_client *client__be32 *p;RESERVE_SPACE (12 ); -WRITE32 (OP_RENEW ); + *p++ =cpu_to_be32 (OP_RENEW );WRITE64 (client_stateid->cl_clientid); hdr->nops++; hdr->replen += decode_renew_maxsz;
@@ -1429,7 +1428,7 @@ encode_restorefh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (OP_RESTOREFH ); + *p++ =cpu_to_be32 (OP_RESTOREFH ); hdr->nops++; hdr->replen += decode_restorefh_maxsz; }
@@ -1440,15 +1439,15 @@ encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compoun__be32 *p;RESERVE_SPACE (4 +NFS4_STATEID_SIZE ); -WRITE32 (OP_SETATTR ); + *p++ =cpu_to_be32 (OP_SETATTR );WRITEMEM (zero_stateid.data,NFS4_STATEID_SIZE );RESERVE_SPACE (2 *4 ); -WRITE32 (1 ); -WRITE32 (FATTR4_WORD0_ACL ); + *p++ =cpu_to_be32 (1 ); + *p++ =cpu_to_be32 (FATTR4_WORD0_ACL );if (arg->acl_len %4 )return -EINVAL ;RESERVE_SPACE (4 ); -WRITE32 (arg->acl_len); + *p++ =cpu_to_be32 (arg->acl_len);xdr_write_pages (xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len); hdr->nops++; hdr->replen += decode_setacl_maxsz;
@@ -1461,7 +1460,7 @@ encode_savefh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (OP_SAVEFH ); + *p++ =cpu_to_be32 (OP_SAVEFH ); hdr->nops++; hdr->replen += decode_savefh_maxsz; }
@@ -1471,7 +1470,7 @@ static void encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs__be32 *p;RESERVE_SPACE (4 +NFS4_STATEID_SIZE ); -WRITE32 (OP_SETATTR ); + *p++ =cpu_to_be32 (OP_SETATTR );WRITEMEM (arg->stateid.data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_setattr_maxsz;
@@ -1483,16 +1482,16 @@ static void encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclie__be32 *p;RESERVE_SPACE (4 +NFS4_VERIFIER_SIZE ); -WRITE32 (OP_SETCLIENTID ); + *p++ =cpu_to_be32 (OP_SETCLIENTID );WRITEMEM (setclientid->sc_verifier->data,NFS4_VERIFIER_SIZE );encode_string (xdr, setclientid->sc_name_len, setclientid->sc_name);RESERVE_SPACE (4 ); -WRITE32 (setclientid->sc_prog); + *p++ =cpu_to_be32 (setclientid->sc_prog);encode_string (xdr, setclientid->sc_netid_len, setclientid->sc_netid);encode_string (xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr);RESERVE_SPACE (4 ); -WRITE32 (setclientid->sc_cb_ident); + *p++ =cpu_to_be32 (setclientid->sc_cb_ident); hdr->nops++; hdr->replen += decode_setclientid_maxsz; }
@@ -1502,7 +1501,7 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs___be32 *p;RESERVE_SPACE (12 +NFS4_VERIFIER_SIZE ); -WRITE32 (OP_SETCLIENTID_CONFIRM ); + *p++ =cpu_to_be32 (OP_SETCLIENTID_CONFIRM );WRITE64 (client_state->cl_clientid);WRITEMEM (client_state->cl_confirm.data,NFS4_VERIFIER_SIZE ); hdr->nops++;
@@ -1514,14 +1513,14 @@ static void encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *arg__be32 *p;RESERVE_SPACE (4 ); -WRITE32 (OP_WRITE ); + *p++ =cpu_to_be32 (OP_WRITE );encode_stateid (xdr, args->context);RESERVE_SPACE (16 );WRITE64 (args->offset); -WRITE32 (args->stable); -WRITE32 (args->count); + *p++ =cpu_to_be32 (args->stable); + *p++ =cpu_to_be32 (args->count);xdr_write_pages (xdr, args->pages, args->pgbase, args->count); hdr->nops++;
@@ -1534,7 +1533,7 @@ static void encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *stateRESERVE_SPACE (4 +NFS4_STATEID_SIZE ); -WRITE32 (OP_DELEGRETURN ); + *p++ =cpu_to_be32 (OP_DELEGRETURN );WRITEMEM (stateid->data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_delegreturn_maxsz;
@@ -1549,15 +1548,15 @@ static void encode_exchange_id(struct xdr_stream *xdr,__be32 *p;RESERVE_SPACE (4 +sizeof (args->verifier->data)); -WRITE32 (OP_EXCHANGE_ID ); + *p++ =cpu_to_be32 (OP_EXCHANGE_ID );WRITEMEM (args->verifier->data,sizeof (args->verifier->data));encode_string (xdr, args->id_len, args->id);RESERVE_SPACE (12 ); -WRITE32 (args->flags); -WRITE32 (0 );/* zero length state_protect4_a */ -WRITE32 (0 );/* zero length implementation id array */ + *p++ =cpu_to_be32 (args->flags); + *p++ =cpu_to_be32 (0 );/* zero length state_protect4_a */ + *p++ =cpu_to_be32 (0 );/* zero length implementation id array */ hdr->nops++; hdr->replen += decode_exchange_id_maxsz; }
@@ -1572,54 +1571,54 @@ static void encode_create_session(struct xdr_stream *xdr,struct nfs_client *clp = args->client;RESERVE_SPACE (4 ); -WRITE32 (OP_CREATE_SESSION ); + *p++ =cpu_to_be32 (OP_CREATE_SESSION );RESERVE_SPACE (8 );WRITE64 (clp->cl_ex_clid);RESERVE_SPACE (8 ); -WRITE32 (clp->cl_seqid);/*Sequence id */ -WRITE32 (args->flags);/*flags */ + *p++ =cpu_to_be32 (clp->cl_seqid);/*Sequence id */ + *p++ =cpu_to_be32 (args->flags);/*flags */ RESERVE_SPACE (2 *28 );/* 2 channel_attrs */ /* Fore Channel */ -WRITE32 (args->fc_attrs.headerpadsz);/* header padding size */ -WRITE32 (args->fc_attrs.max_rqst_sz);/* max req size */ -WRITE32 (args->fc_attrs.max_resp_sz);/* max resp size */ -WRITE32 (args->fc_attrs.max_resp_sz_cached);/* Max resp sz cached */ -WRITE32 (args->fc_attrs.max_ops);/* max operations */ -WRITE32 (args->fc_attrs.max_reqs);/* max requests */ -WRITE32 (0 );/* rdmachannel_attrs */ + *p++ =cpu_to_be32 (args->fc_attrs.headerpadsz);/* header padding size */ + *p++ =cpu_to_be32 (args->fc_attrs.max_rqst_sz);/* max req size */ + *p++ =cpu_to_be32 (args->fc_attrs.max_resp_sz);/* max resp size */ + *p++ =cpu_to_be32 (args->fc_attrs.max_resp_sz_cached);/* Max resp sz cached */ + *p++ =cpu_to_be32 (args->fc_attrs.max_ops);/* max operations */ + *p++ =cpu_to_be32 (args->fc_attrs.max_reqs);/* max requests */ + *p++ =cpu_to_be32 (0 );/* rdmachannel_attrs */ /* Back Channel */ -WRITE32 (args->fc_attrs.headerpadsz);/* header padding size */ -WRITE32 (args->bc_attrs.max_rqst_sz);/* max req size */ -WRITE32 (args->bc_attrs.max_resp_sz);/* max resp size */ -WRITE32 (args->bc_attrs.max_resp_sz_cached);/* Max resp sz cached */ -WRITE32 (args->bc_attrs.max_ops);/* max operations */ -WRITE32 (args->bc_attrs.max_reqs);/* max requests */ -WRITE32 (0 );/* rdmachannel_attrs */ + *p++ =cpu_to_be32 (args->fc_attrs.headerpadsz);/* header padding size */ + *p++ =cpu_to_be32 (args->bc_attrs.max_rqst_sz);/* max req size */ + *p++ =cpu_to_be32 (args->bc_attrs.max_resp_sz);/* max resp size */ + *p++ =cpu_to_be32 (args->bc_attrs.max_resp_sz_cached);/* Max resp sz cached */ + *p++ =cpu_to_be32 (args->bc_attrs.max_ops);/* max operations */ + *p++ =cpu_to_be32 (args->bc_attrs.max_reqs);/* max requests */ + *p++ =cpu_to_be32 (0 );/* rdmachannel_attrs */ RESERVE_SPACE (4 ); -WRITE32 (args->cb_program);/* cb_program */ + *p++ =cpu_to_be32 (args->cb_program);/* cb_program */ RESERVE_SPACE (4 );/* # of security flavors */ -WRITE32 (1 ); + *p++ =cpu_to_be32 (1 );RESERVE_SPACE (4 ); -WRITE32 (RPC_AUTH_UNIX );/* auth_sys */ + *p++ =cpu_to_be32 (RPC_AUTH_UNIX );/* auth_sys */ /* authsys_parms rfc1831 */ RESERVE_SPACE (4 ); -WRITE32 ((u32 )clp->cl_boot_time.tv_nsec);/* stamp */ + *p++ =cpu_to_be32 ((u32 )clp->cl_boot_time.tv_nsec);/* stamp */ len =scnprintf (machine_name,sizeof (machine_name),"%s" , clp->cl_ipaddr);RESERVE_SPACE (16 + len); -WRITE32 (len); + *p++ =cpu_to_be32 (len);WRITEMEM (machine_name, len); -WRITE32 (0 );/* UID */ -WRITE32 (0 );/* GID */ -WRITE32 (0 );/* No more gids */ + *p++ =cpu_to_be32 (0 );/* UID */ + *p++ =cpu_to_be32 (0 );/* GID */ + *p++ =cpu_to_be32 (0 );/* No more gids */ hdr->nops++; hdr->replen += decode_create_session_maxsz; }
@@ -1630,7 +1629,7 @@ static void encode_destroy_session(struct xdr_stream *xdr, {__be32 *p;RESERVE_SPACE (4 +NFS4_MAX_SESSIONID_LEN ); -WRITE32 (OP_DESTROY_SESSION ); + *p++ =cpu_to_be32 (OP_DESTROY_SESSION );WRITEMEM (session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); hdr->nops++; hdr->replen += decode_destroy_session_maxsz;
@@ -1656,7 +1655,7 @@ static void encode_sequence(struct xdr_stream *xdr, slot = tp->slots + args->sa_slotid;RESERVE_SPACE (4 ); -WRITE32 (OP_SEQUENCE ); + *p++ =cpu_to_be32 (OP_SEQUENCE );/* * Sessionid + seqid + slotid + max slotid + cache_this
@@ -1672,10 +1671,10 @@ static void encode_sequence(struct xdr_stream *xdr, tp->highest_used_slotid, args->sa_cache_this);RESERVE_SPACE (NFS4_MAX_SESSIONID_LEN +16 );WRITEMEM (session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); -WRITE32 (slot->seq_nr); -WRITE32 (args->sa_slotid); -WRITE32 (tp->highest_used_slotid); -WRITE32 (args->sa_cache_this); + *p++ =cpu_to_be32 (slot->seq_nr); + *p++ =cpu_to_be32 (args->sa_slotid); + *p++ =cpu_to_be32 (tp->highest_used_slotid); + *p++ =cpu_to_be32 (args->sa_cache_this); hdr->nops++; hdr->replen += decode_sequence_maxsz;#endif /* CONFIG_NFS_V4_1 */
Signature · 1 line
1.6.4
RFC PATCH v2 4/21 nfs: nfs4xdr: get rid of WRITE64
In reply to Benny Halevys/WRITE64/p = xdr_encode_hyper(p, /
--- fs/nfs/nfs4xdr.c | 44 ++++++++++++++++++++------------------------ 1 files changed, 20 insertions(+), 24 deletions(-)
fs/nfs/nfs4xdr.c +20 -24
@@ -712,10 +712,6 @@ struct compound_hdr {* task to translate them into Linux-specific versions which are more * consistent with the style used in NFSv2/v3... */ -#define WRITE64 (n) do { \ - *p++ = htonl((uint32_t)((n) >> 32)); \ - *p++ = htonl((uint32_t)(n)); \ -} while (0)#define WRITEMEM (ptr,nbytes) do { \ p = xdr_encode_opaque_fixed(p, ptr, nbytes); \ } while (0)
@@ -840,7 +836,7 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, constif (iap->ia_valid &ATTR_SIZE ) { bmval0 |=FATTR4_WORD0_SIZE ; -WRITE64 (iap->ia_size); + p =xdr_encode_hyper (p, iap->ia_size); }if (iap->ia_valid &ATTR_MODE ) { bmval1 |=FATTR4_WORD1_MODE ;
@@ -924,7 +920,7 @@ static void encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *arRESERVE_SPACE (16 ); *p++ =cpu_to_be32 (OP_COMMIT ); -WRITE64 (args->offset); + p =xdr_encode_hyper (p, args->offset); *p++ =cpu_to_be32 (args->count); hdr->nops++; hdr->replen += decode_commit_maxsz;
@@ -1055,18 +1051,18 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args *p++ =cpu_to_be32 (OP_LOCK ); *p++ =cpu_to_be32 (nfs4_lock_type (args->fl, args->block)); *p++ =cpu_to_be32 (args->reclaim); -WRITE64 (args->fl->fl_start); -WRITE64 (nfs4_lock_length (args->fl)); + p =xdr_encode_hyper (p, args->fl->fl_start); + p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); *p++ =cpu_to_be32 (args->new_lock_owner);if (args->new_lock_owner){RESERVE_SPACE (4 +NFS4_STATEID_SIZE +32 ); *p++ =cpu_to_be32 (args->open_seqid->sequence->counter);WRITEMEM (args->open_stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter); -WRITE64 (args->lock_owner.clientid); + p =xdr_encode_hyper (p, args->lock_owner.clientid); *p++ =cpu_to_be32 (16 );WRITEMEM ("lock id:" ,8 ); -WRITE64 (args->lock_owner.id); + p =xdr_encode_hyper (p, args->lock_owner.id); }else {RESERVE_SPACE (NFS4_STATEID_SIZE +4 );
@@ -1084,12 +1080,12 @@ static void encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *arRESERVE_SPACE (52 ); *p++ =cpu_to_be32 (OP_LOCKT ); *p++ =cpu_to_be32 (nfs4_lock_type (args->fl,0 )); -WRITE64 (args->fl->fl_start); -WRITE64 (nfs4_lock_length (args->fl)); -WRITE64 (args->lock_owner.clientid); + p =xdr_encode_hyper (p, args->fl->fl_start); + p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); + p =xdr_encode_hyper (p, args->lock_owner.clientid); *p++ =cpu_to_be32 (16 );WRITEMEM ("lock id:" ,8 ); -WRITE64 (args->lock_owner.id); + p =xdr_encode_hyper (p, args->lock_owner.id); hdr->nops++; hdr->replen += decode_lockt_maxsz; }
@@ -1103,8 +1099,8 @@ static void encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *ar *p++ =cpu_to_be32 (nfs4_lock_type (args->fl,0 )); *p++ =cpu_to_be32 (args->seqid->sequence->counter);WRITEMEM (args->stateid->data,NFS4_STATEID_SIZE ); -WRITE64 (args->fl->fl_start); -WRITE64 (nfs4_lock_length (args->fl)); + p =xdr_encode_hyper (p, args->fl->fl_start); + p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); hdr->nops++; hdr->replen += decode_locku_maxsz; }
@@ -1155,10 +1151,10 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena *p++ =cpu_to_be32 (arg->seqid->sequence->counter);encode_share_access (xdr, arg->fmode);RESERVE_SPACE (28 ); -WRITE64 (arg->clientid); + p =xdr_encode_hyper (p, arg->clientid); *p++ =cpu_to_be32 (16 );WRITEMEM ("open id:" ,8 ); -WRITE64 (arg->id); + p =xdr_encode_hyper (p, arg->id); }static inline void encode_createmode (struct xdr_stream *xdr,const struct nfs_openargs *arg)
@@ -1334,7 +1330,7 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args,encode_stateid (xdr, args->context);RESERVE_SPACE (12 ); -WRITE64 (args->offset); + p =xdr_encode_hyper (p, args->offset); *p++ =cpu_to_be32 (args->count); hdr->nops++; hdr->replen += decode_read_maxsz;
@@ -1350,7 +1346,7 @@ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_argRESERVE_SPACE (12 +NFS4_VERIFIER_SIZE +20 ); *p++ =cpu_to_be32 (OP_READDIR ); -WRITE64 (readdir->cookie); + p =xdr_encode_hyper (p, readdir->cookie);WRITEMEM (readdir->verifier.data,NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (readdir->count >>1 );/* We're not doing readdirplus */ *p++ =cpu_to_be32 (readdir->count);
@@ -1417,7 +1413,7 @@ static void encode_renew(struct xdr_stream *xdr, const struct nfs_client *clientRESERVE_SPACE (12 ); *p++ =cpu_to_be32 (OP_RENEW ); -WRITE64 (client_stateid->cl_clientid); + p =xdr_encode_hyper (p, client_stateid->cl_clientid); hdr->nops++; hdr->replen += decode_renew_maxsz; }
@@ -1502,7 +1498,7 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_RESERVE_SPACE (12 +NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (OP_SETCLIENTID_CONFIRM ); -WRITE64 (client_state->cl_clientid); + p =xdr_encode_hyper (p, client_state->cl_clientid);WRITEMEM (client_state->cl_confirm.data,NFS4_VERIFIER_SIZE ); hdr->nops++; hdr->replen += decode_setclientid_confirm_maxsz;
@@ -1518,7 +1514,7 @@ static void encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *argencode_stateid (xdr, args->context);RESERVE_SPACE (16 ); -WRITE64 (args->offset); + p =xdr_encode_hyper (p, args->offset); *p++ =cpu_to_be32 (args->stable); *p++ =cpu_to_be32 (args->count);
@@ -1574,7 +1570,7 @@ static void encode_create_session(struct xdr_stream *xdr, *p++ =cpu_to_be32 (OP_CREATE_SESSION );RESERVE_SPACE (8 ); -WRITE64 (clp->cl_ex_clid); + p =xdr_encode_hyper (p, clp->cl_ex_clid);RESERVE_SPACE (8 ); *p++ =cpu_to_be32 (clp->cl_seqid);/*Sequence id */
Signature · 1 line
1.6.4
RFC PATCH v2 5/21 nfs: nfs4xdr: get rid of WRITEMEM
In reply to Benny Halevys/WRITEMEM(/p = xdr_encode_opaque_fixed(p, /
--- fs/nfs/nfs4xdr.c | 68 +++++++++++++++++++++++++---------------------------- 1 files changed, 32 insertions(+), 36 deletions(-)
fs/nfs/nfs4xdr.c +32 -36
@@ -712,10 +712,6 @@ struct compound_hdr {* task to translate them into Linux-specific versions which are more * consistent with the style used in NFSv2/v3... */ -#define WRITEMEM (ptr,nbytes) do { \ - p = xdr_encode_opaque_fixed(p, ptr, nbytes); \ -} while (0) -#define RESERVE_SPACE (nbytes) do { \ p = xdr_reserve_space(xdr, nbytes); \ BUG_ON(!p); \
@@ -746,7 +742,7 @@ static void encode_compound_hdr(struct xdr_stream *xdr,BUG_ON (hdr->taglen >NFS4_MAXTAGLEN );RESERVE_SPACE (12 +(XDR_QUADLEN (hdr->taglen)<<2 )); *p++ =cpu_to_be32 (hdr->taglen); -WRITEMEM (hdr->tag, hdr->taglen); + p =xdr_encode_opaque_fixed (p, hdr->tag, hdr->taglen); *p++ =cpu_to_be32 (hdr->minorversion); hdr->nops_p = p; *p++ =cpu_to_be32 (hdr->nops);
@@ -845,12 +841,12 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, constif (iap->ia_valid &ATTR_UID ) { bmval1 |=FATTR4_WORD1_OWNER ; *p++ =cpu_to_be32 (owner_namelen); -WRITEMEM (owner_name, owner_namelen); + p =xdr_encode_opaque_fixed (p, owner_name, owner_namelen); }if (iap->ia_valid &ATTR_GID ) { bmval1 |=FATTR4_WORD1_OWNER_GROUP ; *p++ =cpu_to_be32 (owner_grouplen); -WRITEMEM (owner_group, owner_grouplen); + p =xdr_encode_opaque_fixed (p, owner_group, owner_grouplen); }if (iap->ia_valid &ATTR_ATIME_SET ) { bmval1 |=FATTR4_WORD1_TIME_ACCESS_SET ;
@@ -909,7 +905,7 @@ static void encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *argRESERVE_SPACE (8 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_CLOSE ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter); -WRITEMEM (arg->stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_close_maxsz; }
@@ -953,7 +949,7 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *RESERVE_SPACE (4 + create->name->len); *p++ =cpu_to_be32 (create->name->len); -WRITEMEM (create->name->name, create->name->len); + p =xdr_encode_opaque_fixed (p, create->name->name, create->name->len); hdr->nops++; hdr->replen += decode_create_maxsz;
@@ -1020,7 +1016,7 @@ static void encode_link(struct xdr_stream *xdr, const struct qstr *name, structRESERVE_SPACE (8 + name->len); *p++ =cpu_to_be32 (OP_LINK ); *p++ =cpu_to_be32 (name->len); -WRITEMEM (name->name, name->len); + p =xdr_encode_opaque_fixed (p, name->name, name->len); hdr->nops++; hdr->replen += decode_link_maxsz; }
@@ -1057,16 +1053,16 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *argsif (args->new_lock_owner){RESERVE_SPACE (4 +NFS4_STATEID_SIZE +32 ); *p++ =cpu_to_be32 (args->open_seqid->sequence->counter); -WRITEMEM (args->open_stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, args->open_stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter); p =xdr_encode_hyper (p, args->lock_owner.clientid); *p++ =cpu_to_be32 (16 ); -WRITEMEM ("lock id:" ,8 ); + p =xdr_encode_opaque_fixed (p,"lock id:" ,8 ); p =xdr_encode_hyper (p, args->lock_owner.id); }else {RESERVE_SPACE (NFS4_STATEID_SIZE +4 ); -WRITEMEM (args->lock_stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, args->lock_stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter); } hdr->nops++;
@@ -1084,7 +1080,7 @@ static void encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *ar p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); p =xdr_encode_hyper (p, args->lock_owner.clientid); *p++ =cpu_to_be32 (16 ); -WRITEMEM ("lock id:" ,8 ); + p =xdr_encode_opaque_fixed (p,"lock id:" ,8 ); p =xdr_encode_hyper (p, args->lock_owner.id); hdr->nops++; hdr->replen += decode_lockt_maxsz;
@@ -1098,7 +1094,7 @@ static void encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *ar *p++ =cpu_to_be32 (OP_LOCKU ); *p++ =cpu_to_be32 (nfs4_lock_type (args->fl,0 )); *p++ =cpu_to_be32 (args->seqid->sequence->counter); -WRITEMEM (args->stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, args->stateid->data,NFS4_STATEID_SIZE ); p =xdr_encode_hyper (p, args->fl->fl_start); p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); hdr->nops++;
@@ -1113,7 +1109,7 @@ static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, strucRESERVE_SPACE (8 + len); *p++ =cpu_to_be32 (OP_LOOKUP ); *p++ =cpu_to_be32 (len); -WRITEMEM (name->name, len); + p =xdr_encode_opaque_fixed (p, name->name, len); hdr->nops++; hdr->replen += decode_lookup_maxsz; }
@@ -1153,7 +1149,7 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_openaRESERVE_SPACE (28 ); p =xdr_encode_hyper (p, arg->clientid); *p++ =cpu_to_be32 (16 ); -WRITEMEM ("open id:" ,8 ); + p =xdr_encode_opaque_fixed (p,"open id:" ,8 ); p =xdr_encode_hyper (p, arg->id); }
@@ -1233,7 +1229,7 @@ static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const strucRESERVE_SPACE (4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_DELEGATE_CUR ); -WRITEMEM (stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE );encode_string (xdr, name->len, name->name); }
@@ -1264,7 +1260,7 @@ static void encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_coRESERVE_SPACE (4 +NFS4_STATEID_SIZE +4 ); *p++ =cpu_to_be32 (OP_OPEN_CONFIRM ); -WRITEMEM (arg->stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter); hdr->nops++; hdr->replen += decode_open_confirm_maxsz;
@@ -1276,7 +1272,7 @@ static void encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_closeRESERVE_SPACE (4 +NFS4_STATEID_SIZE +4 ); *p++ =cpu_to_be32 (OP_OPEN_DOWNGRADE ); -WRITEMEM (arg->stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter);encode_share_access (xdr, arg->fmode); hdr->nops++;
@@ -1292,7 +1288,7 @@ encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh, struct compound_hdRESERVE_SPACE (8 + len); *p++ =cpu_to_be32 (OP_PUTFH ); *p++ =cpu_to_be32 (len); -WRITEMEM (fh->data, len); + p =xdr_encode_opaque_fixed (p, fh->data, len); hdr->nops++; hdr->replen += decode_putfh_maxsz; }
@@ -1315,9 +1311,9 @@ static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_contextRESERVE_SPACE (NFS4_STATEID_SIZE );if (ctx->state !=NULL ) {nfs4_copy_stateid (&stateid, ctx->state, ctx->lockowner); -WRITEMEM (stateid.data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, stateid.data,NFS4_STATEID_SIZE ); }else -WRITEMEM (zero_stateid.data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, zero_stateid.data,NFS4_STATEID_SIZE ); }static void encode_read (struct xdr_stream *xdr,const struct nfs_readargs *args,struct compound_hdr *hdr)
@@ -1347,7 +1343,7 @@ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_argRESERVE_SPACE (12 +NFS4_VERIFIER_SIZE +20 ); *p++ =cpu_to_be32 (OP_READDIR ); p =xdr_encode_hyper (p, readdir->cookie); -WRITEMEM (readdir->verifier.data,NFS4_VERIFIER_SIZE ); + p =xdr_encode_opaque_fixed (p, readdir->verifier.data,NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (readdir->count >>1 );/* We're not doing readdirplus */ *p++ =cpu_to_be32 (readdir->count); *p++ =cpu_to_be32 (2 );
@@ -1386,7 +1382,7 @@ static void encode_remove(struct xdr_stream *xdr, const struct qstr *name, strucRESERVE_SPACE (8 + name->len); *p++ =cpu_to_be32 (OP_REMOVE ); *p++ =cpu_to_be32 (name->len); -WRITEMEM (name->name, name->len); + p =xdr_encode_opaque_fixed (p, name->name, name->len); hdr->nops++; hdr->replen += decode_remove_maxsz; }
@@ -1398,11 +1394,11 @@ static void encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, coRESERVE_SPACE (8 + oldname->len); *p++ =cpu_to_be32 (OP_RENAME ); *p++ =cpu_to_be32 (oldname->len); -WRITEMEM (oldname->name, oldname->len); + p =xdr_encode_opaque_fixed (p, oldname->name, oldname->len);RESERVE_SPACE (4 + newname->len); *p++ =cpu_to_be32 (newname->len); -WRITEMEM (newname->name, newname->len); + p =xdr_encode_opaque_fixed (p, newname->name, newname->len); hdr->nops++; hdr->replen += decode_rename_maxsz; }
@@ -1436,7 +1432,7 @@ encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compounRESERVE_SPACE (4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_SETATTR ); -WRITEMEM (zero_stateid.data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, zero_stateid.data,NFS4_STATEID_SIZE );RESERVE_SPACE (2 *4 ); *p++ =cpu_to_be32 (1 ); *p++ =cpu_to_be32 (FATTR4_WORD0_ACL );
@@ -1467,7 +1463,7 @@ static void encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargsRESERVE_SPACE (4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_SETATTR ); -WRITEMEM (arg->stateid.data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, arg->stateid.data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_setattr_maxsz;encode_attrs (xdr, arg->iap, server);
@@ -1479,7 +1475,7 @@ static void encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclieRESERVE_SPACE (4 +NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (OP_SETCLIENTID ); -WRITEMEM (setclientid->sc_verifier->data,NFS4_VERIFIER_SIZE ); + p =xdr_encode_opaque_fixed (p, setclientid->sc_verifier->data,NFS4_VERIFIER_SIZE );encode_string (xdr, setclientid->sc_name_len, setclientid->sc_name);RESERVE_SPACE (4 );
@@ -1499,7 +1495,7 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_RESERVE_SPACE (12 +NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (OP_SETCLIENTID_CONFIRM ); p =xdr_encode_hyper (p, client_state->cl_clientid); -WRITEMEM (client_state->cl_confirm.data,NFS4_VERIFIER_SIZE ); + p =xdr_encode_opaque_fixed (p, client_state->cl_confirm.data,NFS4_VERIFIER_SIZE ); hdr->nops++; hdr->replen += decode_setclientid_confirm_maxsz; }
@@ -1530,7 +1526,7 @@ static void encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *stateRESERVE_SPACE (4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_DELEGRETURN ); -WRITEMEM (stateid->data,NFS4_STATEID_SIZE ); + p =xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_delegreturn_maxsz; }
@@ -1545,7 +1541,7 @@ static void encode_exchange_id(struct xdr_stream *xdr,RESERVE_SPACE (4 +sizeof (args->verifier->data)); *p++ =cpu_to_be32 (OP_EXCHANGE_ID ); -WRITEMEM (args->verifier->data,sizeof (args->verifier->data)); + p =xdr_encode_opaque_fixed (p, args->verifier->data,sizeof (args->verifier->data));encode_string (xdr, args->id_len, args->id);
@@ -1611,7 +1607,7 @@ static void encode_create_session(struct xdr_stream *xdr, clp->cl_ipaddr);RESERVE_SPACE (16 + len); *p++ =cpu_to_be32 (len); -WRITEMEM (machine_name, len); + p =xdr_encode_opaque_fixed (p, machine_name, len); *p++ =cpu_to_be32 (0 );/* UID */ *p++ =cpu_to_be32 (0 );/* GID */ *p++ =cpu_to_be32 (0 );/* No more gids */
@@ -1626,7 +1622,7 @@ static void encode_destroy_session(struct xdr_stream *xdr,__be32 *p;RESERVE_SPACE (4 +NFS4_MAX_SESSIONID_LEN ); *p++ =cpu_to_be32 (OP_DESTROY_SESSION ); -WRITEMEM (session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); + p =xdr_encode_opaque_fixed (p, session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); hdr->nops++; hdr->replen += decode_destroy_session_maxsz; }
@@ -1666,7 +1662,7 @@ static void encode_sequence(struct xdr_stream *xdr, slot->seq_nr, args->sa_slotid, tp->highest_used_slotid, args->sa_cache_this);RESERVE_SPACE (NFS4_MAX_SESSIONID_LEN +16 ); -WRITEMEM (session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); + p =xdr_encode_opaque_fixed (p, session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); *p++ =cpu_to_be32 (slot->seq_nr); *p++ =cpu_to_be32 (args->sa_slotid); *p++ =cpu_to_be32 (tp->highest_used_slotid);
Signature · 1 line
1.6.4
RFC PATCH v2 6/21 nfs: nfs4xdr: optimize RESERVE_SPACE in encode_create_session and encode_sequence
In reply to Benny HalevyCoalesce multilpe constant RESERVE_SPACEs into one
--- fs/nfs/nfs4xdr.c | 22 +++++----------------- 1 files changed, 5 insertions(+), 17 deletions(-)
fs/nfs/nfs4xdr.c +5 -17
@@ -1562,17 +1562,15 @@ static void encode_create_session(struct xdr_stream *xdr,uint32_t len;struct nfs_client *clp = args->client; -RESERVE_SPACE (4 ); - *p++ =cpu_to_be32 (OP_CREATE_SESSION ); + len =scnprintf (machine_name,sizeof (machine_name),"%s" , + clp->cl_ipaddr); -RESERVE_SPACE (8 ); +RESERVE_SPACE (20 +2 *28 +20 + len +12 ); + *p++ =cpu_to_be32 (OP_CREATE_SESSION ); p =xdr_encode_hyper (p, clp->cl_ex_clid); - -RESERVE_SPACE (8 ); *p++ =cpu_to_be32 (clp->cl_seqid);/*Sequence id */ *p++ =cpu_to_be32 (args->flags);/*flags */ -RESERVE_SPACE (2 *28 );/* 2 channel_attrs */ /* Fore Channel */ *p++ =cpu_to_be32 (args->fc_attrs.headerpadsz);/* header padding size */ *p++ =cpu_to_be32 (args->fc_attrs.max_rqst_sz);/* max req size */
@@ -1591,21 +1589,12 @@ static void encode_create_session(struct xdr_stream *xdr, *p++ =cpu_to_be32 (args->bc_attrs.max_reqs);/* max requests */ *p++ =cpu_to_be32 (0 );/* rdmachannel_attrs */ -RESERVE_SPACE (4 ); *p++ =cpu_to_be32 (args->cb_program);/* cb_program */ - -RESERVE_SPACE (4 );/* # of security flavors */ *p++ =cpu_to_be32 (1 ); - -RESERVE_SPACE (4 ); *p++ =cpu_to_be32 (RPC_AUTH_UNIX );/* auth_sys */ /* authsys_parms rfc1831 */ -RESERVE_SPACE (4 ); *p++ =cpu_to_be32 ((u32 )clp->cl_boot_time.tv_nsec);/* stamp */ - len =scnprintf (machine_name,sizeof (machine_name),"%s" , - clp->cl_ipaddr); -RESERVE_SPACE (16 + len); *p++ =cpu_to_be32 (len); p =xdr_encode_opaque_fixed (p, machine_name, len); *p++ =cpu_to_be32 (0 );/* UID */
@@ -1646,7 +1635,7 @@ static void encode_sequence(struct xdr_stream *xdr,WARN_ON (args->sa_slotid ==NFS4_MAX_SLOT_TABLE ); slot = tp->slots + args->sa_slotid; -RESERVE_SPACE (4 ); +RESERVE_SPACE (4 +NFS4_MAX_SESSIONID_LEN +16 ); *p++ =cpu_to_be32 (OP_SEQUENCE );/*
@@ -1661,7 +1650,6 @@ static void encode_sequence(struct xdr_stream *xdr, ((u32 *)session->sess_id.data)[3 ], slot->seq_nr, args->sa_slotid, tp->highest_used_slotid, args->sa_cache_this); -RESERVE_SPACE (NFS4_MAX_SESSIONID_LEN +16 ); p =xdr_encode_opaque_fixed (p, session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); *p++ =cpu_to_be32 (slot->seq_nr); *p++ =cpu_to_be32 (args->sa_slotid);
Signature · 1 line
1.6.4
Re: [PATCH RFC v2 06/21] nfs: nfs4xdr: optimize RESERVE_SPACE in encode_create_session and encode_sequence
Quoted 13 lines · Benny Halevy
Coalesce multilpe constant
RESERVE_SPACEsinto oneSigned-off-by Benny Halevy <[email protected]>---
fs/nfs/nfs4xdr.c| 22 +++++-----------------1 files changed, 5 insertions(+), 17 deletions(-)fs/nfs/nfs4xdr.c +0
-0@@ -1562,17 +1562,15 @@ static void encode_create_session(struct xdr_stream *xdr,
fs/nfs/nfs4xdr.c static void encode_create_session(struct · line 1569
Quoted 10 lines
fs/nfs/nfs4xdr.c +3
-3uint32_t len;struct nfs_client *clp = args->client; -RESERVE_SPACE (4 ); - *p++ =cpu_to_be32 (OP_CREATE_SESSION ); + len =scnprintf (machine_name,sizeof (machine_name),"%s" , + clp->cl_ipaddr); -RESERVE_SPACE (8 ); +RESERVE_SPACE (20 +2 *28 +20 + len +12 );
It would be nicer if we could use the foo_maxsz macros or "n * sizeof(__be32)" here somehow instead of integers.
Quoted 53 lines
fs/nfs/nfs4xdr.c +1
-3+ *p++ =cpu_to_be32 (OP_CREATE_SESSION ); p =xdr_encode_hyper (p, clp->cl_ex_clid); - -RESERVE_SPACE (8 ); *p++ =cpu_to_be32 (clp->cl_seqid);/*Sequence id */ *p++ =cpu_to_be32 (args->flags);/*flags */ -RESERVE_SPACE (2 *28 );/* 2 channel_attrs */ /* Fore Channel */ *p++ =cpu_to_be32 (args->fc_attrs.headerpadsz);/* header padding size */
*p++ = cpu_to_be32(args->fc_attrs.max_rqst_sz); /* max req size */fs/nfs/nfs4xdr.c +0
-9@@ -1591,21 +1589,12 @@ static void encode_create_session(struct xdr_stream *xdr, *p++ =cpu_to_be32 (args->bc_attrs.max_reqs);/* max requests */ *p++ =cpu_to_be32 (0 );/* rdmachannel_attrs */ -RESERVE_SPACE (4 ); *p++ =cpu_to_be32 (args->cb_program);/* cb_program */ - -RESERVE_SPACE (4 );/* # of security flavors */ *p++ =cpu_to_be32 (1 ); - -RESERVE_SPACE (4 ); *p++ =cpu_to_be32 (RPC_AUTH_UNIX );/* auth_sys */ /* authsys_parms rfc1831 */ -RESERVE_SPACE (4 ); *p++ =cpu_to_be32 ((u32 )clp->cl_boot_time.tv_nsec);/* stamp */ - len =scnprintf (machine_name,sizeof (machine_name),"%s" , - clp->cl_ipaddr); -RESERVE_SPACE (16 + len); *p++ =cpu_to_be32 (len); p =xdr_encode_opaque_fixed (p, machine_name, len);*p++ = cpu_to_be32(0); /* UID */fs/nfs/nfs4xdr.c +1
-1@@ -1646,7 +1635,7 @@ static void encode_sequence(struct xdr_stream *xdr,WARN_ON (args->sa_slotid ==NFS4_MAX_SLOT_TABLE ); slot = tp->slots + args->sa_slotid; -RESERVE_SPACE (4 ); +RESERVE_SPACE (4 +NFS4_MAX_SESSIONID_LEN +16 ); *p++ =cpu_to_be32 (OP_SEQUENCE );/*fs/nfs/nfs4xdr.c +0
-1@@ -1661,7 +1650,6 @@ static void encode_sequence(struct xdr_stream *xdr, ((u32 *)session->sess_id.data)[3 ], slot->seq_nr, args->sa_slotid, tp->highest_used_slotid, args->sa_cache_this); -RESERVE_SPACE (NFS4_MAX_SESSIONID_LEN +16 ); p =xdr_encode_opaque_fixed (p, session->sess_id.data,NFS4_MAX_SESSIONID_LEN );
Quoted 9 lines
*p++ = cpu_to_be32(slot->seq_nr); *p++ = cpu_to_be32(args->sa_slotid);Signature · 6 lines
1.6.4 -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com
Re: [PATCH RFC v2 06/21] nfs: nfs4xdr: optimize RESERVE_SPACE in encode_create_session and encode_sequence
Quoted 22 lines · Chuck Lever
Quoted 21 lines · Benny Halevy
Coalesce multilpe constant
RESERVE_SPACEsinto oneSigned-off-by Benny Halevy <[email protected]>---
fs/nfs/nfs4xdr.c| 22 +++++-----------------1 files changed, 5 insertions(+), 17 deletions(-)fs/nfs/nfs4xdr.c +2
-2@@ -1562,17 +1562,15 @@ static void encode_create_session(structxdr_stream *xdr, uint32_t len;struct nfs_client *clp = args->client; -RESERVE_SPACE (4 ); - *p++ =cpu_to_be32 (OP_CREATE_SESSION ); + len =scnprintf (machine_name,sizeof (machine_name),"%s" , + clp->cl_ipaddr);
Quoted 5 lines
fs/nfs/nfs4xdr.c static void encode_create_session(struct xdr_stream *xdr, · line 1568
Quoted 2 lines
fs/nfs/nfs4xdr.c +1
-1-RESERVE_SPACE (8 ); +RESERVE_SPACE (20 +2 *28 +20 + len +12 );It would be nicer if we could use the
foo_maxszmacros or "n *sizeof(__be32)" here somehow instead of integers.
No. sizeof(__be32) is a constant == 4. Spelling it out in every reserve_space would be bloat, not documentation.
foo_maxsz is something completely different: it spells out the maximum possible buffer size. Please don't confuse that with the actual buffer content size.
IOW: Please just leave the above as it is.
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1250269055.5476.11.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Re: [PATCH RFC v2 06/21] nfs: nfs4xdr: optimize RESERVE_SPACE in encode_create_session and encode_sequence
Quoted 23 lines · Trond Myklebust
Quoted 22 lines · Chuck Lever
Quoted 21 lines · Benny Halevy
Coalesce multilpe constant
RESERVE_SPACEsinto oneSigned-off-by Benny Halevy <[email protected]>---
fs/nfs/nfs4xdr.c| 22 +++++-----------------1 files changed, 5 insertions(+), 17 deletions(-)fs/nfs/nfs4xdr.c +2
-2@@ -1562,17 +1562,15 @@ static void encode_create_session(structxdr_stream *xdr, uint32_t len;struct nfs_client *clp = args->client; -RESERVE_SPACE (4 ); - *p++ =cpu_to_be32 (OP_CREATE_SESSION ); + len =scnprintf (machine_name,sizeof (machine_name),"%s" , + clp->cl_ipaddr);
Quoted 5 lines
Quoted 5 lines
fs/nfs/nfs4xdr.c static void encode_create_session(struct xdr_stream *xdr, · line 1568
Quoted 2 lines
fs/nfs/nfs4xdr.c +1
-1-RESERVE_SPACE (8 ); +RESERVE_SPACE (20 +2 *28 +20 + len +12 );It would be nicer if we could use the
foo_maxszmacros or "n *sizeof(__be32)" here somehow instead of integers.
Note the use of "somehow" implying that my suggestion is not supposed to be a precise proscription for how to code it. I presume we all understand well enough the meaning of these macros to get the idea of what I was trying to say.
Quoted 8 lines
No.
sizeof(__be32)is a constant == 4. Spelling it out in everyQuoted 1 line
reserve_spacewould be bloat, not documentation.
foo_maxszis something completely different: it spells out the maximum possible buffer size. Please don't confuse that with the actual buffer content size.
The effective difference between foo_maxsz and the other macros is only in the variable size parts of each argument set. maxsz can be constructed with a number of fixed size pieces that can be used separately or combined into a single macro that _is_ appropriate to use in the XDR routines. Since we are explicitly adding the actual lengths of variable sized arguments before calling reserve_space(), I don't see a problem with using length macros for each argument.
The risk of using naked integers in the XDR routines is that if there's a length bug in the maxsz macros, we also need to visit the XDR routines carefully to find other instances of the same problem. If we use macros everywhere, then fixing one length macro will address all similar instances at once...
Maybe this isn't a big deal for something like the kernel's rpcbind client, but nfs4xdr.c is already complex enough that I would easily accept a slight decrease in readability to reduce the nontrivial risk of getting these values wrong. Take it from someone who has found and fixed several such problems over the past few years: this is not a documentation issue.
Benny has combined the reserve_space() calls into a single call in each XDR routine, thus visually separating the marshalling of each argument from its related XDR buffer management. If you already know what you're looking at, that's not much of an issue. But for those who have never seen this code before, I think this reduces legibility in favor of a slight code optimization. Using length macros would make it easier to understand the relationship between marshalling and buffer management in each routine.
Quoted 1 line
IOW: Please just leave the above as it is.
--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com
Re: [PATCH RFC v2 06/21] nfs: nfs4xdr: optimize RESERVE_SPACE in encode_create_session and encode_sequence
Quoted 8 lines · Chuck Lever
The effective difference between
foo_maxszand the other macros is only in the variable size parts of each argument set. maxsz can be constructed with a number of fixed size pieces that can be used separately or combined into a single macro that _is_ appropriate to use in the XDR routines. Since we are explicitly adding the actual lengths of variable sized arguments before callingreserve_space(), I don't see a problem with using length macros for each argument.
Quoted 5 lines
The risk of using naked integers in the XDR routines is that if there's a length bug in the maxsz macros, we also need to visit the XDR routines carefully to find other instances of the same problem. If we use macros everywhere, then fixing one length macro will address all similar instances at once...
No, it won't. The encode_*/decode_* routines reflect unique operations. There is little or no overlap between what they encode/decode, so there isn't much room for sharing macros between them.
Instead, we attempt to describe each encode_*/decode_* routine using its own *maxsz macro.
The exceptions to the 'no sharing' rule are sub-objects like stateids, verifiers, and session ids. There we _do_ use macros both in the reserve_space() calls, and in the ensuing opaque_encode/decode call. However as you saw in the patch series, a better alternative is to give them their own unique encode_stateid/decode_stateid routine that can be checked once and for all against encode_stateid_maxsz/decode_stateid_maxsz.
Quoted 8 lines
Benny has combined the
reserve_space()calls into a single call in each XDR routine, thus visually separating the marshalling of each argument from its related XDR buffer management. If you already know what you're looking at, that's not much of an issue. But for those who have never seen this code before, I think this reduces legibility in favor of a slight code optimization. Using length macros would make it easier to understand the relationship between marshalling and buffer management in each routine.
I'm really not that concerned about the woeful tale of the troubles of the first-time reader.
What do I care about is that someone who knows what they are doing can check the code and see at a glance whether or not there is a discrepancy between the reserve_space() call, and what is actually attempted read using the resulting pointer.
If the reserve_space() call uses numerical values, then you can do that. If it uses macros all over the place, then you can't...
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1250278083.5476.51.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Re: [PATCH RFC v2 06/21] nfs: nfs4xdr: optimize RESERVE_SPACE in encode_create_session and encode_sequence
Quoted 6 lines · Trond Myklebust
No, it won't. The encode_*/decode_* routines reflect unique operations. There is little or no overlap between what they encode/decode, so there isn't much room for sharing macros between them.
Instead, we attempt to describe each encode_*/decode_* routine using its own *maxsz macro.
Quoted 7 lines
The exceptions to the 'no sharing' rule are sub-objects like stateids, verifiers, and session ids. There we _do_ use macros both in the
reserve_space()calls, and in the ensuing opaque_encode/decode call. However as you saw in the patch series, a better alternative is to give them their own unique encode_stateid/decode_stateid routine that can be checked once and for all against encode_stateid_maxsz/decode_stateid_maxsz.
By the way, I wouldn't be opposed to moving the definitions of the *maxsz macros down, so that each one is next to the function that it describes. That would facilitate the process of checking at a glance whether or not the buffer memory allocation and XDR code expectations match one another.
It's not too urgent a project, though.
Trond
RFC PATCH v2 7/21 nfs: nfs4xdr: encode_compound_hdr does not have to round up reserved bytes
In reply to Benny HalevyThis is already done by xdr_reserve_space and since encode_compound_hdr is adding a byte count to "12" which is already word aligned, the xdr level rounding will work just as well.
--- fs/nfs/nfs4xdr.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
fs/nfs/nfs4xdr.c +1 -1
@@ -740,7 +740,7 @@ static void encode_compound_hdr(struct xdr_stream *xdr,dprintk ("encode_compound: tag=%.*s\n" , (int )hdr->taglen, hdr->tag);BUG_ON (hdr->taglen >NFS4_MAXTAGLEN ); -RESERVE_SPACE (12 +(XDR_QUADLEN (hdr->taglen)<<2 )); +RESERVE_SPACE (12 + hdr->taglen); *p++ =cpu_to_be32 (hdr->taglen); p =xdr_encode_opaque_fixed (p, hdr->tag, hdr->taglen); *p++ =cpu_to_be32 (hdr->minorversion);
Signature · 1 line
1.6.4
RFC PATCH v2 8/21 nfs: nfs4xdr: change RESERVE_SPACE macro into a static helper
In reply to Benny HalevyIn order to open code and expose the result pointer assignment.
Alternatively, we can open code the call to xdr_reserve_space and do the BUG_ON an the error case at the call site.
--- fs/nfs/nfs4xdr.c | 138 +++++++++++++++++++++++++---------------------------- 1 files changed, 65 insertions(+), 73 deletions(-)
fs/nfs/nfs4xdr.c +65 -73
@@ -702,20 +702,12 @@ struct compound_hdr {u32 minorversion; }; -/* -* START OF "GENERIC" ENCODE ROUTINES. -* These may look a little ugly since they are imported from a "generic" -* set of XDR encode/decode routines which are intended to be shared by -* all of our NFSv4 implementations (OpenBSD, MacOS X...). -* -* If the pain of reading these is too great, it should be a straightforward -* task to translate them into Linux-specific versions which are more -* consistent with the style used in NFSv2/v3... -*/ -#define RESERVE_SPACE (nbytes) do { \ - p = xdr_reserve_space(xdr, nbytes); \ - BUG_ON(!p); \ -} while (0) +static __be32 *reserve_space (struct xdr_stream *xdr,size_t nbytes) +{ +__be32 *p =xdr_reserve_space (xdr, nbytes); +BUG_ON (!p); +return p; +}static void encode_string (struct xdr_stream *xdr,unsigned int len,const char *str) {
@@ -740,7 +732,7 @@ static void encode_compound_hdr(struct xdr_stream *xdr,dprintk ("encode_compound: tag=%.*s\n" , (int )hdr->taglen, hdr->tag);BUG_ON (hdr->taglen >NFS4_MAXTAGLEN ); -RESERVE_SPACE (12 + hdr->taglen); + p =reserve_space (xdr,12 + hdr->taglen); *p++ =cpu_to_be32 (hdr->taglen); p =xdr_encode_opaque_fixed (p, hdr->tag, hdr->taglen); *p++ =cpu_to_be32 (hdr->minorversion);
@@ -820,7 +812,7 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const len +=16 ; else if (iap->ia_valid & ATTR_MTIME) len += 4; -RESERVE_SPACE (len); + p =reserve_space (xdr, len);/* * We write the bitmap length now, but leave the bitmap and the attribute
@@ -891,7 +883,7 @@ static void encode_access(struct xdr_stream *xdr, u32 access, struct compound_hd {__be32 *p; -RESERVE_SPACE (8 ); + p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (OP_ACCESS ); *p++ =cpu_to_be32 (access); hdr->nops++;
@@ -902,7 +894,7 @@ static void encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg {__be32 *p; -RESERVE_SPACE (8 +NFS4_STATEID_SIZE ); + p =reserve_space (xdr,8 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_CLOSE ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter); p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE );
@@ -914,7 +906,7 @@ static void encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *ar {__be32 *p; -RESERVE_SPACE (16 ); + p =reserve_space (xdr,16 ); *p++ =cpu_to_be32 (OP_COMMIT ); p =xdr_encode_hyper (p, args->offset); *p++ =cpu_to_be32 (args->count);
@@ -926,19 +918,19 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg * {__be32 *p; -RESERVE_SPACE (8 ); + p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (OP_CREATE ); *p++ =cpu_to_be32 (create->ftype);switch (create->ftype) {case NF4LNK : -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (create->u.symlink.len);xdr_write_pages (xdr, create->u.symlink.pages,0 , create->u.symlink.len);break ;case NF4BLK :case NF4CHR : -RESERVE_SPACE (8 ); + p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (create->u.device.specdata1); *p++ =cpu_to_be32 (create->u.device.specdata2);break ;
@@ -947,7 +939,7 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *break ; } -RESERVE_SPACE (4 + create->name->len); + p =reserve_space (xdr,4 + create->name->len); *p++ =cpu_to_be32 (create->name->len); p =xdr_encode_opaque_fixed (p, create->name->name, create->name->len); hdr->nops++;
@@ -960,7 +952,7 @@ static void encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap, struct c {__be32 *p; -RESERVE_SPACE (12 ); + p =reserve_space (xdr,12 ); *p++ =cpu_to_be32 (OP_GETATTR ); *p++ =cpu_to_be32 (1 ); *p++ =cpu_to_be32 (bitmap);
@@ -972,7 +964,7 @@ static void encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm {__be32 *p; -RESERVE_SPACE (16 ); + p =reserve_space (xdr,16 ); *p++ =cpu_to_be32 (OP_GETATTR ); *p++ =cpu_to_be32 (2 ); *p++ =cpu_to_be32 (bm0);
@@ -1003,7 +995,7 @@ static void encode_getfh(struct xdr_stream *xdr, struct compound_hdr *hdr) {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (OP_GETFH ); hdr->nops++; hdr->replen += decode_getfh_maxsz;
@@ -1013,7 +1005,7 @@ static void encode_link(struct xdr_stream *xdr, const struct qstr *name, struct {__be32 *p; -RESERVE_SPACE (8 + name->len); + p =reserve_space (xdr,8 + name->len); *p++ =cpu_to_be32 (OP_LINK ); *p++ =cpu_to_be32 (name->len); p =xdr_encode_opaque_fixed (p, name->name, name->len);
@@ -1043,7 +1035,7 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args {__be32 *p; -RESERVE_SPACE (32 ); + p =reserve_space (xdr,32 ); *p++ =cpu_to_be32 (OP_LOCK ); *p++ =cpu_to_be32 (nfs4_lock_type (args->fl, args->block)); *p++ =cpu_to_be32 (args->reclaim);
@@ -1051,7 +1043,7 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); *p++ =cpu_to_be32 (args->new_lock_owner);if (args->new_lock_owner){ -RESERVE_SPACE (4 +NFS4_STATEID_SIZE +32 ); + p =reserve_space (xdr,4 +NFS4_STATEID_SIZE +32 ); *p++ =cpu_to_be32 (args->open_seqid->sequence->counter); p =xdr_encode_opaque_fixed (p, args->open_stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter);
@@ -1061,7 +1053,7 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args p =xdr_encode_hyper (p, args->lock_owner.id); }else { -RESERVE_SPACE (NFS4_STATEID_SIZE +4 ); + p =reserve_space (xdr,NFS4_STATEID_SIZE +4 ); p =xdr_encode_opaque_fixed (p, args->lock_stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter); }
@@ -1073,7 +1065,7 @@ static void encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *ar {__be32 *p; -RESERVE_SPACE (52 ); + p =reserve_space (xdr,52 ); *p++ =cpu_to_be32 (OP_LOCKT ); *p++ =cpu_to_be32 (nfs4_lock_type (args->fl,0 )); p =xdr_encode_hyper (p, args->fl->fl_start);
@@ -1090,7 +1082,7 @@ static void encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *ar {__be32 *p; -RESERVE_SPACE (12 +NFS4_STATEID_SIZE +16 ); + p =reserve_space (xdr,12 +NFS4_STATEID_SIZE +16 ); *p++ =cpu_to_be32 (OP_LOCKU ); *p++ =cpu_to_be32 (nfs4_lock_type (args->fl,0 )); *p++ =cpu_to_be32 (args->seqid->sequence->counter);
@@ -1106,7 +1098,7 @@ static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, strucint len = name->len;__be32 *p; -RESERVE_SPACE (8 + len); + p =reserve_space (xdr,8 + len); *p++ =cpu_to_be32 (OP_LOOKUP ); *p++ =cpu_to_be32 (len); p =xdr_encode_opaque_fixed (p, name->name, len);
@@ -1118,7 +1110,7 @@ static void encode_share_access(struct xdr_stream *xdr, fmode_t fmode) {__be32 *p; -RESERVE_SPACE (8 ); + p =reserve_space (xdr,8 );switch (fmode & (FMODE_READ |FMODE_WRITE )) {case FMODE_READ : *p++ =cpu_to_be32 (NFS4_SHARE_ACCESS_READ );
@@ -1142,11 +1134,11 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena* opcode 4, seqid 4, share_access 4, share_deny 4, clientid 8, ownerlen 4, * owner 4 = 32 */ -RESERVE_SPACE (8 ); + p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (OP_OPEN ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter);encode_share_access (xdr, arg->fmode); -RESERVE_SPACE (28 ); + p =reserve_space (xdr,28 ); p =xdr_encode_hyper (p, arg->clientid); *p++ =cpu_to_be32 (16 ); p =xdr_encode_opaque_fixed (p,"open id:" ,8 );
@@ -1157,7 +1149,7 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 );switch (arg->open_flags &O_EXCL ) {case 0 : *p++ =cpu_to_be32 (NFS4_CREATE_UNCHECKED );
@@ -1173,7 +1165,7 @@ static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *a {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 );switch (arg->open_flags &O_CREAT ) {case 0 : *p++ =cpu_to_be32 (NFS4_OPEN_NOCREATE );
@@ -1189,7 +1181,7 @@ static inline void encode_delegation_type(struct xdr_stream *xdr, fmode_t delega {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 );switch (delegation_type) {case 0 : *p++ =cpu_to_be32 (NFS4_OPEN_DELEGATE_NONE );
@@ -1209,7 +1201,7 @@ static inline void encode_claim_null(struct xdr_stream *xdr, const struct qstr * {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_NULL );encode_string (xdr, name->len, name->name); }
@@ -1218,7 +1210,7 @@ static inline void encode_claim_previous(struct xdr_stream *xdr, fmode_t type) {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_PREVIOUS );encode_delegation_type (xdr, type); }
@@ -1227,7 +1219,7 @@ static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const struc {__be32 *p; -RESERVE_SPACE (4 +NFS4_STATEID_SIZE ); + p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_DELEGATE_CUR ); p =xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE );encode_string (xdr, name->len, name->name);
@@ -1258,7 +1250,7 @@ static void encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_co {__be32 *p; -RESERVE_SPACE (4 +NFS4_STATEID_SIZE +4 ); + p =reserve_space (xdr,4 +NFS4_STATEID_SIZE +4 ); *p++ =cpu_to_be32 (OP_OPEN_CONFIRM ); p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter);
@@ -1270,7 +1262,7 @@ static void encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_close {__be32 *p; -RESERVE_SPACE (4 +NFS4_STATEID_SIZE +4 ); + p =reserve_space (xdr,4 +NFS4_STATEID_SIZE +4 ); *p++ =cpu_to_be32 (OP_OPEN_DOWNGRADE ); p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter);
@@ -1285,7 +1277,7 @@ encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh, struct compound_hdint len = fh->size;__be32 *p; -RESERVE_SPACE (8 + len); + p =reserve_space (xdr,8 + len); *p++ =cpu_to_be32 (OP_PUTFH ); *p++ =cpu_to_be32 (len); p =xdr_encode_opaque_fixed (p, fh->data, len);
@@ -1297,7 +1289,7 @@ static void encode_putrootfh(struct xdr_stream *xdr, struct compound_hdr *hdr) {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (OP_PUTROOTFH ); hdr->nops++; hdr->replen += decode_putrootfh_maxsz;
@@ -1308,7 +1300,7 @@ static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_contextnfs4_stateid stateid;__be32 *p; -RESERVE_SPACE (NFS4_STATEID_SIZE ); + p =reserve_space (xdr,NFS4_STATEID_SIZE );if (ctx->state !=NULL ) {nfs4_copy_stateid (&stateid, ctx->state, ctx->lockowner); p =xdr_encode_opaque_fixed (p, stateid.data,NFS4_STATEID_SIZE );
@@ -1320,12 +1312,12 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args, {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (OP_READ );encode_stateid (xdr, args->context); -RESERVE_SPACE (12 ); + p =reserve_space (xdr,12 ); p =xdr_encode_hyper (p, args->offset); *p++ =cpu_to_be32 (args->count); hdr->nops++;
@@ -1340,7 +1332,7 @@ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg };__be32 *p; -RESERVE_SPACE (12 +NFS4_VERIFIER_SIZE +20 ); + p =reserve_space (xdr,12 +NFS4_VERIFIER_SIZE +20 ); *p++ =cpu_to_be32 (OP_READDIR ); p =xdr_encode_hyper (p, readdir->cookie); p =xdr_encode_opaque_fixed (p, readdir->verifier.data,NFS4_VERIFIER_SIZE );
@@ -1369,7 +1361,7 @@ static void encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink * {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (OP_READLINK ); hdr->nops++; hdr->replen += decode_readlink_maxsz;
@@ -1379,7 +1371,7 @@ static void encode_remove(struct xdr_stream *xdr, const struct qstr *name, struc {__be32 *p; -RESERVE_SPACE (8 + name->len); + p =reserve_space (xdr,8 + name->len); *p++ =cpu_to_be32 (OP_REMOVE ); *p++ =cpu_to_be32 (name->len); p =xdr_encode_opaque_fixed (p, name->name, name->len);
@@ -1391,12 +1383,12 @@ static void encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, co {__be32 *p; -RESERVE_SPACE (8 + oldname->len); + p =reserve_space (xdr,8 + oldname->len); *p++ =cpu_to_be32 (OP_RENAME ); *p++ =cpu_to_be32 (oldname->len); p =xdr_encode_opaque_fixed (p, oldname->name, oldname->len); -RESERVE_SPACE (4 + newname->len); + p =reserve_space (xdr,4 + newname->len); *p++ =cpu_to_be32 (newname->len); p =xdr_encode_opaque_fixed (p, newname->name, newname->len); hdr->nops++;
@@ -1407,7 +1399,7 @@ static void encode_renew(struct xdr_stream *xdr, const struct nfs_client *client {__be32 *p; -RESERVE_SPACE (12 ); + p =reserve_space (xdr,12 ); *p++ =cpu_to_be32 (OP_RENEW ); p =xdr_encode_hyper (p, client_stateid->cl_clientid); hdr->nops++;
@@ -1419,7 +1411,7 @@ encode_restorefh(struct xdr_stream *xdr, struct compound_hdr *hdr) {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (OP_RESTOREFH ); hdr->nops++; hdr->replen += decode_restorefh_maxsz;
@@ -1430,15 +1422,15 @@ encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compoun {__be32 *p; -RESERVE_SPACE (4 +NFS4_STATEID_SIZE ); + p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_SETATTR ); p =xdr_encode_opaque_fixed (p, zero_stateid.data,NFS4_STATEID_SIZE ); -RESERVE_SPACE (2 *4 ); + p =reserve_space (xdr,2 *4 ); *p++ =cpu_to_be32 (1 ); *p++ =cpu_to_be32 (FATTR4_WORD0_ACL );if (arg->acl_len %4 )return -EINVAL ; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (arg->acl_len);xdr_write_pages (xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len); hdr->nops++;
@@ -1451,7 +1443,7 @@ encode_savefh(struct xdr_stream *xdr, struct compound_hdr *hdr) {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (OP_SAVEFH ); hdr->nops++; hdr->replen += decode_savefh_maxsz;
@@ -1461,7 +1453,7 @@ static void encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs {__be32 *p; -RESERVE_SPACE (4 +NFS4_STATEID_SIZE ); + p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_SETATTR ); p =xdr_encode_opaque_fixed (p, arg->stateid.data,NFS4_STATEID_SIZE ); hdr->nops++;
@@ -1473,16 +1465,16 @@ static void encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclie {__be32 *p; -RESERVE_SPACE (4 +NFS4_VERIFIER_SIZE ); + p =reserve_space (xdr,4 +NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (OP_SETCLIENTID ); p =xdr_encode_opaque_fixed (p, setclientid->sc_verifier->data,NFS4_VERIFIER_SIZE );encode_string (xdr, setclientid->sc_name_len, setclientid->sc_name); -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (setclientid->sc_prog);encode_string (xdr, setclientid->sc_netid_len, setclientid->sc_netid);encode_string (xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr); -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (setclientid->sc_cb_ident); hdr->nops++; hdr->replen += decode_setclientid_maxsz;
@@ -1492,7 +1484,7 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_ {__be32 *p; -RESERVE_SPACE (12 +NFS4_VERIFIER_SIZE ); + p =reserve_space (xdr,12 +NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (OP_SETCLIENTID_CONFIRM ); p =xdr_encode_hyper (p, client_state->cl_clientid); p =xdr_encode_opaque_fixed (p, client_state->cl_confirm.data,NFS4_VERIFIER_SIZE );
@@ -1504,12 +1496,12 @@ static void encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *arg {__be32 *p; -RESERVE_SPACE (4 ); + p =reserve_space (xdr,4 ); *p++ =cpu_to_be32 (OP_WRITE );encode_stateid (xdr, args->context); -RESERVE_SPACE (16 ); + p =reserve_space (xdr,16 ); p =xdr_encode_hyper (p, args->offset); *p++ =cpu_to_be32 (args->stable); *p++ =cpu_to_be32 (args->count);
@@ -1523,7 +1515,7 @@ static void encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *state {__be32 *p; -RESERVE_SPACE (4 +NFS4_STATEID_SIZE ); + p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_DELEGRETURN ); p =xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE );
@@ -1539,13 +1531,13 @@ static void encode_exchange_id(struct xdr_stream *xdr, {__be32 *p; -RESERVE_SPACE (4 +sizeof (args->verifier->data)); + p =reserve_space (xdr,4 +sizeof (args->verifier->data)); *p++ =cpu_to_be32 (OP_EXCHANGE_ID ); p =xdr_encode_opaque_fixed (p, args->verifier->data,sizeof (args->verifier->data));encode_string (xdr, args->id_len, args->id); -RESERVE_SPACE (12 ); + p =reserve_space (xdr,12 ); *p++ =cpu_to_be32 (args->flags); *p++ =cpu_to_be32 (0 );/* zero length state_protect4_a */ *p++ =cpu_to_be32 (0 );/* zero length implementation id array */
@@ -1565,7 +1557,7 @@ static void encode_create_session(struct xdr_stream *xdr, len =scnprintf (machine_name,sizeof (machine_name),"%s" , clp->cl_ipaddr); -RESERVE_SPACE (20 +2 *28 +20 + len +12 ); + p =reserve_space (xdr,20 +2 *28 +20 + len +12 ); *p++ =cpu_to_be32 (OP_CREATE_SESSION ); p =xdr_encode_hyper (p, clp->cl_ex_clid); *p++ =cpu_to_be32 (clp->cl_seqid);/*Sequence id */
@@ -1609,7 +1601,7 @@ static void encode_destroy_session(struct xdr_stream *xdr, struct compound_hdr *hdr) {__be32 *p; -RESERVE_SPACE (4 +NFS4_MAX_SESSIONID_LEN ); + p =reserve_space (xdr,4 +NFS4_MAX_SESSIONID_LEN ); *p++ =cpu_to_be32 (OP_DESTROY_SESSION ); p =xdr_encode_opaque_fixed (p, session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); hdr->nops++;
@@ -1635,7 +1627,7 @@ static void encode_sequence(struct xdr_stream *xdr,WARN_ON (args->sa_slotid ==NFS4_MAX_SLOT_TABLE ); slot = tp->slots + args->sa_slotid; -RESERVE_SPACE (4 +NFS4_MAX_SESSIONID_LEN +16 ); + p =reserve_space (xdr,4 +NFS4_MAX_SESSIONID_LEN +16 ); *p++ =cpu_to_be32 (OP_SEQUENCE );/*
Signature · 1 line
1.6.4
RFC PATCH v2 9/21 nfs: nfs4xdr: optimize low level encoding
In reply to Benny Halevydo not increment encoding ptr if not needed.
--- fs/nfs/nfs4xdr.c | 128 +++++++++++++++++++++++++++--------------------------- 1 files changed, 64 insertions(+), 64 deletions(-)
fs/nfs/nfs4xdr.c +64 -64
@@ -737,7 +737,7 @@ static void encode_compound_hdr(struct xdr_stream *xdr, p =xdr_encode_opaque_fixed (p, hdr->tag, hdr->taglen); *p++ =cpu_to_be32 (hdr->minorversion); hdr->nops_p = p; - *p++ =cpu_to_be32 (hdr->nops); + *p =cpu_to_be32 (hdr->nops); }static void encode_nops (struct compound_hdr *hdr)
@@ -874,7 +874,7 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const len = (char *)p - (char *)q -12 ; *q++ =htonl (bmval0); *q++ =htonl (bmval1); - *q++ =htonl (len); + *q =htonl (len);/* out: */ }
@@ -885,7 +885,7 @@ static void encode_access(struct xdr_stream *xdr, u32 access, struct compound_hd p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (OP_ACCESS ); - *p++ =cpu_to_be32 (access); + *p =cpu_to_be32 (access); hdr->nops++; hdr->replen += decode_access_maxsz; }
@@ -897,7 +897,7 @@ static void encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg p =reserve_space (xdr,8 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_CLOSE ); *p++ =cpu_to_be32 (arg->seqid->sequence->counter); - p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); +xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_close_maxsz; }
@@ -909,7 +909,7 @@ static void encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *ar p =reserve_space (xdr,16 ); *p++ =cpu_to_be32 (OP_COMMIT ); p =xdr_encode_hyper (p, args->offset); - *p++ =cpu_to_be32 (args->count); + *p =cpu_to_be32 (args->count); hdr->nops++; hdr->replen += decode_commit_maxsz; }
@@ -920,19 +920,19 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg * p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (OP_CREATE ); - *p++ =cpu_to_be32 (create->ftype); + *p =cpu_to_be32 (create->ftype);switch (create->ftype) {case NF4LNK : p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (create->u.symlink.len); + *p =cpu_to_be32 (create->u.symlink.len);xdr_write_pages (xdr, create->u.symlink.pages,0 , create->u.symlink.len);break ;case NF4BLK :case NF4CHR : p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (create->u.device.specdata1); - *p++ =cpu_to_be32 (create->u.device.specdata2); + *p =cpu_to_be32 (create->u.device.specdata2);break ;default :
@@ -941,7 +941,7 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg * p =reserve_space (xdr,4 + create->name->len); *p++ =cpu_to_be32 (create->name->len); - p =xdr_encode_opaque_fixed (p, create->name->name, create->name->len); +xdr_encode_opaque_fixed (p, create->name->name, create->name->len); hdr->nops++; hdr->replen += decode_create_maxsz;
@@ -955,7 +955,7 @@ static void encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap, struct c p =reserve_space (xdr,12 ); *p++ =cpu_to_be32 (OP_GETATTR ); *p++ =cpu_to_be32 (1 ); - *p++ =cpu_to_be32 (bitmap); + *p =cpu_to_be32 (bitmap); hdr->nops++; hdr->replen += decode_getattr_maxsz; }
@@ -968,7 +968,7 @@ static void encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm *p++ =cpu_to_be32 (OP_GETATTR ); *p++ =cpu_to_be32 (2 ); *p++ =cpu_to_be32 (bm0); - *p++ =cpu_to_be32 (bm1); + *p =cpu_to_be32 (bm1); hdr->nops++; hdr->replen += decode_getattr_maxsz; }
@@ -996,7 +996,7 @@ static void encode_getfh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (OP_GETFH ); + *p =cpu_to_be32 (OP_GETFH ); hdr->nops++; hdr->replen += decode_getfh_maxsz; }
@@ -1008,7 +1008,7 @@ static void encode_link(struct xdr_stream *xdr, const struct qstr *name, struct p =reserve_space (xdr,8 + name->len); *p++ =cpu_to_be32 (OP_LINK ); *p++ =cpu_to_be32 (name->len); - p =xdr_encode_opaque_fixed (p, name->name, name->len); +xdr_encode_opaque_fixed (p, name->name, name->len); hdr->nops++; hdr->replen += decode_link_maxsz; }
@@ -1041,7 +1041,7 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args *p++ =cpu_to_be32 (args->reclaim); p =xdr_encode_hyper (p, args->fl->fl_start); p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); - *p++ =cpu_to_be32 (args->new_lock_owner); + *p =cpu_to_be32 (args->new_lock_owner);if (args->new_lock_owner){ p =reserve_space (xdr,4 +NFS4_STATEID_SIZE +32 ); *p++ =cpu_to_be32 (args->open_seqid->sequence->counter);
@@ -1050,12 +1050,12 @@ static void encode_lock(struct xdr_stream *xdr, const struct nfs_lock_args *args p =xdr_encode_hyper (p, args->lock_owner.clientid); *p++ =cpu_to_be32 (16 ); p =xdr_encode_opaque_fixed (p,"lock id:" ,8 ); - p =xdr_encode_hyper (p, args->lock_owner.id); +xdr_encode_hyper (p, args->lock_owner.id); }else { p =reserve_space (xdr,NFS4_STATEID_SIZE +4 ); p =xdr_encode_opaque_fixed (p, args->lock_stateid->data,NFS4_STATEID_SIZE ); - *p++ =cpu_to_be32 (args->lock_seqid->sequence->counter); + *p =cpu_to_be32 (args->lock_seqid->sequence->counter); } hdr->nops++; hdr->replen += decode_lock_maxsz;
@@ -1073,7 +1073,7 @@ static void encode_lockt(struct xdr_stream *xdr, const struct nfs_lockt_args *ar p =xdr_encode_hyper (p, args->lock_owner.clientid); *p++ =cpu_to_be32 (16 ); p =xdr_encode_opaque_fixed (p,"lock id:" ,8 ); - p =xdr_encode_hyper (p, args->lock_owner.id); +xdr_encode_hyper (p, args->lock_owner.id); hdr->nops++; hdr->replen += decode_lockt_maxsz; }
@@ -1088,7 +1088,7 @@ static void encode_locku(struct xdr_stream *xdr, const struct nfs_locku_args *ar *p++ =cpu_to_be32 (args->seqid->sequence->counter); p =xdr_encode_opaque_fixed (p, args->stateid->data,NFS4_STATEID_SIZE ); p =xdr_encode_hyper (p, args->fl->fl_start); - p =xdr_encode_hyper (p,nfs4_lock_length (args->fl)); +xdr_encode_hyper (p,nfs4_lock_length (args->fl)); hdr->nops++; hdr->replen += decode_locku_maxsz; }
@@ -1101,7 +1101,7 @@ static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, struc p =reserve_space (xdr,8 + len); *p++ =cpu_to_be32 (OP_LOOKUP ); *p++ =cpu_to_be32 (len); - p =xdr_encode_opaque_fixed (p, name->name, len); +xdr_encode_opaque_fixed (p, name->name, len); hdr->nops++; hdr->replen += decode_lookup_maxsz; }
@@ -1124,7 +1124,7 @@ static void encode_share_access(struct xdr_stream *xdr, fmode_t fmode)default : *p++ =cpu_to_be32 (0 ); } - *p++ =cpu_to_be32 (0 );/* for linux, share_deny = 0 always */ + *p =cpu_to_be32 (0 );/* for linux, share_deny = 0 always */ }static inline void encode_openhdr (struct xdr_stream *xdr,const struct nfs_openargs *arg)
@@ -1136,13 +1136,13 @@ static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_opena*/ p =reserve_space (xdr,8 ); *p++ =cpu_to_be32 (OP_OPEN ); - *p++ =cpu_to_be32 (arg->seqid->sequence->counter); + *p =cpu_to_be32 (arg->seqid->sequence->counter);encode_share_access (xdr, arg->fmode); p =reserve_space (xdr,28 ); p =xdr_encode_hyper (p, arg->clientid); *p++ =cpu_to_be32 (16 ); p =xdr_encode_opaque_fixed (p,"open id:" ,8 ); - p =xdr_encode_hyper (p, arg->id); +xdr_encode_hyper (p, arg->id); }static inline void encode_createmode (struct xdr_stream *xdr,const struct nfs_openargs *arg)
@@ -1152,11 +1152,11 @@ static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_op p =reserve_space (xdr,4 );switch (arg->open_flags &O_EXCL ) {case 0 : - *p++ =cpu_to_be32 (NFS4_CREATE_UNCHECKED ); + *p =cpu_to_be32 (NFS4_CREATE_UNCHECKED );encode_attrs (xdr, arg->u.attrs, arg->server);break ;default : - *p++ =cpu_to_be32 (NFS4_CREATE_EXCLUSIVE ); + *p =cpu_to_be32 (NFS4_CREATE_EXCLUSIVE );encode_nfs4_verifier (xdr, &arg->u.verifier); } }
@@ -1168,11 +1168,11 @@ static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *a p =reserve_space (xdr,4 );switch (arg->open_flags &O_CREAT ) {case 0 : - *p++ =cpu_to_be32 (NFS4_OPEN_NOCREATE ); + *p =cpu_to_be32 (NFS4_OPEN_NOCREATE );break ;default :BUG_ON (arg->claim !=NFS4_OPEN_CLAIM_NULL ); - *p++ =cpu_to_be32 (NFS4_OPEN_CREATE ); + *p =cpu_to_be32 (NFS4_OPEN_CREATE );encode_createmode (xdr, arg); } }
@@ -1184,13 +1184,13 @@ static inline void encode_delegation_type(struct xdr_stream *xdr, fmode_t delega p =reserve_space (xdr,4 );switch (delegation_type) {case 0 : - *p++ =cpu_to_be32 (NFS4_OPEN_DELEGATE_NONE ); + *p =cpu_to_be32 (NFS4_OPEN_DELEGATE_NONE );break ;case FMODE_READ : - *p++ =cpu_to_be32 (NFS4_OPEN_DELEGATE_READ ); + *p =cpu_to_be32 (NFS4_OPEN_DELEGATE_READ );break ;case FMODE_WRITE |FMODE_READ : - *p++ =cpu_to_be32 (NFS4_OPEN_DELEGATE_WRITE ); + *p =cpu_to_be32 (NFS4_OPEN_DELEGATE_WRITE );break ;default :BUG ();
@@ -1202,7 +1202,7 @@ static inline void encode_claim_null(struct xdr_stream *xdr, const struct qstr *__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_NULL ); + *p =cpu_to_be32 (NFS4_OPEN_CLAIM_NULL );encode_string (xdr, name->len, name->name); }
@@ -1211,7 +1211,7 @@ static inline void encode_claim_previous(struct xdr_stream *xdr, fmode_t type)__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_PREVIOUS ); + *p =cpu_to_be32 (NFS4_OPEN_CLAIM_PREVIOUS );encode_delegation_type (xdr, type); }
@@ -1221,7 +1221,7 @@ static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const struc p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (NFS4_OPEN_CLAIM_DELEGATE_CUR ); - p =xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE ); +xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE );encode_string (xdr, name->len, name->name); }
@@ -1253,7 +1253,7 @@ static void encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_co p =reserve_space (xdr,4 +NFS4_STATEID_SIZE +4 ); *p++ =cpu_to_be32 (OP_OPEN_CONFIRM ); p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); - *p++ =cpu_to_be32 (arg->seqid->sequence->counter); + *p =cpu_to_be32 (arg->seqid->sequence->counter); hdr->nops++; hdr->replen += decode_open_confirm_maxsz; }
@@ -1265,7 +1265,7 @@ static void encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_close p =reserve_space (xdr,4 +NFS4_STATEID_SIZE +4 ); *p++ =cpu_to_be32 (OP_OPEN_DOWNGRADE ); p =xdr_encode_opaque_fixed (p, arg->stateid->data,NFS4_STATEID_SIZE ); - *p++ =cpu_to_be32 (arg->seqid->sequence->counter); + *p =cpu_to_be32 (arg->seqid->sequence->counter);encode_share_access (xdr, arg->fmode); hdr->nops++; hdr->replen += decode_open_downgrade_maxsz;
@@ -1280,7 +1280,7 @@ encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh, struct compound_hd p =reserve_space (xdr,8 + len); *p++ =cpu_to_be32 (OP_PUTFH ); *p++ =cpu_to_be32 (len); - p =xdr_encode_opaque_fixed (p, fh->data, len); +xdr_encode_opaque_fixed (p, fh->data, len); hdr->nops++; hdr->replen += decode_putfh_maxsz; }
@@ -1290,7 +1290,7 @@ static void encode_putrootfh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (OP_PUTROOTFH ); + *p =cpu_to_be32 (OP_PUTROOTFH ); hdr->nops++; hdr->replen += decode_putrootfh_maxsz; }
@@ -1303,9 +1303,9 @@ static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_context p =reserve_space (xdr,NFS4_STATEID_SIZE );if (ctx->state !=NULL ) {nfs4_copy_stateid (&stateid, ctx->state, ctx->lockowner); - p =xdr_encode_opaque_fixed (p, stateid.data,NFS4_STATEID_SIZE ); +xdr_encode_opaque_fixed (p, stateid.data,NFS4_STATEID_SIZE ); }else - p =xdr_encode_opaque_fixed (p, zero_stateid.data,NFS4_STATEID_SIZE ); +xdr_encode_opaque_fixed (p, zero_stateid.data,NFS4_STATEID_SIZE ); }static void encode_read (struct xdr_stream *xdr,const struct nfs_readargs *args,struct compound_hdr *hdr)
@@ -1313,13 +1313,13 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args,__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (OP_READ ); + *p =cpu_to_be32 (OP_READ );encode_stateid (xdr, args->context); p =reserve_space (xdr,12 ); p =xdr_encode_hyper (p, args->offset); - *p++ =cpu_to_be32 (args->count); + *p =cpu_to_be32 (args->count); hdr->nops++; hdr->replen += decode_read_maxsz; }
@@ -1345,7 +1345,7 @@ static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_argelse attrs[1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ; *p++ =cpu_to_be32 (attrs[0 ] & readdir->bitmask[0 ]); - *p++ =cpu_to_be32 (attrs[1 ] & readdir->bitmask[1 ]); + *p =cpu_to_be32 (attrs[1 ] & readdir->bitmask[1 ]); hdr->nops++; hdr->replen += decode_readdir_maxsz; dprintk("%s: cookie = %Lu, verifier = %08x:%08x, bitmap = %08x:%08x\n",
@@ -1362,7 +1362,7 @@ static void encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink *__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (OP_READLINK ); + *p =cpu_to_be32 (OP_READLINK ); hdr->nops++; hdr->replen += decode_readlink_maxsz; }
@@ -1374,7 +1374,7 @@ static void encode_remove(struct xdr_stream *xdr, const struct qstr *name, struc p =reserve_space (xdr,8 + name->len); *p++ =cpu_to_be32 (OP_REMOVE ); *p++ =cpu_to_be32 (name->len); - p =xdr_encode_opaque_fixed (p, name->name, name->len); +xdr_encode_opaque_fixed (p, name->name, name->len); hdr->nops++; hdr->replen += decode_remove_maxsz; }
@@ -1386,11 +1386,11 @@ static void encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, co p =reserve_space (xdr,8 + oldname->len); *p++ =cpu_to_be32 (OP_RENAME ); *p++ =cpu_to_be32 (oldname->len); - p =xdr_encode_opaque_fixed (p, oldname->name, oldname->len); +xdr_encode_opaque_fixed (p, oldname->name, oldname->len); p =reserve_space (xdr,4 + newname->len); *p++ =cpu_to_be32 (newname->len); - p =xdr_encode_opaque_fixed (p, newname->name, newname->len); +xdr_encode_opaque_fixed (p, newname->name, newname->len); hdr->nops++; hdr->replen += decode_rename_maxsz; }
@@ -1401,7 +1401,7 @@ static void encode_renew(struct xdr_stream *xdr, const struct nfs_client *client p =reserve_space (xdr,12 ); *p++ =cpu_to_be32 (OP_RENEW ); - p =xdr_encode_hyper (p, client_stateid->cl_clientid); +xdr_encode_hyper (p, client_stateid->cl_clientid); hdr->nops++; hdr->replen += decode_renew_maxsz; }
@@ -1412,7 +1412,7 @@ encode_restorefh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (OP_RESTOREFH ); + *p =cpu_to_be32 (OP_RESTOREFH ); hdr->nops++; hdr->replen += decode_restorefh_maxsz; }
@@ -1424,14 +1424,14 @@ encode_setacl(struct xdr_stream *xdr, struct nfs_setaclargs *arg, struct compoun p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_SETATTR ); - p =xdr_encode_opaque_fixed (p, zero_stateid.data,NFS4_STATEID_SIZE ); +xdr_encode_opaque_fixed (p, zero_stateid.data,NFS4_STATEID_SIZE ); p =reserve_space (xdr,2 *4 ); *p++ =cpu_to_be32 (1 ); - *p++ =cpu_to_be32 (FATTR4_WORD0_ACL ); + *p =cpu_to_be32 (FATTR4_WORD0_ACL );if (arg->acl_len %4 )return -EINVAL ; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (arg->acl_len); + *p =cpu_to_be32 (arg->acl_len);xdr_write_pages (xdr, arg->acl_pages, arg->acl_pgbase, arg->acl_len); hdr->nops++; hdr->replen += decode_setacl_maxsz;
@@ -1444,7 +1444,7 @@ encode_savefh(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (OP_SAVEFH ); + *p =cpu_to_be32 (OP_SAVEFH ); hdr->nops++; hdr->replen += decode_savefh_maxsz; }
@@ -1455,7 +1455,7 @@ static void encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_SETATTR ); - p =xdr_encode_opaque_fixed (p, arg->stateid.data,NFS4_STATEID_SIZE ); +xdr_encode_opaque_fixed (p, arg->stateid.data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_setattr_maxsz;encode_attrs (xdr, arg->iap, server);
@@ -1467,15 +1467,15 @@ static void encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclie p =reserve_space (xdr,4 +NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (OP_SETCLIENTID ); - p =xdr_encode_opaque_fixed (p, setclientid->sc_verifier->data,NFS4_VERIFIER_SIZE ); +xdr_encode_opaque_fixed (p, setclientid->sc_verifier->data,NFS4_VERIFIER_SIZE );encode_string (xdr, setclientid->sc_name_len, setclientid->sc_name); p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (setclientid->sc_prog); + *p =cpu_to_be32 (setclientid->sc_prog);encode_string (xdr, setclientid->sc_netid_len, setclientid->sc_netid);encode_string (xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr); p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (setclientid->sc_cb_ident); + *p =cpu_to_be32 (setclientid->sc_cb_ident); hdr->nops++; hdr->replen += decode_setclientid_maxsz; }
@@ -1487,7 +1487,7 @@ static void encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs_ p =reserve_space (xdr,12 +NFS4_VERIFIER_SIZE ); *p++ =cpu_to_be32 (OP_SETCLIENTID_CONFIRM ); p =xdr_encode_hyper (p, client_state->cl_clientid); - p =xdr_encode_opaque_fixed (p, client_state->cl_confirm.data,NFS4_VERIFIER_SIZE ); +xdr_encode_opaque_fixed (p, client_state->cl_confirm.data,NFS4_VERIFIER_SIZE ); hdr->nops++; hdr->replen += decode_setclientid_confirm_maxsz; }
@@ -1497,14 +1497,14 @@ static void encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *arg__be32 *p; p =reserve_space (xdr,4 ); - *p++ =cpu_to_be32 (OP_WRITE ); + *p =cpu_to_be32 (OP_WRITE );encode_stateid (xdr, args->context); p =reserve_space (xdr,16 ); p =xdr_encode_hyper (p, args->offset); *p++ =cpu_to_be32 (args->stable); - *p++ =cpu_to_be32 (args->count); + *p =cpu_to_be32 (args->count);xdr_write_pages (xdr, args->pages, args->pgbase, args->count); hdr->nops++;
@@ -1518,7 +1518,7 @@ static void encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *state p =reserve_space (xdr,4 +NFS4_STATEID_SIZE ); *p++ =cpu_to_be32 (OP_DELEGRETURN ); - p =xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE ); +xdr_encode_opaque_fixed (p, stateid->data,NFS4_STATEID_SIZE ); hdr->nops++; hdr->replen += decode_delegreturn_maxsz; }
@@ -1533,14 +1533,14 @@ static void encode_exchange_id(struct xdr_stream *xdr, p =reserve_space (xdr,4 +sizeof (args->verifier->data)); *p++ =cpu_to_be32 (OP_EXCHANGE_ID ); - p =xdr_encode_opaque_fixed (p, args->verifier->data,sizeof (args->verifier->data)); +xdr_encode_opaque_fixed (p, args->verifier->data,sizeof (args->verifier->data));encode_string (xdr, args->id_len, args->id); p =reserve_space (xdr,12 ); *p++ =cpu_to_be32 (args->flags); *p++ =cpu_to_be32 (0 );/* zero length state_protect4_a */ - *p++ =cpu_to_be32 (0 );/* zero length implementation id array */ + *p =cpu_to_be32 (0 );/* zero length implementation id array */ hdr->nops++; hdr->replen += decode_exchange_id_maxsz; }
@@ -1591,7 +1591,7 @@ static void encode_create_session(struct xdr_stream *xdr, p =xdr_encode_opaque_fixed (p, machine_name, len); *p++ =cpu_to_be32 (0 );/* UID */ *p++ =cpu_to_be32 (0 );/* GID */ - *p++ =cpu_to_be32 (0 );/* No more gids */ + *p =cpu_to_be32 (0 );/* No more gids */ hdr->nops++; hdr->replen += decode_create_session_maxsz; }
@@ -1603,7 +1603,7 @@ static void encode_destroy_session(struct xdr_stream *xdr,__be32 *p; p =reserve_space (xdr,4 +NFS4_MAX_SESSIONID_LEN ); *p++ =cpu_to_be32 (OP_DESTROY_SESSION ); - p =xdr_encode_opaque_fixed (p, session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); +xdr_encode_opaque_fixed (p, session->sess_id.data,NFS4_MAX_SESSIONID_LEN ); hdr->nops++; hdr->replen += decode_destroy_session_maxsz; }
@@ -1646,7 +1646,7 @@ static void encode_sequence(struct xdr_stream *xdr, *p++ =cpu_to_be32 (slot->seq_nr); *p++ =cpu_to_be32 (args->sa_slotid); *p++ =cpu_to_be32 (tp->highest_used_slotid); - *p++ =cpu_to_be32 (args->sa_cache_this); + *p =cpu_to_be32 (args->sa_cache_this); hdr->nops++; hdr->replen += decode_sequence_maxsz;#endif /* CONFIG_NFS_V4_1 */
Signature · 1 line
1.6.4
RFC PATCH v2 10/21 nfs: nfs4xdr: merge xdr_encode_int+xdr_encode_opaque_fixed into xdr_encode_opaque
In reply to Benny Halevyuse encode_string where appropriate.
--- fs/nfs/nfs4xdr.c | 42 ++++++++++++++---------------------------- 1 files changed, 14 insertions(+), 28 deletions(-)
fs/nfs/nfs4xdr.c +14 -28
@@ -732,9 +732,8 @@ static void encode_compound_hdr(struct xdr_stream *xdr,dprintk ("encode_compound: tag=%.*s\n" , (int )hdr->taglen, hdr->tag);BUG_ON (hdr->taglen >NFS4_MAXTAGLEN ); - p =reserve_space (xdr,12 + hdr->taglen); - *p++ =cpu_to_be32 (hdr->taglen); - p =xdr_encode_opaque_fixed (p, hdr->tag, hdr->taglen); + p =reserve_space (xdr,4 + hdr->taglen +8 ); + p =xdr_encode_opaque (p, hdr->tag, hdr->taglen); *p++ =cpu_to_be32 (hdr->minorversion); hdr->nops_p = p; *p =cpu_to_be32 (hdr->nops);
@@ -832,13 +831,11 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const }if (iap->ia_valid &ATTR_UID ) { bmval1 |=FATTR4_WORD1_OWNER ; - *p++ =cpu_to_be32 (owner_namelen); - p =xdr_encode_opaque_fixed (p, owner_name, owner_namelen); + p =xdr_encode_opaque (p, owner_name, owner_namelen); }if (iap->ia_valid &ATTR_GID ) { bmval1 |=FATTR4_WORD1_OWNER_GROUP ; - *p++ =cpu_to_be32 (owner_grouplen); - p =xdr_encode_opaque_fixed (p, owner_group, owner_grouplen); + p =xdr_encode_opaque (p, owner_group, owner_grouplen); }if (iap->ia_valid &ATTR_ATIME_SET ) { bmval1 |=FATTR4_WORD1_TIME_ACCESS_SET ;
@@ -939,9 +936,7 @@ static void encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *break ; } - p =reserve_space (xdr,4 + create->name->len); - *p++ =cpu_to_be32 (create->name->len); -xdr_encode_opaque_fixed (p, create->name->name, create->name->len); +encode_string (xdr, create->name->len, create->name->name); hdr->nops++; hdr->replen += decode_create_maxsz;
@@ -1007,8 +1002,7 @@ static void encode_link(struct xdr_stream *xdr, const struct qstr *name, struct p =reserve_space (xdr,8 + name->len); *p++ =cpu_to_be32 (OP_LINK ); - *p++ =cpu_to_be32 (name->len); -xdr_encode_opaque_fixed (p, name->name, name->len); +xdr_encode_opaque (p, name->name, name->len); hdr->nops++; hdr->replen += decode_link_maxsz; }
@@ -1100,8 +1094,7 @@ static void encode_lookup(struct xdr_stream *xdr, const struct qstr *name, struc p =reserve_space (xdr,8 + len); *p++ =cpu_to_be32 (OP_LOOKUP ); - *p++ =cpu_to_be32 (len); -xdr_encode_opaque_fixed (p, name->name, len); +xdr_encode_opaque (p, name->name, len); hdr->nops++; hdr->replen += decode_lookup_maxsz; }
@@ -1279,8 +1272,7 @@ encode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh, struct compound_hd p =reserve_space (xdr,8 + len); *p++ =cpu_to_be32 (OP_PUTFH ); - *p++ =cpu_to_be32 (len); -xdr_encode_opaque_fixed (p, fh->data, len); +xdr_encode_opaque (p, fh->data, len); hdr->nops++; hdr->replen += decode_putfh_maxsz; }
@@ -1373,8 +1365,7 @@ static void encode_remove(struct xdr_stream *xdr, const struct qstr *name, struc p =reserve_space (xdr,8 + name->len); *p++ =cpu_to_be32 (OP_REMOVE ); - *p++ =cpu_to_be32 (name->len); -xdr_encode_opaque_fixed (p, name->name, name->len); +xdr_encode_opaque (p, name->name, name->len); hdr->nops++; hdr->replen += decode_remove_maxsz; }
@@ -1383,14 +1374,10 @@ static void encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, co {__be32 *p; - p =reserve_space (xdr,8 + oldname->len); - *p++ =cpu_to_be32 (OP_RENAME ); - *p++ =cpu_to_be32 (oldname->len); -xdr_encode_opaque_fixed (p, oldname->name, oldname->len); - - p =reserve_space (xdr,4 + newname->len); - *p++ =cpu_to_be32 (newname->len); -xdr_encode_opaque_fixed (p, newname->name, newname->len); + p =reserve_space (xdr,4 ); + *p =cpu_to_be32 (OP_RENAME ); +encode_string (xdr, oldname->len, oldname->name); +encode_string (xdr, newname->len, newname->name); hdr->nops++; hdr->replen += decode_rename_maxsz; }
@@ -1587,8 +1574,7 @@ static void encode_create_session(struct xdr_stream *xdr,/* authsys_parms rfc1831 */ *p++ =cpu_to_be32 ((u32 )clp->cl_boot_time.tv_nsec);/* stamp */ - *p++ =cpu_to_be32 (len); - p =xdr_encode_opaque_fixed (p, machine_name, len); + p =xdr_encode_opaque (p, machine_name, len); *p++ =cpu_to_be32 (0 );/* UID */ *p++ =cpu_to_be32 (0 );/* GID */ *p =cpu_to_be32 (0 );/* No more gids */
Signature · 1 line
1.6.4
RFC PATCH v2 11/21 nfs: nfs4xdr: get rid of READ32
In reply to Benny Halevys/READ32\((.*)\)/\1 = be32_to_cpup(p++)/
--- fs/nfs/nfs4xdr.c | 145 +++++++++++++++++++++++++++--------------------------- 1 files changed, 72 insertions(+), 73 deletions(-)
fs/nfs/nfs4xdr.c +72 -73
@@ -2433,7 +2433,6 @@ static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p,* task to translate them into Linux-specific versions which are more * consistent with the style used in NFSv2/v3... */ -#define READ32 (x) (x) = ntohl(*p++)#define READ64 (x) do { \ (x) = (u64)ntohl(*p++) << 32; \ (x) |= ntohl(*p++); \
@@ -2464,7 +2463,7 @@ static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char__be32 *p;READ_BUF (4 ); -READ32 (*len); + *len =be32_to_cpup (p++);READ_BUF (*len); *string = (char *)p;return 0 ;
@@ -2475,13 +2474,13 @@ static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)__be32 *p;READ_BUF (8 ); -READ32 (hdr->status); -READ32 (hdr->taglen); + hdr->status =be32_to_cpup (p++); + hdr->taglen =be32_to_cpup (p++);READ_BUF (hdr->taglen +4 ); hdr->tag = (char *)p; p +=XDR_QUADLEN (hdr->taglen); -READ32 (hdr->nops); + hdr->nops =be32_to_cpup (p++);if (unlikely (hdr->nops <1 ))return nfs4_stat_to_errno (hdr->status);return 0 ;
@@ -2494,14 +2493,14 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)int32_t nfserr;READ_BUF (8 ); -READ32 (opnum); + opnum =be32_to_cpup (p++);if (opnum != expected) {dprintk ("nfs: Server returned operation" " %d but we issued a request for %d\n" , opnum, expected);return -EIO ; } -READ32 (nfserr); + nfserr =be32_to_cpup (p++);if (nfserr !=NFS_OK )return nfs4_stat_to_errno (nfserr);return 0 ;
@@ -2524,14 +2523,14 @@ static int decode_attr_bitmap(struct xdr_stream *xdr, uint32_t *bitmap)__be32 *p;READ_BUF (4 ); -READ32 (bmlen); + bmlen =be32_to_cpup (p++); bitmap[0 ] = bitmap[1 ] =0 ;READ_BUF ((bmlen <<2 ));if (bmlen >0 ) { -READ32 (bitmap[0 ]); + bitmap[0 ] =be32_to_cpup (p++);if (bmlen >1 ) -READ32 (bitmap[1 ]); + bitmap[1 ] =be32_to_cpup (p++); }return 0 ; }
@@ -2541,7 +2540,7 @@ static inline int decode_attr_length(struct xdr_stream *xdr, uint32_t *attrlen,__be32 *p;READ_BUF (4 ); -READ32 (*attrlen); + *attrlen =be32_to_cpup (p++); *savep = xdr->p;return 0 ; }
@@ -2567,7 +2566,7 @@ static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_TYPE )) {READ_BUF (4 ); -READ32 (*type); + *type =be32_to_cpup (p++);if (*type <NF4REG || *type >NF4NAMEDATTR ) {dprintk ("%s: bad type %d\n" , __func__, *type);return -EIO ;
@@ -2625,7 +2624,7 @@ static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, uireturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_LINK_SUPPORT )) {READ_BUF (4 ); -READ32 (*res); + *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_LINK_SUPPORT ; }dprintk ("%s: link support=%s\n" , __func__, *res ==0 ?"false" :"true" );
@@ -2641,7 +2640,7 @@ static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap,return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_SYMLINK_SUPPORT )) {READ_BUF (4 ); -READ32 (*res); + *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_SYMLINK_SUPPORT ; }dprintk ("%s: symlink support=%s\n" , __func__, *res ==0 ?"false" :"true" );
@@ -2679,7 +2678,7 @@ static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uintreturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_LEASE_TIME )) {READ_BUF (4 ); -READ32 (*res); + *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_LEASE_TIME ; }dprintk ("%s: file size=%u\n" , __func__, (unsigned int )*res);
@@ -2695,7 +2694,7 @@ static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uintreturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_ACLSUPPORT )) {READ_BUF (4 ); -READ32 (*res); + *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_ACLSUPPORT ; }dprintk ("%s: ACLs supported=%u\n" , __func__, (unsigned int )*res);
@@ -2796,7 +2795,7 @@ static int decode_pathname(struct xdr_stream *xdr, struct nfs4_pathname *path)int status =0 ;READ_BUF (4 ); -READ32 (n); + n =be32_to_cpup (p++);if (n ==0 ) goto root_path;dprintk ("path " );
@@ -2848,7 +2847,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, stif (unlikely (status !=0 )) goto out;READ_BUF (4 ); -READ32 (n); + n =be32_to_cpup (p++);if (n <=0 ) goto out_eio; res->nlocations =0 ;
@@ -2857,7 +2856,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, ststruct nfs4_fs_location *loc = &res->locations[res->nlocations];READ_BUF (4 ); -READ32 (m); + m =be32_to_cpup (p++); loc->nservers =0 ;dprintk ("%s: servers " , __func__);
@@ -2928,7 +2927,7 @@ static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXLINK )) {READ_BUF (4 ); -READ32 (*maxlink); + *maxlink =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_MAXLINK ; }dprintk ("%s: maxlink=%u\n" , __func__, *maxlink);
@@ -2945,7 +2944,7 @@ static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXNAME )) {READ_BUF (4 ); -READ32 (*maxname); + *maxname =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_MAXNAME ; }dprintk ("%s: maxname=%u\n" , __func__, *maxname);
@@ -3005,7 +3004,7 @@ static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, umode_t *mreturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_MODE )) {READ_BUF (4 ); -READ32 (tmp); + tmp =be32_to_cpup (p++); *mode = tmp & ~S_IFMT ; bitmap[1 ] &= ~FATTR4_WORD1_MODE ; ret =NFS_ATTR_FATTR_MODE ;
@@ -3024,7 +3023,7 @@ static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_treturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_NUMLINKS )) {READ_BUF (4 ); -READ32 (*nlink); + *nlink =be32_to_cpup (p++); bitmap[1 ] &= ~FATTR4_WORD1_NUMLINKS ; ret =NFS_ATTR_FATTR_NLINK ; }
@@ -3043,7 +3042,7 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfreturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_OWNER )) {READ_BUF (4 ); -READ32 (len); + len =be32_to_cpup (p++);READ_BUF (len);if (len <XDR_MAX_NETOBJ ) {if (nfs_map_name_to_uid (clp, (char *)p, len, uid) ==0 )
@@ -3071,7 +3070,7 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfreturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_OWNER_GROUP )) {READ_BUF (4 ); -READ32 (len); + len =be32_to_cpup (p++);READ_BUF (len);if (len <XDR_MAX_NETOBJ ) {if (nfs_map_group_to_gid (clp, (char *)p, len, gid) ==0 )
@@ -3101,8 +3100,8 @@ static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rdedev_t tmp;READ_BUF (8 ); -READ32 (major); -READ32 (minor); + major =be32_to_cpup (p++); + minor =be32_to_cpup (p++); tmp =MKDEV (major, minor);if (MAJOR (tmp) == major &&MINOR (tmp) == minor) *rdev = tmp;
@@ -3191,7 +3190,7 @@ static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time)READ_BUF (12 );READ64 (sec); -READ32 (nsec); + nsec =be32_to_cpup (p++); time->tv_sec = (time_t )sec; time->tv_nsec = (long )nsec;return 0 ;
@@ -3273,7 +3272,7 @@ static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *c__be32 *p;READ_BUF (20 ); -READ32 (cinfo->atomic); + cinfo->atomic =be32_to_cpup (p++);READ64 (cinfo->before);READ64 (cinfo->after);return 0 ;
@@ -3289,8 +3288,8 @@ static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access)if (status)return status;READ_BUF (8 ); -READ32 (supp); -READ32 (acc); + supp =be32_to_cpup (p++); + acc =be32_to_cpup (p++); access->supported = supp; access->access = acc;return 0 ;
@@ -3336,7 +3335,7 @@ static int decode_create(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)if ((status =decode_change_info (xdr, cinfo)))return status;READ_BUF (4 ); -READ32 (bmlen); + bmlen =be32_to_cpup (p++);READ_BUF (bmlen <<2 );return 0 ; }
@@ -3591,7 +3590,7 @@ static int decode_getfh(struct xdr_stream *xdr, struct nfs_fh *fh)return status;READ_BUF (4 ); -READ32 (len); + len =be32_to_cpup (p++);if (len >NFS4_FHSIZE )return -EIO ; fh->size = len;
@@ -3622,7 +3621,7 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl)READ_BUF (32 );READ64 (offset);READ64 (length); -READ32 (type); + type =be32_to_cpup (p++);if (fl !=NULL ) { fl->fl_start = (loff_t )offset; fl->fl_end = fl->fl_start + (loff_t )length -1 ;
@@ -3634,7 +3633,7 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl) fl->fl_pid =0 ; }READ64 (clientid); -READ32 (namelen); + namelen =be32_to_cpup (p++);READ_BUF (namelen);return -NFS4ERR_DENIED ; }
@@ -3695,14 +3694,14 @@ static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize)uint32_t limit_type, nblocks, blocksize;READ_BUF (12 ); -READ32 (limit_type); + limit_type =be32_to_cpup (p++);switch (limit_type) {case 1 :READ64 (*maxsize);break ;case 2 : -READ32 (nblocks); -READ32 (blocksize); + nblocks =be32_to_cpup (p++); + blocksize =be32_to_cpup (p++); *maxsize = (uint64_t )nblocks * (uint64_t )blocksize; }return 0 ;
@@ -3714,14 +3713,14 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res)uint32_t delegation_type;READ_BUF (4 ); -READ32 (delegation_type); + delegation_type =be32_to_cpup (p++);if (delegation_type ==NFS4_OPEN_DELEGATE_NONE ) { res->delegation_type =0 ;return 0 ; }READ_BUF (NFS4_STATEID_SIZE +4 );COPYMEM (res->delegation.data,NFS4_STATEID_SIZE ); -READ32 (res->do_recall); + res->do_recall =be32_to_cpup (p++);switch (delegation_type) {case NFS4_OPEN_DELEGATE_READ :
@@ -3752,15 +3751,15 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)decode_change_info (xdr, &res->cinfo);READ_BUF (8 ); -READ32 (res->rflags); -READ32 (bmlen); + res->rflags =be32_to_cpup (p++); + bmlen =be32_to_cpup (p++);if (bmlen >10 ) goto xdr_error;READ_BUF (bmlen <<2 ); savewords =min_t (uint32_t, bmlen,NFS4_BITMAP_SIZE );for (i =0 ; i < savewords; ++i) -READ32 (res->attrset[i]); + res->attrset[i] =be32_to_cpup (p++);for (; i <NFS4_BITMAP_SIZE ; i++) res->attrset[i] =0 ;
@@ -3821,8 +3820,8 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_if (status)return status;READ_BUF (8 ); -READ32 (eof); -READ32 (count); + eof =be32_to_cpup (p++); + count =be32_to_cpup (p++); hdrlen = (u8 *) p - (u8 *) iov->iov_base; recvd = req->rq_rcv_buf.len - hdrlen;if (count > recvd) {
@@ -3948,7 +3947,7 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)/* Convert length of symlink */ READ_BUF (4 ); -READ32 (len); + len =be32_to_cpup (p++);if (len >= rcvbuf->page_len || len <=0 ) {dprintk ("nfs: server returned giant symlink!\n" );return -ENAMETOOLONG ;
@@ -4070,7 +4069,7 @@ static int decode_setattr(struct xdr_stream *xdr)if (status)return status;READ_BUF (4 ); -READ32 (bmlen); + bmlen =be32_to_cpup (p++);READ_BUF (bmlen <<2 );return 0 ; }
@@ -4082,13 +4081,13 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp)int32_t nfserr;READ_BUF (8 ); -READ32 (opnum); + opnum =be32_to_cpup (p++);if (opnum !=OP_SETCLIENTID ) {dprintk ("nfs: decode_setclientid: Server returned operation" " %d\n" , opnum);return -EIO ; } -READ32 (nfserr); + nfserr =be32_to_cpup (p++);if (nfserr ==NFS_OK ) {READ_BUF (8 +NFS4_VERIFIER_SIZE );READ64 (clp->cl_clientid);
@@ -4098,12 +4097,12 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp)/* skip netid string */ READ_BUF (4 ); -READ32 (len); + len =be32_to_cpup (p++);READ_BUF (len);/* skip uaddr string */ READ_BUF (4 ); -READ32 (len); + len =be32_to_cpup (p++);READ_BUF (len);return -NFSERR_CLID_INUSE ; }else
@@ -4127,8 +4126,8 @@ static int decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)return status;READ_BUF (16 ); -READ32 (res->count); -READ32 (res->verf->committed); + res->count =be32_to_cpup (p++); + res->verf->committed =be32_to_cpup (p++);COPYMEM (res->verf->verifier,8 );return 0 ; }
@@ -4154,11 +4153,11 @@ static int decode_exchange_id(struct xdr_stream *xdr,READ_BUF (8 );READ64 (clp->cl_ex_clid);READ_BUF (12 ); -READ32 (clp->cl_seqid); -READ32 (clp->cl_exchange_flags); + clp->cl_seqid =be32_to_cpup (p++); + clp->cl_exchange_flags =be32_to_cpup (p++);/* We ask for SP4_NONE */ -READ32 (dummy); + dummy =be32_to_cpup (p++);if (dummy !=SP4_NONE )return -EIO ;
@@ -4167,17 +4166,17 @@ static int decode_exchange_id(struct xdr_stream *xdr,/* Throw away Major id */ READ_BUF (4 ); -READ32 (dummy); + dummy =be32_to_cpup (p++);READ_BUF (dummy);/* Throw away server_scope */ READ_BUF (4 ); -READ32 (dummy); + dummy =be32_to_cpup (p++);READ_BUF (dummy);/* Throw away Implementation id array */ READ_BUF (4 ); -READ32 (dummy); + dummy =be32_to_cpup (p++);READ_BUF (dummy);return 0 ;
@@ -4190,13 +4189,13 @@ static int decode_chan_attrs(struct xdr_stream *xdr,u32 nr_attrs;READ_BUF (28 ); -READ32 (attrs->headerpadsz); -READ32 (attrs->max_rqst_sz); -READ32 (attrs->max_resp_sz); -READ32 (attrs->max_resp_sz_cached); -READ32 (attrs->max_ops); -READ32 (attrs->max_reqs); -READ32 (nr_attrs); + attrs->headerpadsz =be32_to_cpup (p++); + attrs->max_rqst_sz =be32_to_cpup (p++); + attrs->max_resp_sz =be32_to_cpup (p++); + attrs->max_resp_sz_cached =be32_to_cpup (p++); + attrs->max_ops =be32_to_cpup (p++); + attrs->max_reqs =be32_to_cpup (p++); + nr_attrs =be32_to_cpup (p++);if (unlikely (nr_attrs >1 )) {printk (KERN_WARNING "%s: Invalid rdma channel attrs count %u\n" , __func__, nr_attrs);
@@ -4226,8 +4225,8 @@ static int decode_create_session(struct xdr_stream *xdr,/* seqid, flags */ READ_BUF (8 ); -READ32 (clp->cl_seqid); -READ32 (session->flags); + clp->cl_seqid =be32_to_cpup (p++); + session->flags =be32_to_cpup (p++);/* Channel attributes */ status =decode_chan_attrs (xdr, &session->fc_attrs);
@@ -4275,23 +4274,23 @@ static int decode_sequence(struct xdr_stream *xdr, goto out_err; }/* seqid */ -READ32 (dummy); + dummy =be32_to_cpup (p++);if (dummy != slot->seq_nr) {dprintk ("%s Invalid sequence number\n" , __func__); goto out_err; }/* slot id */ -READ32 (dummy); + dummy =be32_to_cpup (p++);if (dummy != res->sr_slotid) {dprintk ("%s Invalid slot id\n" , __func__); goto out_err; }/* highest slot id - currently not processed */ -READ32 (dummy); + dummy =be32_to_cpup (p++);/* target highest slot id - currently not processed */ -READ32 (dummy); + dummy =be32_to_cpup (p++);/* result flags - currently not processed */ -READ32 (dummy); + dummy =be32_to_cpup (p++); status =0 ; out_err: res->sr_status = status;
Signature · 1 line
1.6.4
RFC PATCH v2 12/21 nfs: nfs4xdr: get rid of READ64
In reply to Benny Halevys/READ64\(\*(.*)\)/p = xdr_decode_hyper(p, \1)/
s/READ64\((.*)\)/p = xdr_decode_hyper(p, &\1)/
--- fs/nfs/nfs4xdr.c | 54 +++++++++++++++++++++++++----------------------------- 1 files changed, 25 insertions(+), 29 deletions(-)
fs/nfs/nfs4xdr.c +25 -29
@@ -2433,10 +2433,6 @@ static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p,* task to translate them into Linux-specific versions which are more * consistent with the style used in NFSv2/v3... */ -#define READ64 (x) do { \ - (x) = (u64)ntohl(*p++) << 32; \ - (x) |= ntohl(*p++); \ -} while (0)#define READTIME (x) do { \ p++; \ (x.tv_sec) = ntohl(*p++); \
@@ -2588,7 +2584,7 @@ static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_treturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_CHANGE )) {READ_BUF (8 ); -READ64 (*change); + p =xdr_decode_hyper (p, change); bitmap[0 ] &= ~FATTR4_WORD0_CHANGE ; ret =NFS_ATTR_FATTR_CHANGE ; }
@@ -2607,7 +2603,7 @@ static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_SIZE )) {READ_BUF (8 ); -READ64 (*size); + p =xdr_decode_hyper (p, size); bitmap[0 ] &= ~FATTR4_WORD0_SIZE ; ret =NFS_ATTR_FATTR_SIZE ; }
@@ -2658,8 +2654,8 @@ static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfsreturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FSID )) {READ_BUF (16 ); -READ64 (fsid->major); -READ64 (fsid->minor); + p =xdr_decode_hyper (p, &fsid->major); + p =xdr_decode_hyper (p, &fsid->minor); bitmap[0 ] &= ~FATTR4_WORD0_FSID ; ret =NFS_ATTR_FATTR_FSID ; }
@@ -2711,7 +2707,7 @@ static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_treturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILEID )) {READ_BUF (8 ); -READ64 (*fileid); + p =xdr_decode_hyper (p, fileid); bitmap[0 ] &= ~FATTR4_WORD0_FILEID ; ret =NFS_ATTR_FATTR_FILEID ; }
@@ -2729,7 +2725,7 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitmareturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_MOUNTED_ON_FILEID )) {READ_BUF (8 ); -READ64 (*fileid); + p =xdr_decode_hyper (p, fileid); bitmap[1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ; ret =NFS_ATTR_FATTR_FILEID ; }
@@ -2747,7 +2743,7 @@ static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uinreturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILES_AVAIL )) {READ_BUF (8 ); -READ64 (*res); + p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_AVAIL ; }dprintk ("%s: files avail=%Lu\n" , __func__, (unsigned long long )*res);
@@ -2764,7 +2760,7 @@ static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uintreturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILES_FREE )) {READ_BUF (8 ); -READ64 (*res); + p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_FREE ; }dprintk ("%s: files free=%Lu\n" , __func__, (unsigned long long )*res);
@@ -2781,7 +2777,7 @@ static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uinreturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILES_TOTAL )) {READ_BUF (8 ); -READ64 (*res); + p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_TOTAL ; }dprintk ("%s: files total=%Lu\n" , __func__, (unsigned long long )*res);
@@ -2910,7 +2906,7 @@ static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uinreturn -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXFILESIZE )) {READ_BUF (8 ); -READ64 (*res); + p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_MAXFILESIZE ; }dprintk ("%s: maxfilesize=%Lu\n" , __func__, (unsigned long long )*res);
@@ -2962,7 +2958,7 @@ static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_if (likely (bitmap[0 ] &FATTR4_WORD0_MAXREAD )) {uint64_t maxread;READ_BUF (8 ); -READ64 (maxread); + p =xdr_decode_hyper (p, &maxread);if (maxread >0x7FFFFFFF ) maxread =0x7FFFFFFF ; *res = (uint32_t )maxread;
@@ -2983,7 +2979,7 @@ static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32if (likely (bitmap[0 ] &FATTR4_WORD0_MAXWRITE )) {uint64_t maxwrite;READ_BUF (8 ); -READ64 (maxwrite); + p =xdr_decode_hyper (p, &maxwrite);if (maxwrite >0x7FFFFFFF ) maxwrite =0x7FFFFFFF ; *res = (uint32_t )maxwrite;
@@ -3122,7 +3118,7 @@ static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uinreturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_AVAIL )) {READ_BUF (8 ); -READ64 (*res); + p =xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_AVAIL ; }dprintk ("%s: space avail=%Lu\n" , __func__, (unsigned long long )*res);
@@ -3139,7 +3135,7 @@ static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uintreturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_FREE )) {READ_BUF (8 ); -READ64 (*res); + p =xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_FREE ; }dprintk ("%s: space free=%Lu\n" , __func__, (unsigned long long )*res);
@@ -3156,7 +3152,7 @@ static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uinreturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_TOTAL )) {READ_BUF (8 ); -READ64 (*res); + p =xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_TOTAL ; }dprintk ("%s: space total=%Lu\n" , __func__, (unsigned long long )*res);
@@ -3173,7 +3169,7 @@ static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uintreturn -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_USED )) {READ_BUF (8 ); -READ64 (*used); + p =xdr_decode_hyper (p, used); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_USED ; ret =NFS_ATTR_FATTR_SPACE_USED ; }
@@ -3189,7 +3185,7 @@ static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time)uint32_t nsec;READ_BUF (12 ); -READ64 (sec); + p =xdr_decode_hyper (p, &sec); nsec =be32_to_cpup (p++); time->tv_sec = (time_t )sec; time->tv_nsec = (long )nsec;
@@ -3273,8 +3269,8 @@ static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *cREAD_BUF (20 ); cinfo->atomic =be32_to_cpup (p++); -READ64 (cinfo->before); -READ64 (cinfo->after); + p =xdr_decode_hyper (p, &cinfo->before); + p =xdr_decode_hyper (p, &cinfo->after);return 0 ; }
@@ -3619,8 +3615,8 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl)uint32_t namelen, type;READ_BUF (32 ); -READ64 (offset); -READ64 (length); + p =xdr_decode_hyper (p, &offset); + p =xdr_decode_hyper (p, &length); type =be32_to_cpup (p++);if (fl !=NULL ) { fl->fl_start = (loff_t )offset;
@@ -3632,7 +3628,7 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl) fl->fl_type =F_RDLCK ; fl->fl_pid =0 ; } -READ64 (clientid); + p =xdr_decode_hyper (p, &clientid); namelen =be32_to_cpup (p++);READ_BUF (namelen);return -NFS4ERR_DENIED ;
@@ -3697,7 +3693,7 @@ static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize) limit_type =be32_to_cpup (p++);switch (limit_type) {case 1 : -READ64 (*maxsize); + p =xdr_decode_hyper (p, maxsize);break ;case 2 : nblocks =be32_to_cpup (p++);
@@ -4090,7 +4086,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp) nfserr =be32_to_cpup (p++);if (nfserr ==NFS_OK ) {READ_BUF (8 +NFS4_VERIFIER_SIZE ); -READ64 (clp->cl_clientid); + p =xdr_decode_hyper (p, &clp->cl_clientid);COPYMEM (clp->cl_confirm.data,NFS4_VERIFIER_SIZE ); }else if (nfserr ==NFSERR_CLID_INUSE ) {uint32_t len;
@@ -4151,7 +4147,7 @@ static int decode_exchange_id(struct xdr_stream *xdr,return status;READ_BUF (8 ); -READ64 (clp->cl_ex_clid); + p =xdr_decode_hyper (p, &clp->cl_ex_clid);READ_BUF (12 ); clp->cl_seqid =be32_to_cpup (p++); clp->cl_exchange_flags =be32_to_cpup (p++);
Signature · 1 line
1.6.4
RFC PATCH v2 13/21 nfs: nfs4xdr: get rid of READTIME
In reply to Benny HalevyIt has no users.
--- fs/nfs/nfs4xdr.c | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-)
fs/nfs/nfs4xdr.c +0 -5
@@ -2433,11 +2433,6 @@ static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p,* task to translate them into Linux-specific versions which are more * consistent with the style used in NFSv2/v3... */ -#define READTIME (x) do { \ - p++; \ - (x.tv_sec) = ntohl(*p++); \ - (x.tv_nsec) = ntohl(*p++); \ -} while (0)#define COPYMEM (x,nbytes) do { \ memcpy((x), p, nbytes); \ p += XDR_QUADLEN(nbytes); \
Signature · 1 line
1.6.4
RFC PATCH v2 14/21 nfs: nfs4xdr: introduce print_overflow_msg
In reply to Benny HalevyPart fo the nfs4xdr cleanup. READ_BUF will go away.
--- fs/nfs/nfs4xdr.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-)
fs/nfs/nfs4xdr.c +8 -4
@@ -2441,14 +2441,18 @@ static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p,#define READ_BUF (nbytes) do { \ p = xdr_inline_decode(xdr, nbytes); \ if (unlikely(!p)) { \ - dprintk("nfs: %s: prematurely hit end of receive" \ - " buffer\n", __func__); \ - dprintk("nfs: %s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \ - __func__, xdr->p, nbytes, xdr->end); \ + print_overflow_msg(__func__, xdr); \ return -EIO; \ } \ } while (0) +static void print_overflow_msg (const char *func,const struct xdr_stream *xdr) +{ +dprintk ("nfs: %s: prematurely hit end of receive buffer. " +"Remaining buffer length is %tu words.\n" , + func, xdr->end - xdr->p); +} +static int decode_opaque_inline (struct xdr_stream *xdr,unsigned int *len,char **string) {__be32 *p;
Signature · 1 line
1.6.4
RFC PATCH v2 15/21 nfs: nfs4xdr: introduce decode_opaque_fixed and decode_stateid helpers
In reply to Benny Halevy--- fs/nfs/nfs4xdr.c | 71 ++++++++++++++++++++++++++++++----------------------- 1 files changed, 40 insertions(+), 31 deletions(-)
fs/nfs/nfs4xdr.c +40 -31
@@ -3290,19 +3290,34 @@ static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access)return 0 ; } -static int decode_close (struct xdr_stream *xdr,struct nfs_closeres *res) +static int decode_opaque_fixed (struct xdr_stream *xdr,void *buf,size_t len) {__be32 *p; + + p =xdr_inline_decode (xdr, len); +if (likely (p)) { +memcpy (buf, p, len); +return 0 ; + } +print_overflow_msg (__func__, xdr); +return -EIO ; +} + +static int decode_stateid (struct xdr_stream *xdr,nfs4_stateid *stateid) +{ +return decode_opaque_fixed (xdr, stateid->data,NFS4_STATEID_SIZE ); +} + +static int decode_close (struct xdr_stream *xdr,struct nfs_closeres *res) +{int status; status =decode_op_hdr (xdr,OP_CLOSE );if (status != -EIO )nfs_increment_open_seqid (status, res->seqid); -if (status) -return status; -READ_BUF (NFS4_STATEID_SIZE ); -COPYMEM (res->stateid.data,NFS4_STATEID_SIZE ); -return 0 ; +if (!status) + status =decode_stateid (xdr, &res->stateid); +return status; }static int decode_commit (struct xdr_stream *xdr,struct nfs_writeres *res)
@@ -3635,15 +3650,15 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl)static int decode_lock (struct xdr_stream *xdr,struct nfs_lock_res *res) { -__be32 *p;int status; status =decode_op_hdr (xdr,OP_LOCK );if (status == -EIO ) goto out;if (status ==0 ) { -READ_BUF (NFS4_STATEID_SIZE ); -COPYMEM (res->stateid.data,NFS4_STATEID_SIZE ); + status =decode_stateid (xdr, &res->stateid); +if (unlikely (status)) + goto out; }else if (status == -NFS4ERR_DENIED ) status =decode_lock_denied (xdr,NULL );if (res->open_seqid !=NULL )
@@ -3664,16 +3679,13 @@ static int decode_lockt(struct xdr_stream *xdr, struct nfs_lockt_res *res)static int decode_locku (struct xdr_stream *xdr,struct nfs_locku_res *res) { -__be32 *p;int status; status =decode_op_hdr (xdr,OP_LOCKU );if (status != -EIO )nfs_increment_lock_seqid (status, res->seqid); -if (status ==0 ) { -READ_BUF (NFS4_STATEID_SIZE ); -COPYMEM (res->stateid.data,NFS4_STATEID_SIZE ); - } +if (status ==0 ) + status =decode_stateid (xdr, &res->stateid);return status; }
@@ -3706,6 +3718,7 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) {__be32 *p;uint32_t delegation_type; +int status;READ_BUF (4 ); delegation_type =be32_to_cpup (p++);
@@ -3713,8 +3726,10 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) res->delegation_type =0 ;return 0 ; } -READ_BUF (NFS4_STATEID_SIZE +4 ); -COPYMEM (res->delegation.data,NFS4_STATEID_SIZE ); + status =decode_stateid (xdr, &res->delegation); +if (unlikely (status)) +return status; +READ_BUF (4 ); res->do_recall =be32_to_cpup (p++);switch (delegation_type) {
@@ -3738,10 +3753,10 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res) status =decode_op_hdr (xdr,OP_OPEN );if (status != -EIO )nfs_increment_open_seqid (status, res->seqid); -if (status) +if (!status) + status =decode_stateid (xdr, &res->stateid); +if (unlikely (status))return status; -READ_BUF (NFS4_STATEID_SIZE ); -COPYMEM (res->stateid.data,NFS4_STATEID_SIZE );decode_change_info (xdr, &res->cinfo);
@@ -3766,32 +3781,26 @@ xdr_error:static int decode_open_confirm (struct xdr_stream *xdr,struct nfs_open_confirmres *res) { -__be32 *p;int status; status =decode_op_hdr (xdr,OP_OPEN_CONFIRM );if (status != -EIO )nfs_increment_open_seqid (status, res->seqid); -if (status) -return status; -READ_BUF (NFS4_STATEID_SIZE ); -COPYMEM (res->stateid.data,NFS4_STATEID_SIZE ); -return 0 ; +if (!status) + status =decode_stateid (xdr, &res->stateid); +return status; }static int decode_open_downgrade (struct xdr_stream *xdr,struct nfs_closeres *res) { -__be32 *p;int status; status =decode_op_hdr (xdr,OP_OPEN_DOWNGRADE );if (status != -EIO )nfs_increment_open_seqid (status, res->seqid); -if (status) -return status; -READ_BUF (NFS4_STATEID_SIZE ); -COPYMEM (res->stateid.data,NFS4_STATEID_SIZE ); -return 0 ; +if (!status) + status =decode_stateid (xdr, &res->stateid); +return status; }static int decode_putfh (struct xdr_stream *xdr)
Signature · 1 line
1.6.4
RFC PATCH v2 16/21 nfs: nfs4xdr: introduce decode_verifier helper
In reply to Benny Halevy--- fs/nfs/nfs4xdr.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-)
fs/nfs/nfs4xdr.c +11 -9
@@ -3320,17 +3320,19 @@ static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)return status; } +static int decode_verifier (struct xdr_stream *xdr,void *verifier) +{ +return decode_opaque_fixed (xdr, verifier,8 ); +} +static int decode_commit (struct xdr_stream *xdr,struct nfs_writeres *res) { -__be32 *p;int status; status =decode_op_hdr (xdr,OP_COMMIT ); -if (status) -return status; -READ_BUF (8 ); -COPYMEM (res->verf->verifier,8 ); -return 0 ; +if (!status) + status =decode_verifier (xdr, res->verf->verifier); +return status; }static int decode_create (struct xdr_stream *xdr,struct nfs4_change_info *cinfo)
@@ -3852,10 +3854,10 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct nint status; status =decode_op_hdr (xdr,OP_READDIR ); -if (status) +if (!status) + status =decode_verifier (xdr, readdir->verifier.data); +if (unlikely (status))return status; -READ_BUF (8 ); -COPYMEM (readdir->verifier.data,8 ); dprintk("%s: verifier = %08x:%08x\n", __func__, ((u32 *)readdir->verifier.data)[0],
Signature · 1 line
1.6.4
Re: [PATCH RFC v2 16/21] nfs: nfs4xdr: introduce decode_verifier helper
Quoted 39 lines · Benny Halevy
Signed-off-by Benny Halevy <[email protected]>--- fs/nfs/nfs4xdr.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-)fs/nfs/nfs4xdr.c +8
-6@@ -3320,17 +3320,19 @@ static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)return status; } +static int decode_verifier (struct xdr_stream *xdr,void *verifier) +{ +return decode_opaque_fixed (xdr, verifier,8 ); +} +static int decode_commit (struct xdr_stream *xdr,struct nfs_writeres *res) { -__be32 *p;int status; status =decode_op_hdr (xdr,OP_COMMIT ); -if (status) -return status; -READ_BUF (8 ); -COPYMEM (res->verf->verifier,8 ); -return 0 ; +if (!status) + status =decode_verifier (xdr, res->verf->verifier); +return status; }static int decode_create (struct xdr_stream *xdr,struct nfs4_change_info *cinfo)@@ -3852,10 +3854,10 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct nint status; status =decode_op_hdr (xdr,OP_READDIR );
fs/nfs/nfs4xdr.c static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n · line 3863
Quoted 10 lines
fs/nfs/nfs4xdr.c +3
-3-if (status) +if (!status) + status =decode_verifier (xdr, readdir->verifier.data); +if (unlikely (status))return status; -READ_BUF (8 ); -COPYMEM (readdir->verifier.data,8 ); dprintk("%s: verifier = %08x:%08x\n", __func__, ((u32 *)readdir->verifier.data)[0],
This introduces an uninitialised variable warning into decode_readdir. The fix would be to use xdr->p in the calculation of hdrlen.
I'll add that, no need to resend.
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
Re: [PATCH RFC v2 16/21] nfs: nfs4xdr: introduce decode_verifier helper
Quoted 54 lines · Trond Myklebust
Quoted 39 lines · Benny Halevy
Signed-off-by Benny Halevy <[email protected]>--- fs/nfs/nfs4xdr.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-)fs/nfs/nfs4xdr.c +8
-6@@ -3320,17 +3320,19 @@ static int decode_close(struct xdr_stream *xdr, struct nfs_closeres *res)return status; } +static int decode_verifier (struct xdr_stream *xdr,void *verifier) +{ +return decode_opaque_fixed (xdr, verifier,8 ); +} +static int decode_commit (struct xdr_stream *xdr,struct nfs_writeres *res) { -__be32 *p;int status; status =decode_op_hdr (xdr,OP_COMMIT ); -if (status) -return status; -READ_BUF (8 ); -COPYMEM (res->verf->verifier,8 ); -return 0 ; +if (!status) + status =decode_verifier (xdr, res->verf->verifier); +return status; }static int decode_create (struct xdr_stream *xdr,struct nfs4_change_info *cinfo)@@ -3852,10 +3854,10 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct nint status; status =decode_op_hdr (xdr,OP_READDIR );fs/nfs/nfs4xdr.c static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n · line 3863
Quoted 10 lines
fs/nfs/nfs4xdr.c +3
-3-if (status) +if (!status) + status =decode_verifier (xdr, readdir->verifier.data); +if (unlikely (status))return status; -READ_BUF (8 ); -COPYMEM (readdir->verifier.data,8 ); dprintk("%s: verifier = %08x:%08x\n", __func__, ((u32 *)readdir->verifier.data)[0],This introduces an uninitialised variable warning into
decode_readdir. The fix would be to usexdr->pin the calculation of hdrlen.
Quoted 1 line
I'll add that, no need to resend.
Thanks!
Sadly, I didn't see this warning with gcc 4.4.0 on Fedora 11. I'm not sure why, but without the -Os (optimize for size) option it does print the warning. I tried this by manually running the gcc command "make KBUILD_VERBOSE=1" prints - with and without the -Os option.
Benny
RFC PATCH v2 17/21 nfs: nfs4xdr: introduce decode_sessionid helper
In reply to Benny Halevy--- fs/nfs/nfs4xdr.c | 25 +++++++++++++++---------- 1 files changed, 15 insertions(+), 10 deletions(-)
fs/nfs/nfs4xdr.c +15 -10
@@ -4212,6 +4212,11 @@ static int decode_chan_attrs(struct xdr_stream *xdr,return 0 ; } +static int decode_sessionid (struct xdr_stream *xdr,struct nfs4_sessionid *sid) +{ +return decode_opaque_fixed (xdr, sid->data,NFS4_MAX_SESSIONID_LEN ); +} +static int decode_create_session (struct xdr_stream *xdr,struct nfs41_create_session_res *res) {
@@ -4221,14 +4226,11 @@ static int decode_create_session(struct xdr_stream *xdr,struct nfs4_session *session = clp->cl_session; status =decode_op_hdr (xdr,OP_CREATE_SESSION ); - -if (status) +if (!status) + status =decode_sessionid (xdr, &session->sess_id); +if (unlikely (status))return status; -/* sessionid */ -READ_BUF (NFS4_MAX_SESSIONID_LEN ); -COPYMEM (&session->sess_id,NFS4_MAX_SESSIONID_LEN ); -/* seqid, flags */ READ_BUF (8 ); clp->cl_seqid =be32_to_cpup (p++);
@@ -4262,7 +4264,9 @@ static int decode_sequence(struct xdr_stream *xdr,return 0 ; status =decode_op_hdr (xdr,OP_SEQUENCE ); -if (status) +if (!status) + status =decode_sessionid (xdr, &id); +if (unlikely (status)) goto out_err;/*
@@ -4271,15 +4275,16 @@ static int decode_sequence(struct xdr_stream *xdr,*/ status = -ESERVERFAULT ; - slot = &res->sr_session->fc_slot_table.slots[res->sr_slotid]; -READ_BUF (NFS4_MAX_SESSIONID_LEN +20 ); -COPYMEM (id.data,NFS4_MAX_SESSIONID_LEN );if (memcmp (id.data, res->sr_session->sess_id.data,NFS4_MAX_SESSIONID_LEN )) {dprintk ("%s Invalid session id\n" , __func__); goto out_err; } + +READ_BUF (20 ); +/* seqid */ + slot = &res->sr_session->fc_slot_table.slots[res->sr_slotid]; dummy =be32_to_cpup (p++);if (dummy != slot->seq_nr) {dprintk ("%s Invalid sequence number\n" , __func__);
Signature · 1 line
1.6.4
RFC PATCH v2 18/21 nfs: nfs4xdr: get rid of COPYMEM
In reply to Benny HalevyJust directly call memcpy.
--- fs/nfs/nfs4xdr.c | 11 +++-------- 1 files changed, 3 insertions(+), 8 deletions(-)
fs/nfs/nfs4xdr.c +3 -8
@@ -2433,11 +2433,6 @@ static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p,* task to translate them into Linux-specific versions which are more * consistent with the style used in NFSv2/v3... */ -#define COPYMEM (x,nbytes) do { \ - memcpy((x), p, nbytes); \ - p += XDR_QUADLEN(nbytes); \ -} while (0) -#define READ_BUF (nbytes) do { \ p = xdr_inline_decode(xdr, nbytes); \ if (unlikely(!p)) { \
@@ -3607,7 +3602,7 @@ static int decode_getfh(struct xdr_stream *xdr, struct nfs_fh *fh)return -EIO ; fh->size = len;READ_BUF (len); -COPYMEM (fh->data, len); +memcpy (fh->data, p, len);return 0 ; }
@@ -4097,7 +4092,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp)if (nfserr ==NFS_OK ) {READ_BUF (8 +NFS4_VERIFIER_SIZE ); p =xdr_decode_hyper (p, &clp->cl_clientid); -COPYMEM (clp->cl_confirm.data,NFS4_VERIFIER_SIZE ); +memcpy (clp->cl_confirm.data, p,NFS4_VERIFIER_SIZE ); }else if (nfserr ==NFSERR_CLID_INUSE ) {uint32_t len;
@@ -4134,7 +4129,7 @@ static int decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)READ_BUF (16 ); res->count =be32_to_cpup (p++); res->verf->committed =be32_to_cpup (p++); -COPYMEM (res->verf->verifier,8 ); +memcpy (res->verf->verifier, p,8 );return 0 ; }
Signature · 1 line
1.6.4
RFC PATCH v2 19/21 nfs: nfs4xdr: simplify decode_exchange_id by reusing decode_opaque_inline
In reply to Benny Halevy--- fs/nfs/nfs4xdr.c | 19 ++++++++++--------- 1 files changed, 10 insertions(+), 9 deletions(-)
fs/nfs/nfs4xdr.c +10 -9
@@ -4144,6 +4144,7 @@ static int decode_exchange_id(struct xdr_stream *xdr, {__be32 *p;uint32_t dummy; +char *dummy_str;int status;struct nfs_client *clp = res->client;
@@ -4166,19 +4167,19 @@ static int decode_exchange_id(struct xdr_stream *xdr,READ_BUF (8 );/* Throw away Major id */ -READ_BUF (4 ); - dummy =be32_to_cpup (p++); -READ_BUF (dummy); + status =decode_opaque_inline (xdr, &dummy, &dummy_str); +if (unlikely (status)) +return status;/* Throw away server_scope */ -READ_BUF (4 ); - dummy =be32_to_cpup (p++); -READ_BUF (dummy); + status =decode_opaque_inline (xdr, &dummy, &dummy_str); +if (unlikely (status)) +return status;/* Throw away Implementation id array */ -READ_BUF (4 ); - dummy =be32_to_cpup (p++); -READ_BUF (dummy); + status =decode_opaque_inline (xdr, &dummy, &dummy_str); +if (unlikely (status)) +return status;return 0 ; }
Signature · 1 line
1.6.4
RFC PATCH v2 20/21 nfs: nfs4xdr: get rid of READ_BUF
In reply to Benny HalevyUse xdr_inline_decode instead.
Open code debug printout and error return.
--- fs/nfs/nfs4xdr.c | 475 +++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 379 insertions(+), 96 deletions(-)
fs/nfs/nfs4xdr.c +379 -96
@@ -2423,24 +2423,6 @@ static int nfs4_xdr_enc_get_lease_time(struct rpc_rqst *req, uint32_t *p, }#endif /* CONFIG_NFS_V4_1 */ -/* -* START OF "GENERIC" DECODE ROUTINES. -* These may look a little ugly since they are imported from a "generic" -* set of XDR encode/decode routines which are intended to be shared by -* all of our NFSv4 implementations (OpenBSD, MacOS X...). -* -* If the pain of reading these is too great, it should be a straightforward -* task to translate them into Linux-specific versions which are more -* consistent with the style used in NFSv2/v3... -*/ -#define READ_BUF (nbytes) do { \ - p = xdr_inline_decode(xdr, nbytes); \ - if (unlikely(!p)) { \ - print_overflow_msg(__func__, xdr); \ - return -EIO; \ - } \ -} while (0) -static void print_overflow_msg (const char *func,const struct xdr_stream *xdr) { dprintk("nfs: %s: prematurely hit end of receive buffer. "
@@ -2452,28 +2434,42 @@ static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char {__be32 *p; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *len =be32_to_cpup (p++); -READ_BUF (*len); + p =xdr_inline_decode (xdr, *len); +if (unlikely (!p)) + goto out_overflow; *string = (char *)p;return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_compound_hdr (struct xdr_stream *xdr,struct compound_hdr *hdr) {__be32 *p; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; hdr->status =be32_to_cpup (p++); hdr->taglen =be32_to_cpup (p++); -READ_BUF (hdr->taglen +4 ); + p =xdr_inline_decode (xdr, hdr->taglen +4 ); +if (unlikely (!p)) + goto out_overflow; hdr->tag = (char *)p; p +=XDR_QUADLEN (hdr->taglen); hdr->nops =be32_to_cpup (p++);if (unlikely (hdr->nops <1 ))return nfs4_stat_to_errno (hdr->status);return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_op_hdr (struct xdr_stream *xdr,enum nfs_opnum4 expected)
@@ -2482,7 +2478,9 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)uint32_t opnum;int32_t nfserr; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; opnum =be32_to_cpup (p++);if (opnum != expected) { dprintk("nfs: Server returned operation"
@@ -2494,6 +2492,9 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)if (nfserr !=NFS_OK )return nfs4_stat_to_errno (nfserr);return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }/* Dummy routine */
@@ -2503,8 +2504,11 @@ static int decode_ace(struct xdr_stream *xdr, void *ace, struct nfs_client *clp)unsigned int strlen;char *str; -READ_BUF (12 ); -return decode_opaque_inline (xdr, &strlen, &str); + p =xdr_inline_decode (xdr,12 ); +if (likely (p)) +return decode_opaque_inline (xdr, &strlen, &str); +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_bitmap (struct xdr_stream *xdr,uint32_t *bitmap)
@@ -2512,27 +2516,39 @@ static int decode_attr_bitmap(struct xdr_stream *xdr, uint32_t *bitmap)uint32_t bmlen;__be32 *p; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; bmlen =be32_to_cpup (p++); bitmap[0 ] = bitmap[1 ] =0 ; -READ_BUF ((bmlen <<2 )); + p =xdr_inline_decode (xdr, (bmlen <<2 )); +if (unlikely (!p)) + goto out_overflow;if (bmlen >0 ) { bitmap[0 ] =be32_to_cpup (p++);if (bmlen >1 ) bitmap[1 ] =be32_to_cpup (p++); }return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static inline int decode_attr_length (struct xdr_stream *xdr,uint32_t *attrlen,__be32 **savep) {__be32 *p; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *attrlen =be32_to_cpup (p++); *savep = xdr->p;return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_supported (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *bitmask)
@@ -2555,7 +2571,9 @@ static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t *if (unlikely (bitmap[0 ] & (FATTR4_WORD0_TYPE -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_TYPE )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *type =be32_to_cpup (p++);if (*type <NF4REG || *type >NF4NAMEDATTR ) {dprintk ("%s: bad type %d\n" , __func__, *type);
@@ -2566,6 +2584,9 @@ static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t * }dprintk ("%s: type=0%o\n" , __func__, nfs_type2fmt[*type]);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_change (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *change)
@@ -2577,7 +2598,9 @@ static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_tif (unlikely (bitmap[0 ] & (FATTR4_WORD0_CHANGE -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_CHANGE )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, change); bitmap[0 ] &= ~FATTR4_WORD0_CHANGE ; ret =NFS_ATTR_FATTR_CHANGE ;
@@ -2585,6 +2608,9 @@ static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_tdprintk ("%s: change attribute=%Lu\n" , __func__, (unsigned long long )*change);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_size (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *size)
@@ -2596,13 +2622,18 @@ static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t *if (unlikely (bitmap[0 ] & (FATTR4_WORD0_SIZE -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_SIZE )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, size); bitmap[0 ] &= ~FATTR4_WORD0_SIZE ; ret =NFS_ATTR_FATTR_SIZE ; }dprintk ("%s: file size=%Lu\n" , __func__, (unsigned long long )*size);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_link_support (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *res)
@@ -2613,12 +2644,17 @@ static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, uiif (unlikely (bitmap[0 ] & (FATTR4_WORD0_LINK_SUPPORT -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_LINK_SUPPORT )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_LINK_SUPPORT ; }dprintk ("%s: link support=%s\n" , __func__, *res ==0 ?"false" :"true" );return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_symlink_support (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *res)
@@ -2629,12 +2665,17 @@ static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap,if (unlikely (bitmap[0 ] & (FATTR4_WORD0_SYMLINK_SUPPORT -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_SYMLINK_SUPPORT )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_SYMLINK_SUPPORT ; }dprintk ("%s: symlink support=%s\n" , __func__, *res ==0 ?"false" :"true" );return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_fsid (struct xdr_stream *xdr,uint32_t *bitmap,struct nfs_fsid *fsid)
@@ -2647,7 +2688,9 @@ static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfsif (unlikely (bitmap[0 ] & (FATTR4_WORD0_FSID -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FSID )) { -READ_BUF (16 ); + p =xdr_inline_decode (xdr,16 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, &fsid->major); p =xdr_decode_hyper (p, &fsid->minor); bitmap[0 ] &= ~FATTR4_WORD0_FSID ;
@@ -2657,6 +2700,9 @@ static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs (unsigned long long )fsid->major, (unsigned long long)fsid->minor);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_lease_time (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *res)
@@ -2667,12 +2713,17 @@ static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uintif (unlikely (bitmap[0 ] & (FATTR4_WORD0_LEASE_TIME -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_LEASE_TIME )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_LEASE_TIME ; }dprintk ("%s: file size=%u\n" , __func__, (unsigned int )*res);return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_aclsupport (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *res)
@@ -2683,12 +2734,17 @@ static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uintif (unlikely (bitmap[0 ] & (FATTR4_WORD0_ACLSUPPORT -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_ACLSUPPORT )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *res =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_ACLSUPPORT ; }dprintk ("%s: ACLs supported=%u\n" , __func__, (unsigned int )*res);return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_fileid (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *fileid)
@@ -2700,13 +2756,18 @@ static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_tif (unlikely (bitmap[0 ] & (FATTR4_WORD0_FILEID -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILEID )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, fileid); bitmap[0 ] &= ~FATTR4_WORD0_FILEID ; ret =NFS_ATTR_FATTR_FILEID ; }dprintk ("%s: fileid=%Lu\n" , __func__, (unsigned long long )*fileid);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_mounted_on_fileid (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *fileid)
@@ -2718,13 +2779,18 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitmaif (unlikely (bitmap[1 ] & (FATTR4_WORD1_MOUNTED_ON_FILEID -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_MOUNTED_ON_FILEID )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, fileid); bitmap[1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ; ret =NFS_ATTR_FATTR_FILEID ; }dprintk ("%s: fileid=%Lu\n" , __func__, (unsigned long long )*fileid);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_files_avail (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *res)
@@ -2736,12 +2802,17 @@ static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uinif (unlikely (bitmap[0 ] & (FATTR4_WORD0_FILES_AVAIL -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILES_AVAIL )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_AVAIL ; }dprintk ("%s: files avail=%Lu\n" , __func__, (unsigned long long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_files_free (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *res)
@@ -2753,12 +2824,17 @@ static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uintif (unlikely (bitmap[0 ] & (FATTR4_WORD0_FILES_FREE -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILES_FREE )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_FREE ; }dprintk ("%s: files free=%Lu\n" , __func__, (unsigned long long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_files_total (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *res)
@@ -2770,12 +2846,17 @@ static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uinif (unlikely (bitmap[0 ] & (FATTR4_WORD0_FILES_TOTAL -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_FILES_TOTAL )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_TOTAL ; }dprintk ("%s: files total=%Lu\n" , __func__, (unsigned long long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_pathname (struct xdr_stream *xdr,struct nfs4_pathname *path)
@@ -2784,7 +2865,9 @@ static int decode_pathname(struct xdr_stream *xdr, struct nfs4_pathname *path)__be32 *p;int status =0 ; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; n =be32_to_cpup (p++);if (n ==0 ) goto root_path;
@@ -2819,6 +2902,9 @@ out_eio:dprintk (" status %d" , status); status = -EIO ; goto out; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_fs_locations (struct xdr_stream *xdr,uint32_t *bitmap,struct nfs4_fs_locations *res)
@@ -2836,7 +2922,9 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st status =decode_pathname (xdr, &res->fs_path);if (unlikely (status !=0 )) goto out; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; n =be32_to_cpup (p++);if (n <=0 ) goto out_eio;
@@ -2845,7 +2933,9 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, stu32 m;struct nfs4_fs_location *loc = &res->locations[res->nlocations]; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; m =be32_to_cpup (p++); loc->nservers =0 ;
@@ -2885,6 +2975,8 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st out:dprintk ("%s: fs_locations done, error = %d\n" , __func__, status);return status; +out_overflow: +print_overflow_msg (__func__, xdr); out_eio: status = -EIO ; goto out;
@@ -2899,12 +2991,17 @@ static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uinif (unlikely (bitmap[0 ] & (FATTR4_WORD0_MAXFILESIZE -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXFILESIZE )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_MAXFILESIZE ; }dprintk ("%s: maxfilesize=%Lu\n" , __func__, (unsigned long long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_maxlink (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *maxlink)
@@ -2916,12 +3013,17 @@ static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_if (unlikely (bitmap[0 ] & (FATTR4_WORD0_MAXLINK -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXLINK )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *maxlink =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_MAXLINK ; }dprintk ("%s: maxlink=%u\n" , __func__, *maxlink);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_maxname (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *maxname)
@@ -2933,12 +3035,17 @@ static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_if (unlikely (bitmap[0 ] & (FATTR4_WORD0_MAXNAME -1U )))return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXNAME )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *maxname =be32_to_cpup (p++); bitmap[0 ] &= ~FATTR4_WORD0_MAXNAME ; }dprintk ("%s: maxname=%u\n" , __func__, *maxname);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_maxread (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *res)
@@ -2951,7 +3058,9 @@ static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXREAD )) {uint64_t maxread; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, &maxread);if (maxread >0x7FFFFFFF ) maxread =0x7FFFFFFF ;
@@ -2960,6 +3069,9 @@ static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_ }dprintk ("%s: maxread=%lu\n" , __func__, (unsigned long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_maxwrite (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *res)
@@ -2972,7 +3084,9 @@ static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32return -EIO ;if (likely (bitmap[0 ] &FATTR4_WORD0_MAXWRITE )) {uint64_t maxwrite; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, &maxwrite);if (maxwrite >0x7FFFFFFF ) maxwrite =0x7FFFFFFF ;
@@ -2981,6 +3095,9 @@ static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32 }dprintk ("%s: maxwrite=%lu\n" , __func__, (unsigned long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_mode (struct xdr_stream *xdr,uint32_t *bitmap,umode_t *mode)
@@ -2993,7 +3110,9 @@ static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, umode_t *mif (unlikely (bitmap[1 ] & (FATTR4_WORD1_MODE -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_MODE )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; tmp =be32_to_cpup (p++); *mode = tmp & ~S_IFMT ; bitmap[1 ] &= ~FATTR4_WORD1_MODE ;
@@ -3001,6 +3120,9 @@ static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, umode_t *m }dprintk ("%s: file mode=0%o\n" , __func__, (unsigned int )*mode);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_nlink (struct xdr_stream *xdr,uint32_t *bitmap,uint32_t *nlink)
@@ -3012,13 +3134,18 @@ static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_tif (unlikely (bitmap[1 ] & (FATTR4_WORD1_NUMLINKS -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_NUMLINKS )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; *nlink =be32_to_cpup (p++); bitmap[1 ] &= ~FATTR4_WORD1_NUMLINKS ; ret =NFS_ATTR_FATTR_NLINK ; }dprintk ("%s: nlink=%u\n" , __func__, (unsigned int )*nlink);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_owner (struct xdr_stream *xdr,uint32_t *bitmap,struct nfs_client *clp,uint32_t *uid)
@@ -3031,9 +3158,13 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nfif (unlikely (bitmap[1 ] & (FATTR4_WORD1_OWNER -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_OWNER )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; len =be32_to_cpup (p++); -READ_BUF (len); + p =xdr_inline_decode (xdr, len); +if (unlikely (!p)) + goto out_overflow;if (len <XDR_MAX_NETOBJ ) {if (nfs_map_name_to_uid (clp, (char *)p, len, uid) ==0 ) ret =NFS_ATTR_FATTR_OWNER ;
@@ -3047,6 +3178,9 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nf }dprintk ("%s: uid=%d\n" , __func__, (int )*uid);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_group (struct xdr_stream *xdr,uint32_t *bitmap,struct nfs_client *clp,uint32_t *gid)
@@ -3059,9 +3193,13 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nfif (unlikely (bitmap[1 ] & (FATTR4_WORD1_OWNER_GROUP -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_OWNER_GROUP )) { -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; len =be32_to_cpup (p++); -READ_BUF (len); + p =xdr_inline_decode (xdr, len); +if (unlikely (!p)) + goto out_overflow;if (len <XDR_MAX_NETOBJ ) {if (nfs_map_group_to_gid (clp, (char *)p, len, gid) ==0 ) ret =NFS_ATTR_FATTR_GROUP ;
@@ -3075,6 +3213,9 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nf }dprintk ("%s: gid=%d\n" , __func__, (int )*gid);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_rdev (struct xdr_stream *xdr,uint32_t *bitmap,dev_t *rdev)
@@ -3089,7 +3230,9 @@ static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rdeif (likely (bitmap[1 ] &FATTR4_WORD1_RAWDEV )) {dev_t tmp; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; major =be32_to_cpup (p++); minor =be32_to_cpup (p++); tmp =MKDEV (major, minor);
@@ -3100,6 +3243,9 @@ static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rde }dprintk ("%s: rdev=(0x%x:0x%x)\n" , __func__, major, minor);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_space_avail (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *res)
@@ -3111,12 +3257,17 @@ static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uinif (unlikely (bitmap[1 ] & (FATTR4_WORD1_SPACE_AVAIL -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_AVAIL )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_AVAIL ; }dprintk ("%s: space avail=%Lu\n" , __func__, (unsigned long long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_space_free (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *res)
@@ -3128,12 +3279,17 @@ static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uintif (unlikely (bitmap[1 ] & (FATTR4_WORD1_SPACE_FREE -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_FREE )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_FREE ; }dprintk ("%s: space free=%Lu\n" , __func__, (unsigned long long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_space_total (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *res)
@@ -3145,12 +3301,17 @@ static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uinif (unlikely (bitmap[1 ] & (FATTR4_WORD1_SPACE_TOTAL -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_TOTAL )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_TOTAL ; }dprintk ("%s: space total=%Lu\n" , __func__, (unsigned long long )*res);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_space_used (struct xdr_stream *xdr,uint32_t *bitmap,uint64_t *used)
@@ -3162,7 +3323,9 @@ static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uintif (unlikely (bitmap[1 ] & (FATTR4_WORD1_SPACE_USED -1U )))return -EIO ;if (likely (bitmap[1 ] &FATTR4_WORD1_SPACE_USED )) { -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, used); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_USED ; ret =NFS_ATTR_FATTR_SPACE_USED ;
@@ -3170,6 +3333,9 @@ static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uintdprintk ("%s: space used=%Lu\n" , __func__, (unsigned long long )*used);return ret; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_time (struct xdr_stream *xdr,struct timespec *time)
@@ -3178,12 +3344,17 @@ static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time)uint64_t sec;uint32_t nsec; -READ_BUF (12 ); + p =xdr_inline_decode (xdr,12 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, &sec); nsec =be32_to_cpup (p++); time->tv_sec = (time_t )sec; time->tv_nsec = (long )nsec;return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_attr_time_access (struct xdr_stream *xdr,uint32_t *bitmap,struct timespec *time)
@@ -3261,11 +3432,16 @@ static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *c {__be32 *p; -READ_BUF (20 ); + p =xdr_inline_decode (xdr,20 ); +if (unlikely (!p)) + goto out_overflow; cinfo->atomic =be32_to_cpup (p++); p =xdr_decode_hyper (p, &cinfo->before); p =xdr_decode_hyper (p, &cinfo->after);return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_access (struct xdr_stream *xdr,struct nfs4_accessres *access)
@@ -3277,12 +3453,17 @@ static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access) status =decode_op_hdr (xdr,OP_ACCESS );if (status)return status; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; supp =be32_to_cpup (p++); acc =be32_to_cpup (p++); access->supported = supp; access->access = acc;return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_opaque_fixed (struct xdr_stream *xdr,void *buf,size_t len)
@@ -3341,10 +3522,16 @@ static int decode_create(struct xdr_stream *xdr, struct nfs4_change_info *cinfo)return status;if ((status =decode_change_info (xdr, cinfo)))return status; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; bmlen =be32_to_cpup (p++); -READ_BUF (bmlen <<2 ); -return 0 ; + p =xdr_inline_decode (xdr, bmlen <<2 ); +if (likely (p)) +return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_server_caps (struct xdr_stream *xdr,struct nfs4_server_caps_res *res)
@@ -3596,14 +3783,21 @@ static int decode_getfh(struct xdr_stream *xdr, struct nfs_fh *fh)if (status)return status; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; len =be32_to_cpup (p++);if (len >NFS4_FHSIZE )return -EIO ; fh->size = len; -READ_BUF (len); + p =xdr_inline_decode (xdr, len); +if (unlikely (!p)) + goto out_overflow;memcpy (fh->data, p, len);return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_link (struct xdr_stream *xdr,struct nfs4_change_info *cinfo)
@@ -3625,7 +3819,9 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl)__be32 *p;uint32_t namelen, type; -READ_BUF (32 ); + p =xdr_inline_decode (xdr,32 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, &offset); p =xdr_decode_hyper (p, &length); type =be32_to_cpup (p++);
@@ -3641,8 +3837,12 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl) } p =xdr_decode_hyper (p, &clientid); namelen =be32_to_cpup (p++); -READ_BUF (namelen); -return -NFS4ERR_DENIED ; + p =xdr_inline_decode (xdr, namelen); +if (likely (p)) +return -NFS4ERR_DENIED ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_lock (struct xdr_stream *xdr,struct nfs_lock_res *res)
@@ -3697,7 +3897,9 @@ static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize)__be32 *p;uint32_t limit_type, nblocks, blocksize; -READ_BUF (12 ); + p =xdr_inline_decode (xdr,12 ); +if (unlikely (!p)) + goto out_overflow; limit_type =be32_to_cpup (p++);switch (limit_type) {case 1 :
@@ -3709,6 +3911,9 @@ static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize) *maxsize = (uint64_t )nblocks * (uint64_t )blocksize; }return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_delegation (struct xdr_stream *xdr,struct nfs_openres *res)
@@ -3717,7 +3922,9 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res)uint32_t delegation_type;int status; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; delegation_type =be32_to_cpup (p++);if (delegation_type ==NFS4_OPEN_DELEGATE_NONE ) { res->delegation_type =0 ;
@@ -3726,7 +3933,9 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) status =decode_stateid (xdr, &res->delegation);if (unlikely (status))return status; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; res->do_recall =be32_to_cpup (p++);switch (delegation_type) {
@@ -3739,6 +3948,9 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res)return -EIO ; }return decode_ace (xdr,NULL , res->server->nfs_client); +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_open (struct xdr_stream *xdr,struct nfs_openres *res)
@@ -3757,13 +3969,17 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)decode_change_info (xdr, &res->cinfo); -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; res->rflags =be32_to_cpup (p++); bmlen =be32_to_cpup (p++);if (bmlen >10 ) goto xdr_error; -READ_BUF (bmlen <<2 ); + p =xdr_inline_decode (xdr, bmlen <<2 ); +if (unlikely (!p)) + goto out_overflow; savewords =min_t (uint32_t, bmlen,NFS4_BITMAP_SIZE );for (i =0 ; i < savewords; ++i) res->attrset[i] =be32_to_cpup (p++);
@@ -3774,6 +3990,9 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res) xdr_error:dprintk ("%s: Bitmap too large! Length = %u\n" , __func__, bmlen);return -EIO ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_open_confirm (struct xdr_stream *xdr,struct nfs_open_confirmres *res)
@@ -3820,7 +4039,9 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_ status =decode_op_hdr (xdr,OP_READ );if (status)return status; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; eof =be32_to_cpup (p++); count =be32_to_cpup (p++); hdrlen = (u8 *) p - (u8 *) iov->iov_base;
@@ -3835,6 +4056,9 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_ res->eof = eof; res->count = count;return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_readdir (struct xdr_stream *xdr,struct rpc_rqst *req,struct nfs4_readdir_res *readdir)
@@ -3947,7 +4171,9 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)return status;/* Convert length of symlink */ -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; len =be32_to_cpup (p++);if (len >= rcvbuf->page_len || len <=0 ) {dprintk ("nfs: server returned giant symlink!\n" );
@@ -3972,6 +4198,9 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req) kaddr[len+rcvbuf->page_base] ='\0' ;kunmap_atomic (kaddr,KM_USER0 );return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_remove (struct xdr_stream *xdr,struct nfs4_change_info *cinfo)
@@ -4069,10 +4298,16 @@ static int decode_setattr(struct xdr_stream *xdr) status =decode_op_hdr (xdr,OP_SETATTR );if (status)return status; -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; bmlen =be32_to_cpup (p++); -READ_BUF (bmlen <<2 ); -return 0 ; + p =xdr_inline_decode (xdr, bmlen <<2 ); +if (likely (p)) +return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_setclientid (struct xdr_stream *xdr,struct nfs_client *clp)
@@ -4081,7 +4316,9 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp)uint32_t opnum;int32_t nfserr; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; opnum =be32_to_cpup (p++);if (opnum !=OP_SETCLIENTID ) { dprintk("nfs: decode_setclientid: Server returned operation"
@@ -4090,26 +4327,39 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp) } nfserr =be32_to_cpup (p++);if (nfserr ==NFS_OK ) { -READ_BUF (8 +NFS4_VERIFIER_SIZE ); + p =xdr_inline_decode (xdr,8 +NFS4_VERIFIER_SIZE ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, &clp->cl_clientid);memcpy (clp->cl_confirm.data, p,NFS4_VERIFIER_SIZE ); }else if (nfserr ==NFSERR_CLID_INUSE ) {uint32_t len;/* skip netid string */ -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; len =be32_to_cpup (p++); -READ_BUF (len); + p =xdr_inline_decode (xdr, len); +if (unlikely (!p)) + goto out_overflow;/* skip uaddr string */ -READ_BUF (4 ); + p =xdr_inline_decode (xdr,4 ); +if (unlikely (!p)) + goto out_overflow; len =be32_to_cpup (p++); -READ_BUF (len); + p =xdr_inline_decode (xdr, len); +if (unlikely (!p)) + goto out_overflow;return -NFSERR_CLID_INUSE ; }else return nfs4_stat_to_errno (nfserr);return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_setclientid_confirm (struct xdr_stream *xdr)
@@ -4126,11 +4376,16 @@ static int decode_write(struct xdr_stream *xdr, struct nfs_writeres *res)if (status)return status; -READ_BUF (16 ); + p =xdr_inline_decode (xdr,16 ); +if (unlikely (!p)) + goto out_overflow; res->count =be32_to_cpup (p++); res->verf->committed =be32_to_cpup (p++);memcpy (res->verf->verifier, p,8 );return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_delegreturn (struct xdr_stream *xdr)
@@ -4152,9 +4407,13 @@ static int decode_exchange_id(struct xdr_stream *xdr,if (status)return status; -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; p =xdr_decode_hyper (p, &clp->cl_ex_clid); -READ_BUF (12 ); + p =xdr_inline_decode (xdr,12 ); +if (unlikely (!p)) + goto out_overflow; clp->cl_seqid =be32_to_cpup (p++); clp->cl_exchange_flags =be32_to_cpup (p++);
@@ -4164,7 +4423,9 @@ static int decode_exchange_id(struct xdr_stream *xdr,return -EIO ;/* Throw away minor_id */ -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow;/* Throw away Major id */ status =decode_opaque_inline (xdr, &dummy, &dummy_str);
@@ -4182,6 +4443,9 @@ static int decode_exchange_id(struct xdr_stream *xdr,return status;return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; } static int decode_chan_attrs(struct xdr_stream *xdr,
@@ -4190,7 +4454,9 @@ static int decode_chan_attrs(struct xdr_stream *xdr,__be32 *p;u32 nr_attrs; -READ_BUF (28 ); + p =xdr_inline_decode (xdr,28 ); +if (unlikely (!p)) + goto out_overflow; attrs->headerpadsz =be32_to_cpup (p++); attrs->max_rqst_sz =be32_to_cpup (p++); attrs->max_resp_sz =be32_to_cpup (p++);
@@ -4203,9 +4469,15 @@ static int decode_chan_attrs(struct xdr_stream *xdr, __func__, nr_attrs);return -EINVAL ; } -if (nr_attrs ==1 ) -READ_BUF (4 );/* skip rdma_attrs */ +if (nr_attrs ==1 ) { + p =xdr_inline_decode (xdr,4 );/* skip rdma_attrs */ +if (unlikely (!p)) + goto out_overflow; + }return 0 ; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_sessionid (struct xdr_stream *xdr,struct nfs4_sessionid *sid)
@@ -4228,7 +4500,9 @@ static int decode_create_session(struct xdr_stream *xdr,return status;/* seqid, flags */ -READ_BUF (8 ); + p =xdr_inline_decode (xdr,8 ); +if (unlikely (!p)) + goto out_overflow; clp->cl_seqid =be32_to_cpup (p++); session->flags =be32_to_cpup (p++);
@@ -4237,6 +4511,9 @@ static int decode_create_session(struct xdr_stream *xdr,if (!status) status =decode_chan_attrs (xdr, &session->bc_attrs);return status; +out_overflow: +print_overflow_msg (__func__, xdr); +return -EIO ; }static int decode_destroy_session (struct xdr_stream *xdr,void *dummy)
@@ -4277,7 +4554,9 @@ static int decode_sequence(struct xdr_stream *xdr, goto out_err; } -READ_BUF (20 ); + p =xdr_inline_decode (xdr,20 ); +if (unlikely (!p)) + goto out_overflow;/* seqid */ slot = &res->sr_session->fc_slot_table.slots[res->sr_slotid];
@@ -4302,6 +4581,10 @@ static int decode_sequence(struct xdr_stream *xdr, out_err: res->sr_status = status;return status; +out_overflow: +print_overflow_msg (__func__, xdr); + status = -EIO ; + goto out_err;#else /* CONFIG_NFS_V4_1 */ return 0 ;#endif /* CONFIG_NFS_V4_1 */
Signature · 1 line
1.6.4
RFC PATCH v2 21/21 nfs: nfs4xdr: optimize low level decoding
In reply to Benny Halevydo not increment decoding ptr if not needed.
--- fs/nfs/nfs4xdr.c | 118 +++++++++++++++++++++++++++--------------------------- 1 files changed, 59 insertions(+), 59 deletions(-)
fs/nfs/nfs4xdr.c +59 -59
@@ -2437,7 +2437,7 @@ static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *len =be32_to_cpup (p++); + *len =be32_to_cpup (p); p =xdr_inline_decode (xdr, *len);if (unlikely (!p)) goto out_overflow;
@@ -2456,14 +2456,14 @@ static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr)if (unlikely (!p)) goto out_overflow; hdr->status =be32_to_cpup (p++); - hdr->taglen =be32_to_cpup (p++); + hdr->taglen =be32_to_cpup (p); p =xdr_inline_decode (xdr, hdr->taglen +4 );if (unlikely (!p)) goto out_overflow; hdr->tag = (char *)p; p +=XDR_QUADLEN (hdr->taglen); - hdr->nops =be32_to_cpup (p++); + hdr->nops =be32_to_cpup (p);if (unlikely (hdr->nops <1 ))return nfs4_stat_to_errno (hdr->status);return 0 ;
@@ -2488,7 +2488,7 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected) opnum, expected);return -EIO ; } - nfserr =be32_to_cpup (p++); + nfserr =be32_to_cpup (p);if (nfserr !=NFS_OK )return nfs4_stat_to_errno (nfserr);return 0 ;
@@ -2519,7 +2519,7 @@ static int decode_attr_bitmap(struct xdr_stream *xdr, uint32_t *bitmap) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - bmlen =be32_to_cpup (p++); + bmlen =be32_to_cpup (p); bitmap[0 ] = bitmap[1 ] =0 ; p =xdr_inline_decode (xdr, (bmlen <<2 ));
@@ -2528,7 +2528,7 @@ static int decode_attr_bitmap(struct xdr_stream *xdr, uint32_t *bitmap)if (bmlen >0 ) { bitmap[0 ] =be32_to_cpup (p++);if (bmlen >1 ) - bitmap[1 ] =be32_to_cpup (p++); + bitmap[1 ] =be32_to_cpup (p); }return 0 ; out_overflow:
@@ -2543,7 +2543,7 @@ static inline int decode_attr_length(struct xdr_stream *xdr, uint32_t *attrlen, p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *attrlen =be32_to_cpup (p++); + *attrlen =be32_to_cpup (p); *savep = xdr->p;return 0 ; out_overflow:
@@ -2574,7 +2574,7 @@ static int decode_attr_type(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t * p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *type =be32_to_cpup (p++); + *type =be32_to_cpup (p);if (*type <NF4REG || *type >NF4NAMEDATTR ) {dprintk ("%s: bad type %d\n" , __func__, *type);return -EIO ;
@@ -2601,7 +2601,7 @@ static int decode_attr_change(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, change); +xdr_decode_hyper (p, change); bitmap[0 ] &= ~FATTR4_WORD0_CHANGE ; ret =NFS_ATTR_FATTR_CHANGE ; }
@@ -2625,7 +2625,7 @@ static int decode_attr_size(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t * p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, size); +xdr_decode_hyper (p, size); bitmap[0 ] &= ~FATTR4_WORD0_SIZE ; ret =NFS_ATTR_FATTR_SIZE ; }
@@ -2647,7 +2647,7 @@ static int decode_attr_link_support(struct xdr_stream *xdr, uint32_t *bitmap, ui p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *res =be32_to_cpup (p++); + *res =be32_to_cpup (p); bitmap[0 ] &= ~FATTR4_WORD0_LINK_SUPPORT ; }dprintk ("%s: link support=%s\n" , __func__, *res ==0 ?"false" :"true" );
@@ -2668,7 +2668,7 @@ static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap, p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *res =be32_to_cpup (p++); + *res =be32_to_cpup (p); bitmap[0 ] &= ~FATTR4_WORD0_SYMLINK_SUPPORT ; }dprintk ("%s: symlink support=%s\n" , __func__, *res ==0 ?"false" :"true" );
@@ -2692,7 +2692,7 @@ static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfsif (unlikely (!p)) goto out_overflow; p =xdr_decode_hyper (p, &fsid->major); - p =xdr_decode_hyper (p, &fsid->minor); +xdr_decode_hyper (p, &fsid->minor); bitmap[0 ] &= ~FATTR4_WORD0_FSID ; ret =NFS_ATTR_FATTR_FSID ; }
@@ -2716,7 +2716,7 @@ static int decode_attr_lease_time(struct xdr_stream *xdr, uint32_t *bitmap, uint p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *res =be32_to_cpup (p++); + *res =be32_to_cpup (p); bitmap[0 ] &= ~FATTR4_WORD0_LEASE_TIME ; }dprintk ("%s: file size=%u\n" , __func__, (unsigned int )*res);
@@ -2737,7 +2737,7 @@ static int decode_attr_aclsupport(struct xdr_stream *xdr, uint32_t *bitmap, uint p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *res =be32_to_cpup (p++); + *res =be32_to_cpup (p); bitmap[0 ] &= ~FATTR4_WORD0_ACLSUPPORT ; }dprintk ("%s: ACLs supported=%u\n" , __func__, (unsigned int )*res);
@@ -2759,7 +2759,7 @@ static int decode_attr_fileid(struct xdr_stream *xdr, uint32_t *bitmap, uint64_t p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, fileid); +xdr_decode_hyper (p, fileid); bitmap[0 ] &= ~FATTR4_WORD0_FILEID ; ret =NFS_ATTR_FATTR_FILEID ; }
@@ -2782,7 +2782,7 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitma p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, fileid); +xdr_decode_hyper (p, fileid); bitmap[1 ] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID ; ret =NFS_ATTR_FATTR_FILEID ; }
@@ -2805,7 +2805,7 @@ static int decode_attr_files_avail(struct xdr_stream *xdr, uint32_t *bitmap, uin p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, res); +xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_AVAIL ; }dprintk ("%s: files avail=%Lu\n" , __func__, (unsigned long long )*res);
@@ -2827,7 +2827,7 @@ static int decode_attr_files_free(struct xdr_stream *xdr, uint32_t *bitmap, uint p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, res); +xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_FREE ; }dprintk ("%s: files free=%Lu\n" , __func__, (unsigned long long )*res);
@@ -2849,7 +2849,7 @@ static int decode_attr_files_total(struct xdr_stream *xdr, uint32_t *bitmap, uin p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, res); +xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_FILES_TOTAL ; }dprintk ("%s: files total=%Lu\n" , __func__, (unsigned long long )*res);
@@ -2868,7 +2868,7 @@ static int decode_pathname(struct xdr_stream *xdr, struct nfs4_pathname *path) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - n =be32_to_cpup (p++); + n =be32_to_cpup (p);if (n ==0 ) goto root_path;dprintk ("path " );
@@ -2925,7 +2925,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - n =be32_to_cpup (p++); + n =be32_to_cpup (p);if (n <=0 ) goto out_eio; res->nlocations =0 ;
@@ -2936,7 +2936,7 @@ static int decode_attr_fs_locations(struct xdr_stream *xdr, uint32_t *bitmap, st p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - m =be32_to_cpup (p++); + m =be32_to_cpup (p); loc->nservers =0 ;dprintk ("%s: servers " , __func__);
@@ -2994,7 +2994,7 @@ static int decode_attr_maxfilesize(struct xdr_stream *xdr, uint32_t *bitmap, uin p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, res); +xdr_decode_hyper (p, res); bitmap[0 ] &= ~FATTR4_WORD0_MAXFILESIZE ; }dprintk ("%s: maxfilesize=%Lu\n" , __func__, (unsigned long long )*res);
@@ -3016,7 +3016,7 @@ static int decode_attr_maxlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_ p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *maxlink =be32_to_cpup (p++); + *maxlink =be32_to_cpup (p); bitmap[0 ] &= ~FATTR4_WORD0_MAXLINK ; }dprintk ("%s: maxlink=%u\n" , __func__, *maxlink);
@@ -3038,7 +3038,7 @@ static int decode_attr_maxname(struct xdr_stream *xdr, uint32_t *bitmap, uint32_ p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *maxname =be32_to_cpup (p++); + *maxname =be32_to_cpup (p); bitmap[0 ] &= ~FATTR4_WORD0_MAXNAME ; }dprintk ("%s: maxname=%u\n" , __func__, *maxname);
@@ -3061,7 +3061,7 @@ static int decode_attr_maxread(struct xdr_stream *xdr, uint32_t *bitmap, uint32_ p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, &maxread); +xdr_decode_hyper (p, &maxread);if (maxread >0x7FFFFFFF ) maxread =0x7FFFFFFF ; *res = (uint32_t )maxread;
@@ -3087,7 +3087,7 @@ static int decode_attr_maxwrite(struct xdr_stream *xdr, uint32_t *bitmap, uint32 p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, &maxwrite); +xdr_decode_hyper (p, &maxwrite);if (maxwrite >0x7FFFFFFF ) maxwrite =0x7FFFFFFF ; *res = (uint32_t )maxwrite;
@@ -3113,7 +3113,7 @@ static int decode_attr_mode(struct xdr_stream *xdr, uint32_t *bitmap, umode_t *m p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - tmp =be32_to_cpup (p++); + tmp =be32_to_cpup (p); *mode = tmp & ~S_IFMT ; bitmap[1 ] &= ~FATTR4_WORD1_MODE ; ret =NFS_ATTR_FATTR_MODE ;
@@ -3137,7 +3137,7 @@ static int decode_attr_nlink(struct xdr_stream *xdr, uint32_t *bitmap, uint32_t p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - *nlink =be32_to_cpup (p++); + *nlink =be32_to_cpup (p); bitmap[1 ] &= ~FATTR4_WORD1_NUMLINKS ; ret =NFS_ATTR_FATTR_NLINK ; }
@@ -3161,7 +3161,7 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nf p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - len =be32_to_cpup (p++); + len =be32_to_cpup (p); p =xdr_inline_decode (xdr, len);if (unlikely (!p)) goto out_overflow;
@@ -3196,7 +3196,7 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nf p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - len =be32_to_cpup (p++); + len =be32_to_cpup (p); p =xdr_inline_decode (xdr, len);if (unlikely (!p)) goto out_overflow;
@@ -3234,7 +3234,7 @@ static int decode_attr_rdev(struct xdr_stream *xdr, uint32_t *bitmap, dev_t *rdeif (unlikely (!p)) goto out_overflow; major =be32_to_cpup (p++); - minor =be32_to_cpup (p++); + minor =be32_to_cpup (p); tmp =MKDEV (major, minor);if (MAJOR (tmp) == major &&MINOR (tmp) == minor) *rdev = tmp;
@@ -3260,7 +3260,7 @@ static int decode_attr_space_avail(struct xdr_stream *xdr, uint32_t *bitmap, uin p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, res); +xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_AVAIL ; }dprintk ("%s: space avail=%Lu\n" , __func__, (unsigned long long )*res);
@@ -3282,7 +3282,7 @@ static int decode_attr_space_free(struct xdr_stream *xdr, uint32_t *bitmap, uint p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, res); +xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_FREE ; }dprintk ("%s: space free=%Lu\n" , __func__, (unsigned long long )*res);
@@ -3304,7 +3304,7 @@ static int decode_attr_space_total(struct xdr_stream *xdr, uint32_t *bitmap, uin p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, res); +xdr_decode_hyper (p, res); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_TOTAL ; }dprintk ("%s: space total=%Lu\n" , __func__, (unsigned long long )*res);
@@ -3326,7 +3326,7 @@ static int decode_attr_space_used(struct xdr_stream *xdr, uint32_t *bitmap, uint p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, used); +xdr_decode_hyper (p, used); bitmap[1 ] &= ~FATTR4_WORD1_SPACE_USED ; ret =NFS_ATTR_FATTR_SPACE_USED ; }
@@ -3348,7 +3348,7 @@ static int decode_attr_time(struct xdr_stream *xdr, struct timespec *time)if (unlikely (!p)) goto out_overflow; p =xdr_decode_hyper (p, &sec); - nsec =be32_to_cpup (p++); + nsec =be32_to_cpup (p); time->tv_sec = (time_t )sec; time->tv_nsec = (long )nsec;return 0 ;
@@ -3437,7 +3437,7 @@ static int decode_change_info(struct xdr_stream *xdr, struct nfs4_change_info *c goto out_overflow; cinfo->atomic =be32_to_cpup (p++); p =xdr_decode_hyper (p, &cinfo->before); - p =xdr_decode_hyper (p, &cinfo->after); +xdr_decode_hyper (p, &cinfo->after);return 0 ; out_overflow:print_overflow_msg (__func__, xdr);
@@ -3457,7 +3457,7 @@ static int decode_access(struct xdr_stream *xdr, struct nfs4_accessres *access)if (unlikely (!p)) goto out_overflow; supp =be32_to_cpup (p++); - acc =be32_to_cpup (p++); + acc =be32_to_cpup (p); access->supported = supp; access->access = acc;return 0 ;
@@ -3525,7 +3525,7 @@ static int decode_create(struct xdr_stream *xdr, struct nfs4_change_info *cinfo) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - bmlen =be32_to_cpup (p++); + bmlen =be32_to_cpup (p); p =xdr_inline_decode (xdr, bmlen <<2 );if (likely (p))return 0 ;
@@ -3786,7 +3786,7 @@ static int decode_getfh(struct xdr_stream *xdr, struct nfs_fh *fh) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - len =be32_to_cpup (p++); + len =be32_to_cpup (p);if (len >NFS4_FHSIZE )return -EIO ; fh->size = len;
@@ -3836,7 +3836,7 @@ static int decode_lock_denied (struct xdr_stream *xdr, struct file_lock *fl) fl->fl_pid =0 ; } p =xdr_decode_hyper (p, &clientid); - namelen =be32_to_cpup (p++); + namelen =be32_to_cpup (p); p =xdr_inline_decode (xdr, namelen);if (likely (p))return -NFS4ERR_DENIED ;
@@ -3903,11 +3903,11 @@ static int decode_space_limit(struct xdr_stream *xdr, u64 *maxsize) limit_type =be32_to_cpup (p++);switch (limit_type) {case 1 : - p =xdr_decode_hyper (p, maxsize); +xdr_decode_hyper (p, maxsize);break ;case 2 : nblocks =be32_to_cpup (p++); - blocksize =be32_to_cpup (p++); + blocksize =be32_to_cpup (p); *maxsize = (uint64_t )nblocks * (uint64_t )blocksize; }return 0 ;
@@ -3925,7 +3925,7 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - delegation_type =be32_to_cpup (p++); + delegation_type =be32_to_cpup (p);if (delegation_type ==NFS4_OPEN_DELEGATE_NONE ) { res->delegation_type =0 ;return 0 ;
@@ -3936,7 +3936,7 @@ static int decode_delegation(struct xdr_stream *xdr, struct nfs_openres *res) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - res->do_recall =be32_to_cpup (p++); + res->do_recall =be32_to_cpup (p);switch (delegation_type) {case NFS4_OPEN_DELEGATE_READ :
@@ -3973,7 +3973,7 @@ static int decode_open(struct xdr_stream *xdr, struct nfs_openres *res)if (unlikely (!p)) goto out_overflow; res->rflags =be32_to_cpup (p++); - bmlen =be32_to_cpup (p++); + bmlen =be32_to_cpup (p);if (bmlen >10 ) goto xdr_error;
@@ -4043,7 +4043,7 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_if (unlikely (!p)) goto out_overflow; eof =be32_to_cpup (p++); - count =be32_to_cpup (p++); + count =be32_to_cpup (p); hdrlen = (u8 *) p - (u8 *) iov->iov_base; recvd = req->rq_rcv_buf.len - hdrlen;if (count > recvd) {
@@ -4174,7 +4174,7 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - len =be32_to_cpup (p++); + len =be32_to_cpup (p);if (len >= rcvbuf->page_len || len <=0 ) {dprintk ("nfs: server returned giant symlink!\n" );return -ENAMETOOLONG ;
@@ -4301,7 +4301,7 @@ static int decode_setattr(struct xdr_stream *xdr) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - bmlen =be32_to_cpup (p++); + bmlen =be32_to_cpup (p); p =xdr_inline_decode (xdr, bmlen <<2 );if (likely (p))return 0 ;
@@ -4325,7 +4325,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp) " %d\n", opnum);return -EIO ; } - nfserr =be32_to_cpup (p++); + nfserr =be32_to_cpup (p);if (nfserr ==NFS_OK ) { p =xdr_inline_decode (xdr,8 +NFS4_VERIFIER_SIZE );if (unlikely (!p))
@@ -4339,7 +4339,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - len =be32_to_cpup (p++); + len =be32_to_cpup (p); p =xdr_inline_decode (xdr, len);if (unlikely (!p)) goto out_overflow;
@@ -4348,7 +4348,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp) p =xdr_inline_decode (xdr,4 );if (unlikely (!p)) goto out_overflow; - len =be32_to_cpup (p++); + len =be32_to_cpup (p); p =xdr_inline_decode (xdr, len);if (unlikely (!p)) goto out_overflow;
@@ -4410,7 +4410,7 @@ static int decode_exchange_id(struct xdr_stream *xdr, p =xdr_inline_decode (xdr,8 );if (unlikely (!p)) goto out_overflow; - p =xdr_decode_hyper (p, &clp->cl_ex_clid); +xdr_decode_hyper (p, &clp->cl_ex_clid); p =xdr_inline_decode (xdr,12 );if (unlikely (!p)) goto out_overflow;
@@ -4418,7 +4418,7 @@ static int decode_exchange_id(struct xdr_stream *xdr, clp->cl_exchange_flags =be32_to_cpup (p++);/* We ask for SP4_NONE */ - dummy =be32_to_cpup (p++); + dummy =be32_to_cpup (p);if (dummy !=SP4_NONE )return -EIO ;
@@ -4463,7 +4463,7 @@ static int decode_chan_attrs(struct xdr_stream *xdr, attrs->max_resp_sz_cached =be32_to_cpup (p++); attrs->max_ops =be32_to_cpup (p++); attrs->max_reqs =be32_to_cpup (p++); - nr_attrs =be32_to_cpup (p++); + nr_attrs =be32_to_cpup (p);if (unlikely (nr_attrs >1 )) {printk (KERN_WARNING "%s: Invalid rdma channel attrs count %u\n" , __func__, nr_attrs);
@@ -4504,7 +4504,7 @@ static int decode_create_session(struct xdr_stream *xdr,if (unlikely (!p)) goto out_overflow; clp->cl_seqid =be32_to_cpup (p++); - session->flags =be32_to_cpup (p++); + session->flags =be32_to_cpup (p);/* Channel attributes */ status =decode_chan_attrs (xdr, &session->fc_attrs);
@@ -4576,7 +4576,7 @@ static int decode_sequence(struct xdr_stream *xdr,/* target highest slot id - currently not processed */ dummy =be32_to_cpup (p++);/* result flags - currently not processed */ - dummy =be32_to_cpup (p++); + dummy =be32_to_cpup (p); status =0 ; out_err: res->sr_status = status;
Signature · 1 line
1.6.4
Quoted 41 lines · Benny Halevy
Trond, thanks for your comments.
I believe I've fixed them all.Changes from v1:
- dropped xdr_{en,de}code_int, open code
cpu_to_be32andbe32_to_cpupinstead.
- added helpers for decoding stateid, verifier, and sessionid using a common helper for decoding fixed size opaque arrays.
- COPYMEM calls all converted to memcpy (no need for returning ptr)
-READ_BUFopen coded, callers useprint_overflow_msgas you suggested.- minor cleanup in
encode_compound_hdr
- optimized nfs41reserve_spaceusage
- optimized low level encoding
- simplifieddecode_exchange_idby reusingdecode_opaque_inline
- optimized low level decodingIn this patchset:
[PATCH RFC v2 01/21] sunrpc: hton -> cpu_to_be*
[PATCH RFC v2 02/21] sunrpc: ntoh -> be*_to_cpu
[PATCH RFC v2 03/21] nfs: nfs4xdr: get rid of WRITE32
[PATCH RFC v2 04/21] nfs: nfs4xdr: get rid of WRITE64
[PATCH RFC v2 05/21] nfs: nfs4xdr: get rid of WRITEMEM
[PATCH RFC v2 06/21] nfs: nfs4xdr: optimizeRESERVE_SPACEinencode_create_sessionandencode_sequence[PATCH RFC v2 07/21] nfs: nfs4xdr:encode_compound_hdrdoes not have to round up reserved bytes [PATCH RFC v2 08/21] nfs: nfs4xdr: changeRESERVE_SPACEmacro into a static helper [PATCH RFC v2 09/21] nfs: nfs4xdr: optimize low level encoding
[PATCH RFC v2 10/21] nfs: nfs4xdr: merge xdr_encode_int+xdr_encode_opaque_fixed intoxdr_encode_opaque[PATCH RFC v2 11/21] nfs: nfs4xdr: get rid of READ32
[PATCH RFC v2 12/21] nfs: nfs4xdr: get rid of READ64
[PATCH RFC v2 13/21] nfs: nfs4xdr: get rid of READTIME
[PATCH RFC v2 14/21] nfs: nfs4xdr: introduceprint_overflow_msg
[PATCH RFC v2 15/21] nfs: nfs4xdr: introducedecode_opaque_fixedanddecode_stateidhelpers [PATCH RFC v2 16/21] nfs: nfs4xdr: introducedecode_verifierhelper
[PATCH RFC v2 17/21] nfs: nfs4xdr: introducedecode_sessionidhelper
[PATCH RFC v2 18/21] nfs: nfs4xdr: get rid of COPYMEM
[PATCH RFC v2 19/21] nfs: nfs4xdr: simplifydecode_exchange_idby reusingdecode_opaque_inline[PATCH RFC v2 20/21] nfs: nfs4xdr: get rid ofREAD_BUF
[PATCH RFC v2 21/21] nfs: nfs4xdr: optimize low level decoding
Quoted 1 line
Benny
I'm very sorry that Benny has done all this work. I understand that it was a mess and something should have been done. And I hope the final goal is to unify xdr stuff between server and client, but ...
I hate what is done here!
As an imperfect human person, that coded these things and had bugs and was chasing them for hours. These patches make my life much much harder. Not easier, sorry.
The READXX/WRITEXX macros was a romantic attempt at unification between server and client and at "capitalizing" the actual encoding/decoding operations out of surrounding code, in an attempt to hide a way all details. So a bug maker like me could attempt a visual side by side comparison or counting of encode/decode operations, and fine the cure.
* So I hate it that the READ32/WRITE32 is open coded. Now it looks like nothing, it should have an xdr_encode/decode naming convention, all details hidden, consistent calling convention with the reset of the code.
* I hate it that I have to count (p)"++" now to look for actual code advancements.
* I hate that it is called encode_hyper that a dum like me needs to look it up in the dictionary "32" and "64" will do
* I hated it before, but I hate it even more now that the same operation is:
reserved(4); p + 1
I wish it could be all __be32 everywhere
Sometimes macros are good. When they try to make boring code pretty and cute. These macros where evil but could be fixed. Also inline functions can be devised for the same purpose. I do understand all these code theories, hell I wrote them, but the practice of the matter is that these patches take me back not forward. But perhaps it's just me?
Thanks
Boaz
Quoted 3 lines · Boaz Harrosh
* So I hate it that the READ32/WRITE32 is open coded. Now it looks like nothing, it should have an xdr_encode/decode naming convention, all details hidden, consistent calling convention with the reset of the code.
The convention is already established. Please see 15 years worth of NFSv2/v3 xdr code. The NFSv4 code was the exception not the rule.
Now, it is obvious what we're doing: we're writing 32-bit big endian encoded data into a memory buffer. Furthermore, the process of converting from cpu ordered integers into 32-bit big endian is now made obvious, making it easily verifiable both by inspection, and using 'sparse'.
Adding wrappers to do this, is just unnecessarily obfuscating the code.
Quoted 1 line
* I hate it that I have to count (p)"++" now to look for actual code advancements.
How is that _any_ different from counting WRITE32s?
Quoted 2 lines
* I hate that it is called
encode_hyperthat a dum like me needs to look it up in the dictionary "32" and "64" will do
I don't mind changing the name of xdr_encode_hyper() to xdr_encode_uint64 or some such alternative, however the point is that we should have only _one_ function that encodes 64 bit integers. Not one function that everyone else uses, and then a macro that NFSv4 uses.
Quoted 2 lines
* I hated it before, but I hate it even more now that the same operation is:
reserved(4); p + 1
Huh? What operation?
Quoted 1 line
I wish it could be all
__be32everywhere
??? That's up to the protocol. If the protocol uses 32-bit integers, then we can use __be32, but if it specifies a 64-bit big endian integer in some structure, then we need to encode for that.
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1250513254.8475.20.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Quoted 8 lines · Trond Myklebust
Quoted 3 lines · Boaz Harrosh
* So I hate it that the READ32/WRITE32 is open coded. Now it looks like nothing, it should have an xdr_encode/decode naming convention, all details hidden, consistent calling convention with the reset of the code.
The convention is already established. Please see 15 years worth of NFSv2/v3 xdr code. The NFSv4 code was the exception not the rule.
Quoted 7 lines
Now, it is obvious what we're doing: we're writing 32-bit big endian encoded data into a memory buffer. Furthermore, the process of converting from cpu ordered integers into 32-bit big endian is now made obvious, making it easily verifiable both by inspection, and using 'sparse'.
Adding wrappers to do this, is just unnecessarily obfuscating the code.
As I said, *sometimes* "obfuscation" is the point. If it has merits to account for human short concentration span.
Quoted 4 lines
Quoted 1 line
* I hate it that I have to count (p)"++" now to look for actual code advancements.
How is that _any_ different from counting WRITE32s?
The size for one. And mainly the symmetry with the other side of the wire.
WRITEXX for every READXX. What now?
Quoted 8 lines
Quoted 2 lines
* I hate that it is called
encode_hyperthat a dum like me needs to look it up in the dictionary "32" and "64" will doI don't mind changing the name of
xdr_encode_hyper()toxdr_encode_uint64or some such alternative, however the point is that we should have only _one_ function that encodes 64 bit integers. Not one function that everyone else uses, and then a macro that NFSv4 uses.
Quoted 5 lines
Quoted 2 lines
* I hated it before, but I hate it even more now that the same operation is:
reserved(4); p + 1Huh? What operation?
Sorry, I meant the mix use of byte_sizes and word_sizes. For example I'd like reserved(1); p + 1;
and reserved(quad_len(len)); p + quad_len(len);
I see a pattern here. Highly changing code devises these "helpers", that enables reviewing, for catching bugs. Then once stabilized, code is "un-obfuscated" and becomes "write-only". Who cares, no one needs to read-it, it works.
I don't want to raise any flame wars here. I come late and I see what I see.
Probably 2, 3 iterations into this I will become blind to this code as well. I guess current code is fine. How hard can it be, so I spend an hour longer on a missing "++". New NFS versions are written every 10 years.
Only one request though. Please make nfs and nfsd use the same xdr mechanics
Boaz
Quoted 6 lines · Boaz Harrosh
Quoted 2 lines · Trond Myklebust
Adding wrappers to do this, is just unnecessarily obfuscating the code.
As I said, *sometimes* "obfuscation" is the point. If it has merits to account for human short concentration span.
In this case, the change was motivated by a bunch of patches which were doing things like adding dummy READ32 requests immediately prior to a READ_BUF() call. It was therefore abundantly clear that the obfuscation was helping no-one, even though it may have made it easy to churn out bad code quickly.
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
* I hate it that I have to count (p)"++" now to look for actual code advancements.
How is that _any_ different from counting WRITE32s?
The size for one. And mainly the symmetry with the other side of the wire.
WRITEXX for every READXX. What now?
A
*p++ = cpu_to_be32(foo); // WRITE32(foo)
for every
foo = be32_to_cpu(*p++); // READ32(foo)
Quoted 9 lines
Quoted 5 lines
Quoted 2 lines
* I hated it before, but I hate it even more now that the same operation is:
reserved(4); p + 1Huh? What operation?
Sorry, I meant the mix use of
byte_sizesandword_sizes. For example I'd like reserved(1); p + 1;
and reserved(quad_len(len)); p +quad_len(len);
That's probably worth doing. We could split up xdr_inline_decode() into something like the following:
__be32 *xdr_decode_words(struct xdr_stream *xdr, size_t nwords)
{
__be32 *p = xdr->p;
__be32 *q = p + nwords;
if (unlikely(q > xdr->end || q < p))
return NULL;
xdr->p = q;
return p;
}__be32 *xdr_decode_inline(struct xdr_stream *xdr, size_t nbytes)
{
return xdr_decode_words(xdr, XDR_QUADLEN(nbytes));
}The latter would be used for decoding 'opaque' or string objects, whereas the former could be used for decoding 32-bit words.
Quoted 1 line
Only one request though. Please make nfs and nfsd use the same xdr mechanics
Bruce has already stated he wants to remove the macros on the nfsd side.
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1250527692.20012.26.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Quoted 4 lines · Trond Myklebust
Quoted 1 line · Boaz Harrosh
Only one request though. Please make nfs and nfsd use the same xdr mechanics
Bruce has already stated he wants to remove the macros on the nfsd side.
Yes, it all looks fine to me; patches welcome.
--b.
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 2 lines · Boaz Harrosh
OK I used the new stuff by now, and I'm happy with everything but the above. I *absolutely* insist on this changing to:
Feel quite free to insist, but the patch isn't going in.
Quoted 17 lines
p = xdr_encode_word(p, foo); and p = xdr_decode_word(p, &foo);[xdr_{encode,decode}_word is defined differently but is only used in a couple
of sunrpc files, the change of these places shall be added to this cleanup]I have checked this version of the definition:
static inline__be32*
xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p;}
static inline
__be32*
xdr_decode_word(__be32 *p, __u32 *valp)
Quoted 7 lines
{ *valp = be32_to_cpu(*p++); return p;}
under assembly with gcc -O2 and it gives the exact same result as the open code, so I do not see what can be said against it?
It is unnecessary, it looks ugly, the latter form takes 2 pointers and hides an assignment, it does an unconditional pointer increment.
IOW: Just learn the meaning of 'pointer to __be32'.
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1251115007.6325.9.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Quoted 6 lines · Trond Myklebust
Quoted 2 lines · Boaz Harrosh
OK I used the new stuff by now, and I'm happy with everything but the above. I *absolutely* insist on this changing to:
Feel quite free to insist, but the patch isn't going in.
I think your being irrational here. I'm not the first that wants this, it has been brought up again and again on the mailing list. The big majority of nfs/xdr programmers want this. In fact you are the *only one* who's against it.
Quoted 22 lines
Quoted 22 lines
p = xdr_encode_word(p, foo); and p = xdr_decode_word(p, &foo);[xdr_{encode,decode}_word is defined differently but is only used in a couple
of sunrpc files, the change of these places shall be added to this cleanup]I have checked this version of the definition:
static inline__be32*
xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p;}
static inline
__be32*
xdr_decode_word(__be32 *p, __u32 *valp){ *valp = be32_to_cpu(*p++); return p;}
Quoted 4 lines
Quoted 2 lines
under assembly with gcc -O2 and it gives the exact same result as the open code, so I do not see what can be said against it?
It is unnecessary,
Yes it is necessary, for the reader. (And the writer).
it looks ugly,
I think it is not, that's a matter of taste, no? The opposite is true, your option is the ugly one.
Quoted 3 lines
the latter form takes 2 pointers and
hides an assignment, it does an unconditional pointer increment.
So do all the other xdr_{de,en}code_xxx I don't see a choice. Some eggs most be broken when making a cake. It is totally uniform with the reset of the code which is my point. I don't want an alien looking code in the mids of very uniform bunch. And I don't want distracting information, I want the essence stated clearly. I don't write assembly and I don't right computer language, I write English (conforming to computer logic).
Quoted 2 lines
IOW: Just learn the meaning of 'pointer to
__be32'.
What? I lost you, I don't understand what you mean?
Boaz
Quoted 11 lines · Boaz Harrosh
Quoted 6 lines · Trond Myklebust
Quoted 2 lines · Boaz Harrosh
OK I used the new stuff by now, and I'm happy with everything but the above. I *absolutely* insist on this changing to:
Feel quite free to insist, but the patch isn't going in.
I think your being irrational here. I'm not the first that wants this, it has been brought up again and again on the mailing list. The big majority of nfs/xdr programmers want this. In fact you are the *only one* who's against it.
I saw your call for a show of hands, but have yet to see any replies. It is probably a bit early for you to start talking about big majorities...
In any case, I don't apply patches based on popular vote. I apply them based on my conviction that they are useful.
Quoted 45 lines
Quoted 22 lines
Quoted 22 lines
p = xdr_encode_word(p, foo); and p = xdr_decode_word(p, &foo);[xdr_{encode,decode}_word is defined differently but is only used in a couple
of sunrpc files, the change of these places shall be added to this cleanup]I have checked this version of the definition:
static inline__be32*
xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p;}
static inline
__be32*
xdr_decode_word(__be32 *p, __u32 *valp){ *valp = be32_to_cpu(*p++); return p;}
Quoted 4 lines
Quoted 2 lines
under assembly with gcc -O2 and it gives the exact same result as the open code, so I do not see what can be said against it?
It is unnecessary,
Yes it is necessary, for the reader. (And the writer).
it looks ugly,
I think it is not, that's a matter of taste, no? The opposite is true, your option is the ugly one.
Quoted 3 lines
the latter form takes 2 pointers and
hides an assignment, it does an unconditional pointer increment.So do all the other xdr_{de,en}code_xxx I don't see a choice. Some eggs most be broken when making a cake. It is totally uniform with the reset of the code which is my point. I don't want an alien looking code in the mids of very uniform bunch. And I don't want distracting information, I want the essence stated clearly. I don't write assembly and I don't right computer language, I write English (conforming to computer logic).
Quoted 4 lines
Quoted 2 lines
IOW: Just learn the meaning of 'pointer to
__be32'.What? I lost you, I don't understand what you mean?
I mean that the fundamental type of XDR is a __be32. We are using that fundamental type in standard C code.
The fundamental Linux function for converting from a u32 to a __be32 is cpu_to_be32(). It doesn't need a new wrapper, and neither does be32_to_cpu().
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1251118754.6325.47.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Quoted 13 lines · Trond Myklebust
Quoted 11 lines · Boaz Harrosh
Quoted 6 lines · Trond Myklebust
Quoted 2 lines · Boaz Harrosh
OK I used the new stuff by now, and I'm happy with everything but the above. I *absolutely* insist on this changing to:
Feel quite free to insist, but the patch isn't going in.
I think your being irrational here. I'm not the first that wants this, it has been brought up again and again on the mailing list. The big majority of nfs/xdr programmers want this. In fact you are the *only one* who's against it.
Quoted 6 lines
I saw your call for a show of hands, but have yet to see any replies. It is probably a bit early for you to start talking about big majorities...
In any case, I don't apply patches based on popular vote. I apply them based on my conviction that they are useful.
I think you need a reality check. Just look in the mailing list archives.
Quoted 45 lines
Quoted 45 lines
Quoted 22 lines
Quoted 22 lines
p = xdr_encode_word(p, foo); and p = xdr_decode_word(p, &foo);[xdr_{encode,decode}_word is defined differently but is only used in a couple
of sunrpc files, the change of these places shall be added to this cleanup]I have checked this version of the definition:
static inline__be32*
xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p;}
static inline
__be32*
xdr_decode_word(__be32 *p, __u32 *valp){ *valp = be32_to_cpu(*p++); return p;}
Quoted 4 lines
Quoted 2 lines
under assembly with gcc -O2 and it gives the exact same result as the open code, so I do not see what can be said against it?
It is unnecessary,
Yes it is necessary, for the reader. (And the writer).
it looks ugly,
I think it is not, that's a matter of taste, no? The opposite is true, your option is the ugly one.
Quoted 3 lines
the latter form takes 2 pointers and
hides an assignment, it does an unconditional pointer increment.So do all the other xdr_{de,en}code_xxx I don't see a choice. Some eggs most be broken when making a cake. It is totally uniform with the reset of the code which is my point. I don't want an alien looking code in the mids of very uniform bunch. And I don't want distracting information, I want the essence stated clearly. I don't write assembly and I don't right computer language, I write English (conforming to computer logic).
Quoted 7 lines
Quoted 4 lines
Quoted 2 lines
IOW: Just learn the meaning of 'pointer to
__be32'.What? I lost you, I don't understand what you mean?
I mean that the fundamental type of XDR is a
__be32. We are using that fundamental type in standard C code.
I heavily use beXX types in code totally unrelated to XDR. Please don't hijack _beXX to mean XDR, for me they are just unrelated overlapping subjects.
Quoted 4 lines
The fundamental Linux function for converting from a u32 to a
__be32iscpu_to_be32(). It doesn't need a new wrapper, and neither doesbe32_to_cpu().
And that is exactlly why I use them inside "my" xdr-wrapper. But the xdr wrapper for me is to do with calling convention, uniformity of code, and statement of intent. My wrapper is not about byte-ness it is about calling convention and that pointer arithmetic which you don't like, and I do.
Quoted 1 line
Boaz
Quoted 8 lines · Boaz Harrosh
Quoted 5 lines · Trond Myklebust
Quoted 1 line · Boaz Harrosh
On 08/24/2009 02:56 PM, Trond Myklebust wrote:
In any case, I don't apply patches based on popular vote. I apply them based on my conviction that they are useful.
I think you need a reality check. Just look in the mailing list archives.
No Boaz. YOU need the reality check.
As I said above, I don't apply patches based on popular vote. I'm open to be persuaded that something is useful and helps maintainability of the code, but I'm not open to coercive tactics such as people telling me that I'm being irrational, and that I should do what the "Big Majority" (consisting so far of 2 people) wants.
Quoted 5 lines
Quoted 2 lines
I mean that the fundamental type of XDR is a
__be32. We are using that fundamental type in standard C code.I heavily use beXX types in code totally unrelated to XDR. Please don't hijack
_beXXto mean XDR, for me they are just unrelated overlapping subjects.
??? We don't have a special 'XDR' type, and I didn't say '__beXX' is XDR. I said that the fundamental type that we use in XDR encoding and decoding is a __b32. That's why you get to declare
__be32 *p;
at the top of each XDR function. Then you get to encode the contents of that '__be32' declared memory location using the standard Linux C functions for manipulating '__be32' type.
If you don't like the names of those standard functions, then complain to the people who named them.
Quoted 9 lines
Quoted 4 lines
The fundamental Linux function for converting from a u32 to a
__be32iscpu_to_be32(). It doesn't need a new wrapper, and neither doesbe32_to_cpu().And that is exactlly why I use them inside "my" xdr-wrapper. But the xdr wrapper for me is to do with calling convention, uniformity of code, and statement of intent. My wrapper is not about byte-ness it is about calling convention and that pointer arithmetic which you don't like, and I do.
I repeat: we don't have a special 'XDR' type. We have __be32.
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1251121822.6325.68.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Quoted 8 lines · Trond Myklebust
Quoted 7 lines · Boaz Harrosh
Quoted 5 lines · Trond Myklebust
Quoted 1 line · Boaz Harrosh
On 08/24/2009 02:56 PM, Trond Myklebust wrote:
In any case, I don't apply patches based on popular vote. I apply them based on my conviction that they are useful.
Quoted 7 lines
Quoted 1 line
I think you need a reality check. Just look in the mailing list archives.
No Boaz. YOU need the reality check.
As I said above, I don't apply patches based on popular vote. I'm open to be persuaded that something is useful and helps maintainability of the code,
No you are not open. We tell you it helps us, and your unswer is "it does not help me". But you are narrow minded on the NFS code, when some of us come from other parts and would like a distinction.
Quoted 4 lines
but I'm not open to coercive tactics such as people telling me that I'm being irrational, and that I should do what the "Big Majority" (consisting so far of 2 people) wants.
3-to-1 in this thread only, I've search the archives, every once in a while the subject comes up and patches are submitted, and you are the only one to object.
There is no coercive tactics. "coercive tactics" would be to snick in the code through some other tree. I'm trying to convince you that there are other points of views and that it would help all bunch of people. That we like it on merits other than pure computer-science but for ease of read/writing and a means to make our life easier. You see no point in it, but maybe we do. For our sake, you should consider it.
Quoted 6 lines
Quoted 5 lines
Quoted 2 lines
I mean that the fundamental type of XDR is a
__be32. We are using that fundamental type in standard C code.I heavily use beXX types in code totally unrelated to XDR. Please don't hijack
_beXXto mean XDR, for me they are just unrelated overlapping subjects.
Quoted 7 lines
??? We don't have a special 'XDR' type, and I didn't say '
__beXX' is XDR. I said that the fundamental type that we use in XDR encoding and decoding is a__b32. That's why you get to declare__be32 *p;at the top of each XDR function.
I was not saying XDR type. Sure the type is __be32. I was talking about ease of use and calling convention symmetry.
Quoted 4 lines
Then you get to encode the contents of
that '__be32' declared memory location using the standard Linux C functions for manipulating '__be32' type.
No! you get to use all these xdr_{en,de}code_xx functions, except for the "int type" which you do something else because ... Please look at the code. They stand out as the exception not the rule.
Quoted 3 lines
If you don't like the names of those standard functions, then complain to the people who named them.
It's not the names I don't like, it's the calling convention.
Quoted 5 lines
Quoted 5 lines
Quoted 4 lines
The fundamental Linux function for converting from a u32 to a
__be32iscpu_to_be32(). It doesn't need a new wrapper, and neither doesbe32_to_cpu().
Quoted 7 lines
Quoted 4 lines
And that is exactlly why I use them inside "my" xdr-wrapper. But the xdr wrapper for me is to do with calling convention, uniformity of code, and statement of intent. My wrapper is not about byte-ness it is about calling convention and that pointer arithmetic which you don't like, and I do.
I repeat: we don't have a special 'XDR' type. We have
__be32.
Where do you see the word "type" in my sentence above. I said: calling convention, naming convention, statement of intent. I said nothing about types.
I will keep looking at this code and keep writing this code, and will weep every time. I wish there was some pill I could take that will make me not feel bad about this. Perhaps I'll just get numb after a long while. Maybe that was the: "a bit early for you"
sincerely yours
Boaz
Quoted 53 lines · Boaz Harrosh
Quoted 23 lines · Trond Myklebust
Quoted 6 lines · Boaz Harrosh
Quoted 2 lines · Trond Myklebust
Adding wrappers to do this, is just unnecessarily obfuscating the code.
As I said, *sometimes* "obfuscation" is the point. If it has merits to account for human short concentration span.
In this case, the change was motivated by a bunch of patches which were doing things like adding dummy READ32 requests immediately prior to a
READ_BUF()call. It was therefore abundantly clear that the obfuscation was helping no-one, even though it may have made it easy to churn out bad code quickly.Quoted 8 lines
Quoted 4 lines
Quoted 1 line
* I hate it that I have to count (p)"++" now to look for actual code advancements.
How is that _any_ different from counting WRITE32s?
The size for one. And mainly the symmetry with the other side of the wire.
WRITEXX for every READXX. What now?
Quoted 8 lines
A
*p++ = cpu_to_be32(foo); // WRITE32(foo)for every
foo = be32_to_cpu(*p++); // READ32(foo)OK I used the new stuff by now, and I'm happy with everything but the above. I *absolutely* insist on this changing to:
p = xdr_encode_word(p, foo); and p = xdr_decode_word(p, &foo);[xdr_{encode,decode}_word is defined differently but is only used in a couple of sunrpc files, the change of these places shall be added to this cleanup]
I have checked this version of the definition:
static inline__be32*xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p; }static inline
__be32*xdr_decode_word(__be32 *p, __u32 *valp)
Quoted 7 lines
{ *valp = be32_to_cpu(*p++); return p; }under assembly with gcc -O2 and it gives the exact same result as the open code, so I do not see what can be said against it?
In addition to being consistent with xdr_{encode,decode}_hyper, this adds appropriate static data type checking, which we want.
Quoted 1 line
All in favor say I. (And even if you don't, I know what you all think ;-))
Aye.
--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com
Quoted 16 lines · Chuck Lever
Quoted 15 lines · Boaz Harrosh
I have checked this version of the definition:
static inline__be32*xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p; }static inline
__be32*xdr_decode_word(__be32 *p, __u32 *valp){ *valp = be32_to_cpu(*p++); return p; }
Quoted 6 lines
Quoted 3 lines
under assembly with gcc -O2 and it gives the exact same result as the open code,
so I do not see what can be said against it?In addition to being consistent with xdr_{encode,decode}_hyper, this adds appropriate static data type checking, which we want.
OK. Let's examine that assertion:
AFAICS, xdr_encode_word() doesn't add any typechecking that wasn't already being performed with *p++=cpu_to_be32(foo). I call "bullshit" on that...
xdr_decode_word() does indeed force you to use a pointer to __u32 argument. So if you actually wanted to decode say a signed integer, and store it in a long you will need xdr_decode_int(). How does that help us?
Do we care about type checking storage of u32 into unsigned long? No Do we care about type checking storage of u32 into unsigned int? No Do we care about type checking storage of u32 into signed long or s64? Maybe, so let's look at the protocol. Where does the protocol require you to decode a signed value that might make use of this? The only signed value I see in the protocol is for 'seconds', which is of type int64. Does that justify introducing type checking on all those be32_to_cpu() calls? Clearly, no.
So what are the cases where this might help us?
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
A message that is not in the archive (sent off-list or not yet received): 1251133443.6325.260.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org
Quoted 21 lines · Trond Myklebust
Quoted 20 lines · Chuck Lever
Quoted 18 lines · Boaz Harrosh
I have checked this version of the definition:
static inline__be32*xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p; }static inline
__be32*xdr_decode_word(__be32 *p, __u32 *valp){ *valp = be32_to_cpu(*p++); return p; }under assembly with gcc -O2 and it gives the exact same result as the open code,
so I do not see what can be said against it?
Quoted 8 lines
Quoted 2 lines
In addition to being consistent with xdr_{encode,decode}_hyper, this adds appropriate static data type checking, which we want.
OK. Let's examine that assertion:
AFAICS,
xdr_encode_word()doesn't add any typechecking that wasn't already being performed with *p++=cpu_to_be32(foo). I call "bullshit" on that...
I'm really really not interested in an argument about this, I was merely expressing my opinion.
cpu_to_be32() does forced type casting, not static type checking. Type casting in fact buries type mismatches, as you have pointed out to me many times.
Quoted 4 lines
xdr_decode_word()does indeed force you to use a pointer to__u32argument. So if you actually wanted to decode say a signed integer, and store it in a long you will needxdr_decode_int(). How does that help us?
By making it explicit at the call site what is going on, instead of allowing implicit type casting to cause problems down the road.
Quoted 1 line
Do we care about type checking storage of u32 into unsigned long? No
We might. Unsigned long on 64-bit platforms is a 64 bit. If someone is careless with a pointer to a u64 (as I have been) this would increase the probability of catching that during a build test.
Quoted 7 lines
Do we care about type checking storage of u32 into unsigned int? No Do we care about type checking storage of u32 into signed long or s64? Maybe, so let's look at the protocol. Where does the protocol require you to decode a signed value that might make use of this? The only signed value I see in the protocol is for 'seconds', which is of type int64. Does that justify introducing type checking on all those
be32_to_cpu()calls? Clearly, no.
Static type checking is prophylactic. Basically we want to make it harder to make stupid mistakes when writing the code. This is not about run-time checking.
--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com
Quoted 32 lines · Chuck Lever
Quoted 24 lines · Trond Myklebust
Quoted 16 lines · Chuck Lever
Quoted 15 lines · Boaz Harrosh
I have checked this version of the definition:
static inline__be32*xdr_encode_word(__be32 *p, __u32 val){ *p++ = cpu_to_be32(val); return p; }static inline
__be32*xdr_decode_word(__be32 *p, __u32 *valp){ *valp = be32_to_cpu(*p++); return p; }Quoted 6 lines
Quoted 3 lines
under assembly with gcc -O2 and it gives the exact same result as the open code,
so I do not see what can be said against it?In addition to being consistent with xdr_{encode,decode}_hyper, this adds appropriate static data type checking, which we want.
Quoted 6 lines
OK. Let's examine that assertion:
AFAICS,
xdr_encode_word()doesn't add any typechecking that wasn't already being performed with *p++=cpu_to_be32(foo). I call "bullshit" on
that...
Quoted 6 lines
I'm really really not interested in an argument about this, I was merely expressing my opinion.
cpu_to_be32()does forced type casting, not static type checking. Type casting in fact buries type mismatches, as you have pointed out to me many times.
...and the proposed xdr_encode_word() does... (drumroll) .... forced type casting of the u32 argument. No extra type checking.
Quoted 6 lines
Quoted 5 lines
xdr_decode_word()does indeed force you to use a pointer to__u32argument. So if you actually wanted to decode say a signed integer, and
store it in a long you will needxdr_decode_int(). How does that help us?
Quoted 8 lines
By making it explicit at the call site what is going on, instead of allowing implicit type casting to cause problems down the road.
Quoted 1 line
Do we care about type checking storage of u32 into unsigned long? No
We might. Unsigned long on 64-bit platforms is a 64 bit. If someone is careless with a pointer to a u64 (as I have been) this would increase the probability of catching that during a build test.
So you assign a 32-bit value to a 64-bit container. Unless it involves sign extension (and the protocol doesn't allow for that, see below), then why is that problematic?
Quoted 10 lines
Quoted 7 lines
Do we care about type checking storage of u32 into unsigned int? No Do we care about type checking storage of u32 into signed long or s64? Maybe, so let's look at the protocol. Where does the protocol require you to decode a signed value that might make use of this? The only signed value I see in the protocol is for 'seconds', which is of type int64. Does that justify introducing type checking on all those
be32_to_cpu()calls? Clearly, no.Static type checking is prophylactic. Basically we want to make it harder to make stupid mistakes when writing the code.
I repeat my request for specific examples of coding errors that this will catch. Bear in mind that we are coding to a particular protocol, and that the entries in the structures in nfs_xdr.h are typed accordingly.
Quoted 2 lines
This is not
about run-time checking.
Who has said anything whatsoever about run time checking?
Signature · 6 lines
Trond Myklebust Linux NFS client maintainer NetApp [email protected] www.netapp.com
Quoted 19 lines · Trond Myklebust
Quoted 3 lines · Boaz Harrosh
* So I hate it that the READ32/WRITE32 is open coded. Now it looks like nothing, it should have an xdr_encode/decode naming convention, all details hidden, consistent calling convention with the reset of the code.
The convention is already established. Please see 15 years worth of NFSv2/v3 xdr code. The NFSv4 code was the exception not the rule.
Now, it is obvious what we're doing: we're writing 32-bit big endian encoded data into a memory buffer. Furthermore, the process of converting from cpu ordered integers into 32-bit big endian is now made obvious, making it easily verifiable both by inspection, and using 'sparse'.
Adding wrappers to do this, is just unnecessarily obfuscating the code.Quoted 1 line
* I hate it that I have to count (p)"++" now to look for actual code advancements.
How is that _any_ different from counting WRITE32s?
Quoted 8 lines
Quoted 2 lines
* I hate that it is called
encode_hyperthat a dum like me needs to look it up in the dictionary "32" and "64" will doI don't mind changing the name of
xdr_encode_hyper()toxdr_encode_uint64or some such alternative, however the point is that we should have only _one_ function that encodes 64 bit integers. Not one function that everyone else uses, and then a macro that NFSv4 uses.
It seems to me that xdr_encode_hyper() is good because it matches the XDR specification, which called 64 bit integer values, "hyper".
ps
Quoted 11 lines
Quoted 2 lines
* I hated it before, but I hate it even more now that the same operation is:
reserved(4); p + 1Huh? What operation?
Quoted 1 line
I wish it could be all
__be32everywhere??? That's up to the protocol. If the protocol uses 32-bit integers, then we can use
__be32, but if it specifies a 64-bit big endian integer in some structure, then we need to encode for that.