The NFS client leaves d_off zero. Populate it with next-entry offsets
into the client's synthesized directory stream when filling the cache
block, allowing reads to resume at individual entry boundaries.
Validate that records cover the buffer without crossing DIRBLKSIZ
boundaries. A saved position can point inside a record when the block
is rebuilt from a directory that changed on the server; move back to
the start of the record which contains it so that only whole records
are returned. Re-anchoring avoids returning fragments but does not
preserve the identity of a saved position across changes to the
synthesized layout: entries can be repeated or skipped. If the record
containing the position does not fit in the caller's buffer, fail the
read instead of returning a partial record, and leave the file position
unchanged so that a larger buffer can retry it.
Since the client now guarantees whole records, nfs_readdir() no longer
needs to round the requested size to a DIRBLKSIZ boundary.