forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'nfsd-5.16' of git://linux-nfs.org/~bfields/linux
Pull nfsd updates from Bruce Fields: "A slow cycle for nfsd: mainly cleanup, including Neil's patch dropping support for a filehandle format deprecated 20 years ago, and further xdr-related cleanup from Chuck" * tag 'nfsd-5.16' of git://linux-nfs.org/~bfields/linux: (26 commits) nfsd4: remove obselete comment nfsd: document server-to-server-copy parameters NFSD:fix boolreturn.cocci warning nfsd: update create verifier comment SUNRPC: Change return value type of .pc_encode SUNRPC: Replace the "__be32 *p" parameter to .pc_encode NFSD: Save location of NFSv4 COMPOUND status SUNRPC: Change return value type of .pc_decode SUNRPC: Replace the "__be32 *p" parameter to .pc_decode SUNRPC: De-duplicate .pc_release() call sites SUNRPC: Simplify the SVC dispatch code path SUNRPC: Capture value of xdr_buf::page_base SUNRPC: Add trace event when alloc_pages_bulk() makes no progress svcrdma: Split svcrmda_wc_{read,write} tracepoints svcrdma: Split the svcrdma_wc_send() tracepoint svcrdma: Split the svcrdma_wc_receive() tracepoint NFSD: Have legacy NFSD WRITE decoders use xdr_stream_subsegment() SUNRPC: xdr_stream_subsegment() must handle non-zero page_bases NFSD: Initialize pointer ni with NULL and not plain integer 0 NFSD: simplify struct nfsfh ...
- Loading branch information
Showing
43 changed files
with
1,155 additions
and
1,050 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,3 +11,4 @@ NFS | |
rpc-server-gss | ||
nfs41-server | ||
knfsd-stats | ||
reexport |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
Reexporting NFS filesystems | ||
=========================== | ||
|
||
Overview | ||
-------- | ||
|
||
It is possible to reexport an NFS filesystem over NFS. However, this | ||
feature comes with a number of limitations. Before trying it, we | ||
recommend some careful research to determine whether it will work for | ||
your purposes. | ||
|
||
A discussion of current known limitations follows. | ||
|
||
"fsid=" required, crossmnt broken | ||
--------------------------------- | ||
|
||
We require the "fsid=" export option on any reexport of an NFS | ||
filesystem. You can use "uuidgen -r" to generate a unique argument. | ||
|
||
The "crossmnt" export does not propagate "fsid=", so it will not allow | ||
traversing into further nfs filesystems; if you wish to export nfs | ||
filesystems mounted under the exported filesystem, you'll need to export | ||
them explicitly, assigning each its own unique "fsid= option. | ||
|
||
Reboot recovery | ||
--------------- | ||
|
||
The NFS protocol's normal reboot recovery mechanisms don't work for the | ||
case when the reexport server reboots. Clients will lose any locks | ||
they held before the reboot, and further IO will result in errors. | ||
Closing and reopening files should clear the errors. | ||
|
||
Filehandle limits | ||
----------------- | ||
|
||
If the original server uses an X byte filehandle for a given object, the | ||
reexport server's filehandle for the reexported object will be X+22 | ||
bytes, rounded up to the nearest multiple of four bytes. | ||
|
||
The result must fit into the RFC-mandated filehandle size limits: | ||
|
||
+-------+-----------+ | ||
| NFSv2 | 32 bytes | | ||
+-------+-----------+ | ||
| NFSv3 | 64 bytes | | ||
+-------+-----------+ | ||
| NFSv4 | 128 bytes | | ||
+-------+-----------+ | ||
|
||
So, for example, you will only be able to reexport a filesystem over | ||
NFSv2 if the original server gives you filehandles that fit in 10 | ||
bytes--which is unlikely. | ||
|
||
In general there's no way to know the maximum filehandle size given out | ||
by an NFS server without asking the server vendor. | ||
|
||
But the following table gives a few examples. The first column is the | ||
typical length of the filehandle from a Linux server exporting the given | ||
filesystem, the second is the length after that nfs export is reexported | ||
by another Linux host: | ||
|
||
+--------+-------------------+----------------+ | ||
| | filehandle length | after reexport | | ||
+========+===================+================+ | ||
| ext4: | 28 bytes | 52 bytes | | ||
+--------+-------------------+----------------+ | ||
| xfs: | 32 bytes | 56 bytes | | ||
+--------+-------------------+----------------+ | ||
| btrfs: | 40 bytes | 64 bytes | | ||
+--------+-------------------+----------------+ | ||
|
||
All will therefore fit in an NFSv3 or NFSv4 filehandle after reexport, | ||
but none are reexportable over NFSv2. | ||
|
||
Linux server filehandles are a bit more complicated than this, though; | ||
for example: | ||
|
||
- The (non-default) "subtreecheck" export option generally | ||
requires another 4 to 8 bytes in the filehandle. | ||
- If you export a subdirectory of a filesystem (instead of | ||
exporting the filesystem root), that also usually adds 4 to 8 | ||
bytes. | ||
- If you export over NFSv2, knfsd usually uses a shorter | ||
filesystem identifier that saves 8 bytes. | ||
- The root directory of an export uses a filehandle that is | ||
shorter. | ||
|
||
As you can see, the 128-byte NFSv4 filehandle is large enough that | ||
you're unlikely to have trouble using NFSv4 to reexport any filesystem | ||
exported from a Linux server. In general, if the original server is | ||
something that also supports NFSv3, you're *probably* OK. Re-exporting | ||
over NFSv3 may be dicier, and reexporting over NFSv2 will probably | ||
never work. | ||
|
||
For more details of Linux filehandle structure, the best reference is | ||
the source code and comments; see in particular: | ||
|
||
- include/linux/exportfs.h:enum fid_type | ||
- include/uapi/linux/nfsd/nfsfh.h:struct nfs_fhbase_new | ||
- fs/nfsd/nfsfh.c:set_version_and_fsid_type | ||
- fs/nfs/export.c:nfs_encode_fh | ||
|
||
Open DENY bits ignored | ||
---------------------- | ||
|
||
NFS since NFSv4 supports ALLOW and DENY bits taken from Windows, which | ||
allow you, for example, to open a file in a mode which forbids other | ||
read opens or write opens. The Linux client doesn't use them, and the | ||
server's support has always been incomplete: they are enforced only | ||
against other NFS users, not against processes accessing the exported | ||
filesystem locally. A reexport server will also not pass them along to | ||
the original server, so they will not be enforced between clients of | ||
different reexport servers. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.