diff options
author | kbyanc <kbyanc@FreeBSD.org> | 2006-05-15 19:42:10 +0000 |
---|---|---|
committer | kbyanc <kbyanc@FreeBSD.org> | 2006-05-15 19:42:10 +0000 |
commit | defe42e9097e0e7b16732f64b4acb4ab8a4e4e7d (patch) | |
tree | 80c225232434e035c1f6776fd3e60587ac7e5f86 /sys/fs/pseudofs | |
parent | 497e9819df2bbeb1740d087b7924e7fe2673e602 (diff) | |
download | FreeBSD-src-defe42e9097e0e7b16732f64b4acb4ab8a4e4e7d.zip FreeBSD-src-defe42e9097e0e7b16732f64b4acb4ab8a4e4e7d.tar.gz |
Restore the ability to mount procfs and fdescfs filesystems via the
mount(2) system call:
* Add cmount hook to fdescfs and pseudofs (and, by extension, procfs and
linprocfs). This (mostly) restores the ability to mount these
filesystems using the old mount(2) system call (see below for the
rest of the fix).
* Remove not-NULL check for the data argument from the mount(2) entry
point. Per the mount(2) man page, it is up to the individual
filesystem being mounted to verify data. Or, in the case of procfs,
etc. the filesystem is free to ignore the data parameter if it does
not use it. Enforcing data to be not-NULL in the mount(2) system call
entry point prevented passing NULL to filesystems which ignored the
data pointer value. Apparently, passing NULL was common practice
in such cases, as even our own mount_std(8) used to do it in the
pre-nmount(2) world.
All userland programs in the tree were converted to nmount(2) long ago,
but I've found at least one external program which broke due to this
(presumably unintentional) mount(2) API change. One could argue that
external programs should also be converted to nmount(2), but then there
isn't much point in keeping the mount(2) interface for backward
compatibility if it isn't backward compatible.
Diffstat (limited to 'sys/fs/pseudofs')
-rw-r--r-- | sys/fs/pseudofs/pseudofs.c | 9 | ||||
-rw-r--r-- | sys/fs/pseudofs/pseudofs.h | 4 |
2 files changed, 13 insertions, 0 deletions
diff --git a/sys/fs/pseudofs/pseudofs.c b/sys/fs/pseudofs/pseudofs.c index 1fe0371..da1758b 100644 --- a/sys/fs/pseudofs/pseudofs.c +++ b/sys/fs/pseudofs/pseudofs.c @@ -285,6 +285,15 @@ pfs_mount(struct pfs_info *pi, struct mount *mp, struct thread *td) } /* + * Compatibility shim for old mount(2) system call. + */ +int +pfs_cmount(struct mntarg *ma, void *data, int flags, struct thread *td) +{ + return kernel_mount(ma, flags); +} + +/* * Unmount a pseudofs instance */ int diff --git a/sys/fs/pseudofs/pseudofs.h b/sys/fs/pseudofs/pseudofs.h index 8eaa137..b9701bc 100644 --- a/sys/fs/pseudofs/pseudofs.h +++ b/sys/fs/pseudofs/pseudofs.h @@ -34,6 +34,7 @@ /* * Opaque structures */ +struct mntarg; struct mount; struct nameidata; struct proc; @@ -199,6 +200,8 @@ struct pfs_node { */ int pfs_mount (struct pfs_info *pi, struct mount *mp, struct thread *td); +int pfs_cmount (struct mntarg *ma, void *data, int flags, + struct thread *td); int pfs_unmount (struct mount *mp, int mntflags, struct thread *td); int pfs_root (struct mount *mp, int flags, @@ -251,6 +254,7 @@ _##name##_uninit(struct vfsconf *vfc) { \ } \ \ static struct vfsops name##_vfsops = { \ + .vfs_cmount = pfs_cmount, \ .vfs_init = _##name##_init, \ .vfs_mount = _##name##_mount, \ .vfs_root = pfs_root, \ |