This patch fixes the Experimental NFS client to properly deal with 32 bit or 64

bit fileid's in NFSv2 and NFSv3. Without this fix, invalid casting (and sign
extension) was creating problems for any fileid greater than 2^31.

We discovered this because we have test clusters with more than 2 billion
allocated files and 64-bit ino_t's (and friend structures).

Reviewed by:    rmacklem
Approved by:    zml (mentor)
MFC after:      2 weeks
This commit is contained in:
Zack Kirsch 2011-03-30 01:10:11 +00:00
parent 5377a72618
commit 418802a96c
2 changed files with 5 additions and 6 deletions

View File

@ -289,8 +289,7 @@ nfsm_loadattr(struct nfsrv_descript *nd, struct nfsvattr *nap)
nap->na_size = fxdr_hyper(&fp->fa3_size); nap->na_size = fxdr_hyper(&fp->fa3_size);
nap->na_blocksize = NFS_FABLKSIZE; nap->na_blocksize = NFS_FABLKSIZE;
nap->na_bytes = fxdr_hyper(&fp->fa3_used); nap->na_bytes = fxdr_hyper(&fp->fa3_used);
nap->na_fileid = fxdr_unsigned(int32_t, nap->na_fileid = fxdr_hyper(&fp->fa3_fileid);
fp->fa3_fileid.nfsuquad[1]);
fxdr_nfsv3time(&fp->fa3_atime, &nap->na_atime); fxdr_nfsv3time(&fp->fa3_atime, &nap->na_atime);
fxdr_nfsv3time(&fp->fa3_ctime, &nap->na_ctime); fxdr_nfsv3time(&fp->fa3_ctime, &nap->na_ctime);
fxdr_nfsv3time(&fp->fa3_mtime, &nap->na_mtime); fxdr_nfsv3time(&fp->fa3_mtime, &nap->na_mtime);
@ -317,7 +316,7 @@ nfsm_loadattr(struct nfsrv_descript *nd, struct nfsvattr *nap)
nap->na_bytes = nap->na_bytes =
(u_quad_t)fxdr_unsigned(int32_t, fp->fa2_blocks) * (u_quad_t)fxdr_unsigned(int32_t, fp->fa2_blocks) *
NFS_FABLKSIZE; NFS_FABLKSIZE;
nap->na_fileid = fxdr_unsigned(int32_t, fp->fa2_fileid); nap->na_fileid = fxdr_unsigned(uint64_t, fp->fa2_fileid);
fxdr_nfsv2time(&fp->fa2_atime, &nap->na_atime); fxdr_nfsv2time(&fp->fa2_atime, &nap->na_atime);
fxdr_nfsv2time(&fp->fa2_mtime, &nap->na_mtime); fxdr_nfsv2time(&fp->fa2_mtime, &nap->na_mtime);
nap->na_flags = 0; nap->na_flags = 0;

View File

@ -2738,9 +2738,9 @@ nfsrpc_readdir(vnode_t vp, struct uio *uiop, nfsuint64 *cookiep,
len = fxdr_unsigned(int, *tl); len = fxdr_unsigned(int, *tl);
} else if (nd->nd_flag & ND_NFSV3) { } else if (nd->nd_flag & ND_NFSV3) {
NFSM_DISSECT(tl, u_int32_t *, 3*NFSX_UNSIGNED); NFSM_DISSECT(tl, u_int32_t *, 3*NFSX_UNSIGNED);
nfsva.na_fileid = nfsva.na_fileid = fxdr_hyper(tl);
fxdr_unsigned(long, *++tl); tl += 2;
len = fxdr_unsigned(int, *++tl); len = fxdr_unsigned(int, *tl);
} else { } else {
NFSM_DISSECT(tl, u_int32_t *, 2*NFSX_UNSIGNED); NFSM_DISSECT(tl, u_int32_t *, 2*NFSX_UNSIGNED);
nfsva.na_fileid = nfsva.na_fileid =