nfsd: fix stripe size reply for the File Layout pNFS server

At a recent testing event I found out that I had misinterpreted
RFC5661 where it describes the stripe size in the File Layout's
nfl_util field. This patch fixes the pNFS File Layout server
so that it returns the correct value to the NFSv4.1/4.2 pNFS
enabled client.

This affects almost no one, since pNFS server configurations
are rare and the extant pNFS aware NFS clients seemed to
function correctly despite the erroneous stripe size.
It *might* be needed for correct behaviour if a recent
Linux client mounts a FreeBSD pNFS server configuration
that is using File Layout (non-mirrored configuration).

MFC after:	2 weeks
This commit is contained in:
Rick Macklem 2021-04-19 17:51:07 -07:00
parent 1ad83445fc
commit 5a89498d19

View File

@ -6873,14 +6873,8 @@ nfsrv_filelayout(struct nfsrv_descript *nd, int iomode, fhandle_t *fhp,
NFSBCOPY(devid, tl, NFSX_V4DEVICEID); /* Device ID. */
tl += (NFSX_V4DEVICEID / NFSX_UNSIGNED);
/*
* Make the stripe size as many 64K blocks as will fit in the stripe
* mask. Since there is only one stripe, the stripe size doesn't really
* matter, except that the Linux client will only handle an exact
* multiple of their PAGE_SIZE (usually 4K). I chose 64K as a value
* that should cover most/all arches w.r.t. PAGE_SIZE.
*/
*tl++ = txdr_unsigned(NFSFLAYUTIL_STRIPE_MASK & ~0xffff);
/* Set the stripe size to the maximum I/O size. */
*tl++ = txdr_unsigned(NFS_SRVMAXIO & NFSFLAYUTIL_STRIPE_MASK);
*tl++ = 0; /* 1st stripe index. */
pattern_offset = 0;
txdr_hyper(pattern_offset, tl); tl += 2; /* Pattern offset. */