Subject: RE: fsctl(2) [was: Re: Interface to change NFS exports]
To: None <tech-kern@netbsd.org>
From: Gordon Waidhofer <gww@traakan.com>
List: tech-kern
Date: 09/13/2005 20:26:24
Julio's expedient use of fcntl() is understandable
and seems a good step for now. If it cures mountd(8)
brittleness it helps me out, too.
I think the star-to-steer-by is what Jason said, below:
fsctl() (using ioctl() command encoding) and the export
cache. I've no strong opinion about the 'options' argument.
But I would certainly prefer to be compatible with some
kind of precedent -- I'm just so dang tired of #ifdef'ing
code for mice-nuts differences :)
Regards,
-gww
> -----Original Message-----
> From: tech-kern-owner@NetBSD.org [mailto:tech-kern-owner@NetBSD.org]On
> Behalf Of Jason Thorpe
> Sent: Tuesday, September 13, 2005 7:23 PM
> To: jmmv84@gmail.com
> Cc: tech-kern@netbsd.org
> Subject: Re: fsctl(2) [was: Re: Interface to change NFS exports]
>
>
>
> On Sep 12, 2005, at 2:05 AM, Julio M. Merino Vidal wrote:
>
> > We all agree in that a new system call is needed. Some also want this
> > new interface to not only manage NFS exports but also to allow
> > changing
> > other settings from a mount point. I think this is a good idea too.
> >
> > Given these comments, I've started the implementation of a fsctl(2)
> > function call, with the following signature:
> >
> > int fsctl(const char *path, enum fsctl_command command, void
> > *data);
>
> I haven't read the HP-UX fsctl(2) manual page, but I'll point out
> that OS X 10.4 also has a fsctl(2) system call (although I don't see
> a manual page for it).
>
> The 10.4 fsctl(2) basically has ioctl(2) semantics (including the
> size field and direction bits in the command argument), and the
> signature looks like this:
>
> int fsctl(const char *path, u_long cmd, void *data, int options);
>
> "options" is a flags word that currently has one option --
> FSOPT_NOFOLLOW, which means "don't follow symbolic links". That flag
> is used in several VFS syscalls in 10.4.
>
> In 10.4, all fsctl(2) commands are currently file system-specific,
> but that doesn't mean we can't have generic ones that either all file
> systems implement or that are handled at the VFS layer (in general, I
> would like to see us move a LOT more stuff out of individual file
> systems and into the VFS layer).
>
> > At the moment, command can be one of FSCTL_EXPORT_NFS_GET or
> > FSCTL_EXPORT_NFS_SET, to query or set NFS export lists respectively
> > based on the given path. (Minor question: can an enum be used as a
> > system call argument, or should I better use an integer? If not,
> > why?)
>
> Use an ioctl-style command argument :-) It has the nice property of
> handling versioning for you, if the size of the argument were to
> change for some reason.
>
> > The problem with this interface is that it doesn't let you change
> > multiple mount points atomically, as some others have suggested.
> > I also agree that having this feature could be nice.
>
> I don't see the value of changing multiple mount points atomically...
> most important is that an individual mount point's export list is
> updated atomically.
>
> > In the (near) future, we could migrate MNT_GETARGS and MNT_UPDATE
> > to this new system call, as well as other stuff like the quota
> > management.
>
> I don't see anything wrong with keeping MNT_UPDATE as-is. Its
> semantics are "update the mount", i.e. change from r/w to r/o or
> whatever. MNT_GETARGS ... well, I have other opinions on that, as
> well... I would rather we had string-based mount arguments, rather
> than the binary blobs we have now.
>
> > Do you think this is correct and flexible enough for the current and
> > future purposes?
>
> I think I would like to have an fsctl(2), sure. But going back to
> the original discussion about NFS exports, I think that we should
> switch to a model where the export list is not maintained by the
> kernel, but rather ONLY by mountd(8). I believe someone else
> mentioned this as what is done by Solaris...
>
> In this model, the kernel would make an upcall to mountd(8), which
> would either approve or deny, and the kernel would cache the result.
> Updating the export list then becomes a matter of simply fg, 'ing the
> kernel's "export cache".
>
> -- thorpej
>
>