nfsd: Fix NFSv3 Readdir/ReaddirPlus reply for large i-node numbers
If the i-node number (d_fileno) for a file on the server did not fit in 32bits, it would be truncated to the low order 32bits for the NFSv3 Readdir and ReaddirPlus RPC replies. This is no longer correct, given that ino_t is now 64bits. This patch fixes this by sending the full 64bits of d_fileno on the wire in the NFSv3 Readdir/ReaddirPlus RPC reply. PR: 271174 Reported by: bmueller@panasas.com Tested by: bmueller@panasas.com MFC after: 2 weeks
This commit is contained in:
parent
7e0f8b79b7
commit
648a208ef3
@ -2251,12 +2251,12 @@ nfsrvd_readdir(struct nfsrv_descript *nd, int isdgram,
|
|||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
|
NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
|
||||||
*tl++ = newnfs_true;
|
*tl++ = newnfs_true;
|
||||||
*tl++ = 0;
|
txdr_hyper(dp->d_fileno, tl);
|
||||||
} else {
|
} else {
|
||||||
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
||||||
*tl++ = newnfs_true;
|
*tl++ = newnfs_true;
|
||||||
}
|
|
||||||
*tl = txdr_unsigned(dp->d_fileno);
|
*tl = txdr_unsigned(dp->d_fileno);
|
||||||
|
}
|
||||||
(void) nfsm_strtom(nd, dp->d_name, nlen);
|
(void) nfsm_strtom(nd, dp->d_name, nlen);
|
||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
||||||
@ -2753,8 +2753,7 @@ nfsrvd_readdirplus(struct nfsrv_descript *nd, int isdgram,
|
|||||||
if (nd->nd_flag & ND_NFSV3) {
|
if (nd->nd_flag & ND_NFSV3) {
|
||||||
NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
|
NFSM_BUILD(tl, u_int32_t *, 3 * NFSX_UNSIGNED);
|
||||||
*tl++ = newnfs_true;
|
*tl++ = newnfs_true;
|
||||||
*tl++ = 0;
|
txdr_hyper(dp->d_fileno, tl);
|
||||||
*tl = txdr_unsigned(dp->d_fileno);
|
|
||||||
dirlen += nfsm_strtom(nd, dp->d_name, nlen);
|
dirlen += nfsm_strtom(nd, dp->d_name, nlen);
|
||||||
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
||||||
txdr_hyper(*cookiep, tl);
|
txdr_hyper(*cookiep, tl);
|
||||||
|
Loading…
Reference in New Issue
Block a user