This patch adds a -z flag to import(4) to match the behavior of
exportfs(4) for exports made with the -r or -S flag, which bypass the
tree negotiation part of the protocol. This solves a conflict between
exportfs(4) flags. Currently, if an exportfs listener is using the -a
flag for authentication, the -r and -S flags to specify a subtree or
service become unusable although no error condition is reported. It
is desirable to enable a command like this to work as intended:
aux/listen1 tcp!*!port /bin/exportfs -a -r /usr/me/pubauth
and similarly with authenticated listeners for exportfs -S service
mounts.
The suggested patch is completely minimal and non-invasive. It adds a
-z flag for import(4) to exist in symmetry with the -r and -S flags to
exportfs(4). Import(4) is the intended client for exportfs(4) so the
option of skipping tree negotiation should be present for import(4) as
well. This patch does not change any existing behaviors or currently
documented functions. It simply makes import(4) function correctly in
combination with an exportfs(4) using -a in combination with -r or -S.
This patch does not affect the function of "backwards" mode and
requires no new logic other than a single if statement and controlling
flag. The ability to create authenticated public exportfs(4)
listeners for a given -r subtree or -S service is useful and seems
entirely consistent with the intended functions of import/export.
Currently, non-authenticated -r or -S exports can be attached with
srv(4) and mount(1) (or used in backwards mode) but adding the -a
option makes them unmountable when acting as public listeners, unless
this patch is used.
Included are manpage adjustments for both import(4) and exportfs(4) to
explain the use of the new -z flag to import, as well as a few
additional examples of import usage. The changes in exportfs(4) man
page explain the use of import, there is no changed code or behavior
in exportfs.
TESTING NOTES:
Current behavior:
server:
aux/listen1 tcp!*!port /bin/exportfs -a -r /some/path
client attempts:
import tcp!server!port /some/path /n/path
import: bad remote tree: can't read tree
import tcp!server!port / /n/path
(waits and does nothing)
srv tcp!server!port remote /n/remote
srv tcp!server!port: mount failed: bad fversion conversion on reply
Behavior with import -z:
server (same as above):
aux/listen1 tcp!*!port /bin/exportfs -a -r /some/path
client:
import -z tcp!server!port anything /mount/point
ls /mount/point
And we have a mounted fs assuming we had the right key in our
factotum(4). It should be noted that with this modification, import
-A -z will mount non-authenticated exportfs -r and -S services in the
manner of a srv and mount sequence.
|