On Sat, Apr 27 2019, J. Bruce Fields wrote: > On Sat, Apr 27, 2019 at 09:55:23AM +1000, NeilBrown wrote: >> On Fri, Apr 26 2019, J. Bruce Fields wrote: >> > But it's true that from the start nfsd didn't really fit the model >> > of a single (possibly writeable) attribute per file. >> >> Depends on what you mean by that. Original files where write-only and >> where slightly complex attributes. > > Yes I thought it was just those too, but then I looked at the original > commit it also included at least the "exports" file. Maybe it depends on how one chooses to interpret history - never an exact science. The "exports" file pre-existed the nfsd filesystem - it was (and still is) a file in procfs: /proc/fs/nfs/exports. So the nfsd filesystem was not created to provide that file. It was created to replace a systemcall. As I said, it subsequently had a variety of things added to it. exports was just the first of these. At least, that is how I choose to see it. > >> Writing performed an action, like >> adding an entry to the export table (first you add a client, then add a >> client+filesystem to export it). >> >> This idea for a file performing an action, rather than presenting an >> attribute, is much the same as the "bind" and "unbind" files you can >> find in sysfs. >> >> (see also https://lwn.net/Articles/378884/ for examples of sysfs files >> that are not one-attribute-per-file) > > I'll give that a re-read, thanks. > > I did spend maybe a few minutes looking into basing nfsd code on kernfs > and didn't think it was worth it. I could take a more serious look. I think that in your use-case it make lots of sense to have a structured file for the "opens" (similar to /proc/locks and /proc/mounts). The "info" could reasonably be several attribute files (clientid, address, name, minor_version), but I don't think it benefits anyone for 'opens' to be a directory full of directories each with a file for each of the fields. So using kernfs would mean pushing for allowing structured files in kernfs. I'd be happy to support that, but I think you would need to go into it convinced that you really wanted to persist. I think using kernfs is mostly about embedding a kobject in everything, then setting an appropriate ktype with appropriate attributes. Not particularly complex, but certainly a bit of work. Thanks, NeilBrown