Subject: Re: multiple mounts on same directory
To: Alan Barrett <apb@cequrux.com>
From: Bill Studenmund <wrstuden@netbsd.org>
List: tech-userlevel
Date: 07/18/2003 09:27:12
On Fri, 18 Jul 2003, Alan Barrett wrote:
> I want to have several union mounts on the same destination directory.
> When I perform the mounts one by one, it all works fine. For example,
>
> mount -t null -o union /source1 /target
> mount -t null -o union /source2 /target
>
> However, when I put the following lines in /etc/fstab:
>
> /source1 /target null rw,union 0 0
> /source2 /target null rw,union 0 0
>
> and run "mount -av", then only the first mount works. The second mount
> falls foul of a duplicate detection test in the mountfs() function
> near line 352 of src/sbin/mount/mount.c. The test in question looks
> something like this:
>
> /*
> * XXX can't check f_mntfromname,
> * thanks to mfs, union, etc.
> */
> if (strncmp(name, sfp[i].f_mntonname, MNAMELEN) == 0 &&
> strncmp(vfstype, sfp[i].f_fstypename,
> MFSNAMELEN) == 0) {
> /* ignore duplicate ... */
> }
>
> I can see why we would sometimes want to avoid checking the f_mntfromname
> field (for example, with mfs mounts, it shows "mfs:<pid>" instead of just
> "mfs". But sometimes (as in the multiple-union-mount case) we really
> do need to check f_mntfromname.
>
> I have the following ideas for fixing this:
>
> 1. Add a MNT_foo flag to mean "Do not use the f_mntfromname field
> as part of duplicate detection"; let the flag be set by procfs,
> kernfs, mfs, and any others that need it; and let it be tested by
> the relevant part of mountfs().
Please don't. This case only matters to mount -a, and we've got a lot of
mount flags as it is. Please don't add a new one. We can just tweak the
mount -a code.
> 2. Add some special rules to the relevant part of mountfs() to help it
> guess whether or not to use f_mntfromname for duplicate detection.
> For example, it could assume that f_mntfromname is important for
> all mounts with fstype="union" or with the MNT_UNION flag set.
>
> 3. Add fuzzy matching of f_mntfromname to the relevant part of
> mountfs(). For example, it could decide that "mfs" and "mfs:123"
> are close enough to count as duplicates.
I think it's perfectly fine to just have the code in mount know that for
mfs mount (and mfs mounts _only_), f_mntfromname doesn't matter for
differences.
The reason that "union" is special is that if you mount with the -b
option, then the f_mntfromname will get changed. As I recall, it'll become
"<below>:" in front of the name. So the matching code would also need to
synthesize a new union f_mntfromname. But once it's done that, it will
match perfectly well.
Note: this suggestion is a modification of #2. :-)
> 4. Keep both the original name (e.g."mfs") and the modified name (e.g.
> "mfs:<pid>") around in the kernel, and make them both available in
> struct statfs. Let the relevant part of mountfs() use the original
> name for duplicate detection.
>
> I like option 1 best. I have written code for option 2 and it seems to
> work.
As above, I like a modified #2. There's no need for the kernel to get
involved in this, and I'd rather it didn't.
Take care,
Bill