Subject: Re: how to name fs specific programs
To: Bill Sommerfeld <sommerfeld@orchard.east-arlington.ma.us>
From: Terry Lambert <terry@lambert.org>
List: port-i386
Date: 03/26/1997 14:03:21
> I believe I understand what Terry's suggesting.
> 
> He wants to be able to be able to have a new filesystem type appear by
> simply mounting (or symlinking, or copying) the implementation of a
> new filesystem type into /sbin/fs/foo, and he believes that the name
> of the filesystem type should be defined purely by the name used in
> the /sbin/fs directory, and not by anything inherent in the binaries
> found inside /sbin/fs/foo/.

Yes.

> so that, as an extreme case, one could do
> 	mv /sbin/fs/{nfs,losefs}
> and 
> 	sed 's/nfs/losefs/' </etc/fstab >/etc/fstab.NEW && mv /etc/fstab{.NEW,}
> 
> and reboot, and everything will keep working..

Or, a more extreme case:

	cp -R xxxfs /sbin/fs

	newfs -T xxx /dev/rfd0a
	mount /dev/fd0a /mnt

and not even reboot, since one of the binaries that gets moved might be
named "lkm"... a kernel module implementing the FS type, which is demand
loaded by the kernel as a result of the typed mount request (all mount
requests are typed because the generic "mount" which invokes them calls
the generic "fstyp", which calls each available FS's "fstyp" to identify
the FS and make the typed mount request).

I'd actually *prefer* that the per FS kernel code modules be implemented
in the same component as the user space FS support commands, when you
get down to it.


Here are some other scenarios; each assumes additional work on kernel
modularity and component-based implementation of FS modules (but the
same ideas can be spread to non-FS module types as well):


Case 1:

	Consider the agregator (generic) "mount", whose purpose is
	to agregate all of the FS-specific "mount" commands into itself.

	# ls -F /sbin/mount
	/sbin/mount@
	# ls -L /sbin/mount
	/fs/mount

	So the mount command in /sbin is a link to the file /fs/mount.

	By default, all the commands in /fs are specific to a single
	FS type; for example, FFS.

	So in the "only / mounted" case, /fs/mount is the FFS mount
	command.

	Now we want to load other FS type capabilities into the
	system.

	To do this, we mount over /fs.  We will ignore the details of
	loopback and overlay mounting to "move" the contents of "/fs"
	to allow them to be accessable without duplicating them.  We
	simply note that it is possible to do this.

	The mounted-over "/fs" now contains:

	/fs/mount		<- an agregator (generic) mount
	/fs/ffs/mount		<- FFS specific mount, the former
				   /fs/mount
	/fs/*/mount		<- other FS specific mounts for
				   FS types that are also supported
				   not that /fs is mounted over

	The mount requests for FFS still go to /sbin/mount (/fs/mount).

	It's not really important whether the "/fs" is "/fs" or an "fs"
	subdirectory of /sbin (or wherever).  What's important is that
	the "sub-directory of fs" implementation allows file systems
	to be treated as seperate components.

Case 2:

	Consider that the kernel can be an ELF or other section-level
	attributable binary file format.

	Posit that the final stage boot loader has been modified
	to load some section tags from the image and not others.  The
	act of loading a section with a "module" tag invokes the
	module registration mechanism.

	Now there is no difference between an FS LKM and an FS module,
	other than the ELF file of which the section is a member.

	To build a kernel which will load and run on EXT2FS formatted
	devices, we use a section archiver to remove the FFS module
	section and insert an EXT2FS module section in its place.  We
	do not relink the kernel.  We could insert both the FFS and
	EXT2FS modules simultaneously, if we didn't care about burning
	the space on the boot media or in the VM image.  Since the FFS
	is not needed for boot, however, we can provide FFS support
	later using an overlay mount (as in Case 1).

	We now have a minimal kernel localized to the root FS type.

	And we have done it without the USL/SVR4 "hack" of having a
	"bootfs" FS type.


Case 3:

	Because we have segment level tagging for unloaded-by-boot
	segments in our kernel image, we can treat any unloaded
	segment as an FS in it's own right, as long as the kernel
	can still access the kernel image contents (we probably
	want this anyway to support kernel paging, and it's not a
	lot of work to do).

	Now we may treat the kernel image as an FS in its own right;
	an MFS with the kernel image as backing store, if nothing
	else.

	We may mount a section as /fs.  This section is one of the
	sections in the FS module which we added for the root FS
	support.

	Just as with devfs, we now have an FS name space entry, only
	instead of being for "/dev", it's for "/fs" at boot time,
	and is later mounted on "/fs/ffs" (or whichever FS type the
	root FS is).  Alternately, the kernel would also contain
	the agregators -- a "/fs" FS whose purpose is to allow the
	mounting of other inferior per-FS directories and provide
	agregators for all later FS modules.  Since the images
	(other than root, which contains the kernel) are swappable,
	they don't actually take up VM, so this is not as much of
	a memory hog as it might seem.



					Regards,
					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.