summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_mount.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-12-03 16:11:01 +0000
committerphk <phk@FreeBSD.org>2004-12-03 16:11:01 +0000
commit0381adc1dfeae50004ddf3f91f8e2f29d1c8f805 (patch)
tree30bd6d7172cef8231afb2c63fa0086cfad3689d3 /sys/kern/vfs_mount.c
parent181d4dfad71dede70194d972dd42b816372b0fe6 (diff)
downloadFreeBSD-src-0381adc1dfeae50004ddf3f91f8e2f29d1c8f805.zip
FreeBSD-src-0381adc1dfeae50004ddf3f91f8e2f29d1c8f805.tar.gz
Introduce vfs_byname_kld() which will try to load the filesystem
as a module if possible. Use it so we don't have linker magic in the middle of the already complex mount code.
Diffstat (limited to 'sys/kern/vfs_mount.c')
-rw-r--r--sys/kern/vfs_mount.c32
1 files changed, 3 insertions, 29 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 0211de3..e93790f 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -66,7 +66,6 @@ __FBSDID("$FreeBSD$");
#include <sys/cons.h>
#include <sys/jail.h>
#include <sys/kernel.h>
-#include <sys/linker.h>
#include <sys/mac.h>
#include <sys/malloc.h>
#include <sys/mount.h>
@@ -669,7 +668,6 @@ vfs_domount(
int compat /* Invocation from compat syscall. */
)
{
- linker_file_t lf;
struct vnode *vp;
struct mount *mp;
struct vfsconf *vfsp;
@@ -786,34 +784,10 @@ vfs_domount(
vput(vp);
return (ENOTDIR);
}
- vfsp = vfs_byname(fstype);
+ vfsp = vfs_byname_kld(fstype, td, &error);
if (vfsp == NULL) {
- /* Only load modules for root (very important!). */
- if ((error = suser(td)) != 0) {
- vput(vp);
- return (error);
- }
- error = securelevel_gt(td->td_ucred, 0);
- if (error) {
- vput(vp);
- return (error);
- }
- error = linker_load_module(NULL, fstype, NULL, NULL, &lf);
- if (error || lf == NULL) {
- vput(vp);
- if (lf == NULL)
- error = ENODEV;
- return (error);
- }
- lf->userrefs++;
- /* Look up again to see if the VFS was loaded. */
- vfsp = vfs_byname(fstype);
- if (vfsp == NULL) {
- lf->userrefs--;
- linker_file_unload(lf, LINKER_UNLOAD_FORCE);
- vput(vp);
- return (ENODEV);
- }
+ vput(vp);
+ return (error);
}
VI_LOCK(vp);
if ((vp->v_iflag & VI_MOUNT) != 0 ||
OpenPOWER on IntegriCloud