Revert r283330 since it broke directory caching in the client.
At this time I cannot see a way to fix directory caching when it has partial blocks in the buffer cache, due to the fact that the syscall's uio_offset won't stay the same as the lblkno * NFS_DIRBLKSIZ offset. Reported by: bde MFC after: 2 weeks
This commit is contained in:
parent
09c837b897
commit
b179878dde
@ -3089,6 +3089,25 @@ nfsrpc_readdir(vnode_t vp, struct uio *uiop, nfsuint64 *cookiep,
|
||||
*eofp = eof;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add extra empty records to any remaining DIRBLKSIZ chunks.
|
||||
*/
|
||||
while (uio_uio_resid(uiop) > 0 && ((size_t)(uio_uio_resid(uiop))) != tresid) {
|
||||
dp = (struct dirent *) CAST_DOWN(caddr_t, uio_iov_base(uiop));
|
||||
dp->d_type = DT_UNKNOWN;
|
||||
dp->d_fileno = 0;
|
||||
dp->d_namlen = 0;
|
||||
dp->d_name[0] = '\0';
|
||||
tl = (u_int32_t *)&dp->d_name[4];
|
||||
*tl++ = cookie.lval[0];
|
||||
*tl = cookie.lval[1];
|
||||
dp->d_reclen = DIRBLKSIZ;
|
||||
uio_iov_base_add(uiop, DIRBLKSIZ);
|
||||
uio_iov_len_add(uiop, -(DIRBLKSIZ));
|
||||
uio_uio_resid_add(uiop, -(DIRBLKSIZ));
|
||||
uiop->uio_offset += DIRBLKSIZ;
|
||||
}
|
||||
|
||||
nfsmout:
|
||||
if (nd->nd_mrep != NULL)
|
||||
mbuf_freem(nd->nd_mrep);
|
||||
@ -3563,6 +3582,25 @@ nfsrpc_readdirplus(vnode_t vp, struct uio *uiop, nfsuint64 *cookiep,
|
||||
*eofp = eof;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add extra empty records to any remaining DIRBLKSIZ chunks.
|
||||
*/
|
||||
while (uio_uio_resid(uiop) > 0 && uio_uio_resid(uiop) != tresid) {
|
||||
dp = (struct dirent *)uio_iov_base(uiop);
|
||||
dp->d_type = DT_UNKNOWN;
|
||||
dp->d_fileno = 0;
|
||||
dp->d_namlen = 0;
|
||||
dp->d_name[0] = '\0';
|
||||
tl = (u_int32_t *)&dp->d_name[4];
|
||||
*tl++ = cookie.lval[0];
|
||||
*tl = cookie.lval[1];
|
||||
dp->d_reclen = DIRBLKSIZ;
|
||||
uio_iov_base_add(uiop, DIRBLKSIZ);
|
||||
uio_iov_len_add(uiop, -(DIRBLKSIZ));
|
||||
uio_uio_resid_add(uiop, -(DIRBLKSIZ));
|
||||
uiop->uio_offset += DIRBLKSIZ;
|
||||
}
|
||||
|
||||
nfsmout:
|
||||
if (nd->nd_mrep != NULL)
|
||||
mbuf_freem(nd->nd_mrep);
|
||||
|
Loading…
Reference in New Issue
Block a user