Module Name: src
Committed By: pooka
Date: Thu Nov 26 20:58:51 UTC 2009
Modified Files:
src/sys/rump/librump/rumpkern: emul.c rump.c rump_private.h
src/sys/rump/librump/rumpvfs: Makefile.rumpvfs rump_vfs.c
rump_vfs_private.h rumpfs.c
Log Message:
For rumpfs, do mountroot instead of the bunch of homegrown hacks
currently there. Still needs a little massage to get the kernel
interfaces right and avoid copypaste especially from main().
Also, move it a bit more into the direction of a real file system
(finally!) by giving it a vfsops. Most ops are still unimplemented,
though.
To generate a diff of this commit:
cvs rdiff -u -r1.109 -r1.110 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r1.139 -r1.140 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.35 -r1.36 src/sys/rump/librump/rumpkern/rump_private.h
cvs rdiff -u -r1.19 -r1.20 src/sys/rump/librump/rumpvfs/Makefile.rumpvfs
cvs rdiff -u -r1.34 -r1.35 src/sys/rump/librump/rumpvfs/rump_vfs.c
cvs rdiff -u -r1.7 -r1.8 src/sys/rump/librump/rumpvfs/rump_vfs_private.h
cvs rdiff -u -r1.29 -r1.30 src/sys/rump/librump/rumpvfs/rumpfs.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.109 src/sys/rump/librump/rumpkern/emul.c:1.110
--- src/sys/rump/librump/rumpkern/emul.c:1.109 Wed Nov 4 19:21:51 2009
+++ src/sys/rump/librump/rumpkern/emul.c Thu Nov 26 20:58:51 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: emul.c,v 1.109 2009/11/04 19:21:51 pooka Exp $ */
+/* $NetBSD: emul.c,v 1.110 2009/11/26 20:58:51 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.109 2009/11/04 19:21:51 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.110 2009/11/26 20:58:51 pooka Exp $");
#include <sys/param.h>
#include <sys/null.h>
@@ -67,7 +67,6 @@
kmutex_t *proc_lock;
struct lwp lwp0;
struct vnode *rootvp;
-struct device *root_device;
dev_t rootdev;
int physmem = 256*256; /* 256 * 1024*1024 / 4k, PAGE_SIZE not always set */
int doing_shutdown;
@@ -124,10 +123,10 @@
device_class(device_t dev)
{
- if (dev != root_device)
+ if (dev != RUMP_VFSROOTDEV)
panic("%s: dev != root_device not supported", __func__);
- return DV_DISK;
+ return DV_VIRTUAL;
}
void
Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.139 src/sys/rump/librump/rumpkern/rump.c:1.140
--- src/sys/rump/librump/rumpkern/rump.c:1.139 Thu Nov 26 17:36:22 2009
+++ src/sys/rump/librump/rumpkern/rump.c Thu Nov 26 20:58:51 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.139 2009/11/26 17:36:22 pooka Exp $ */
+/* $NetBSD: rump.c,v 1.140 2009/11/26 20:58:51 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.139 2009/11/26 17:36:22 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.140 2009/11/26 20:58:51 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -123,6 +123,7 @@
int rump__unavailable() {return EOPNOTSUPP;}
__weak_alias(rump_net_init,rump__unavailable);
__weak_alias(rump_vfs_init,rump__unavailable);
+__weak_alias(rump_vfs_init2,rump__unavailable);
__weak_alias(rump_dev_init,rump__unavailable);
__weak_alias(rump_vfs_fini,rump__unavailable);
@@ -300,6 +301,11 @@
sysctl_finalize();
+ rumpuser_dl_module_bootstrap(rump_module_init, rump_kernelfsym_load);
+
+ /* mount rootfs, etcetc. */
+ rump_vfs_init2();
+
rumpuser_gethostname(hostname, MAXHOSTNAMELEN, &error);
hostnamelen = strlen(hostname);
@@ -312,7 +318,6 @@
vmem_rehash_start();
#endif
- rumpuser_dl_module_bootstrap(rump_module_init, rump_kernelfsym_load);
rump_unschedule();
return 0;
Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.35 src/sys/rump/librump/rumpkern/rump_private.h:1.36
--- src/sys/rump/librump/rumpkern/rump_private.h:1.35 Mon Nov 9 19:17:42 2009
+++ src/sys/rump/librump/rumpkern/rump_private.h Thu Nov 26 20:58:51 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_private.h,v 1.35 2009/11/09 19:17:42 pooka Exp $ */
+/* $NetBSD: rump_private.h,v 1.36 2009/11/26 20:58:51 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -54,6 +54,7 @@
#define UIO_VMSPACE_SYS (&rump_vmspace)
#define RUMP_LMUTEX_MAGIC ((kmutex_t *)0x101)
+#define RUMP_VFSROOTDEV ((struct device *)-11)
extern int rump_threads;
Index: src/sys/rump/librump/rumpvfs/Makefile.rumpvfs
diff -u src/sys/rump/librump/rumpvfs/Makefile.rumpvfs:1.19 src/sys/rump/librump/rumpvfs/Makefile.rumpvfs:1.20
--- src/sys/rump/librump/rumpvfs/Makefile.rumpvfs:1.19 Thu Nov 26 07:30:24 2009
+++ src/sys/rump/librump/rumpvfs/Makefile.rumpvfs Thu Nov 26 20:58:51 2009
@@ -1,11 +1,11 @@
-# $NetBSD: Makefile.rumpvfs,v 1.19 2009/11/26 07:30:24 pooka Exp $
+# $NetBSD: Makefile.rumpvfs,v 1.20 2009/11/26 20:58:51 pooka Exp $
#
.include "${RUMPTOP}/Makefile.rump"
LIB= rumpvfs
-.PATH: ${RUMPTOP}/librump/rumpvfs \
+.PATH: ${RUMPTOP}/librump/rumpvfs ${RUMPTOP}/librump \
${RUMPTOP}/../kern \
${RUMPTOP}/../miscfs/genfs ${RUMPTOP}/../miscfs/syncfs \
${RUMPTOP}/../miscfs/specfs ${RUMPTOP}/../miscfs/deadfs \
@@ -17,7 +17,7 @@
#
SRCS= rump_vfs.c devnodes.c rumpblk.c rumpfs.c vm_vfs.c
-SRCS+= fstrans_stub.c vfsops_stub.c
+SRCS+= fstrans_stub.c vfsops_stub.c rump_module.c
SRCS+= rumpvfs_if_wrappers.c
Index: src/sys/rump/librump/rumpvfs/rump_vfs.c
diff -u src/sys/rump/librump/rumpvfs/rump_vfs.c:1.34 src/sys/rump/librump/rumpvfs/rump_vfs.c:1.35
--- src/sys/rump/librump/rumpvfs/rump_vfs.c:1.34 Thu Nov 19 14:44:58 2009
+++ src/sys/rump/librump/rumpvfs/rump_vfs.c Thu Nov 26 20:58:51 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_vfs.c,v 1.34 2009/11/19 14:44:58 pooka Exp $ */
+/* $NetBSD: rump_vfs.c,v 1.35 2009/11/26 20:58:51 pooka Exp $ */
/*
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump_vfs.c,v 1.34 2009/11/19 14:44:58 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump_vfs.c,v 1.35 2009/11/26 20:58:51 pooka Exp $");
#include <sys/param.h>
#include <sys/buf.h>
@@ -102,7 +102,17 @@
rumpuser_biothread, rump_biodone, NULL, "rmpabio")) != 0)
panic("syncer thread create failed: %d", rv);
}
- rumpfs_init();
+}
+
+void
+rump_vfs_init2()
+{
+ int rv;
+
+ rootfstype = ROOT_FSTYPE_ANY;
+ root_device = RUMP_VFSROOTDEV;
+ vfs_mountroot();
+ VFS_ROOT(CIRCLEQ_FIRST(&mountlist), &rootvnode);
rump_proc_vfs_init = pvfs_init;
rump_proc_vfs_release = pvfs_rele;
@@ -114,6 +124,8 @@
proc0.p_cwdi = &cwdi0;
proc0.p_cwdi = cwdinit();
+ VOP_UNLOCK(rootvnode, 0);
+
if (rump_threads) {
if ((rv = kthread_create(PRI_IOFLUSH, KTHREAD_MPSAFE, NULL,
sched_sync, NULL, NULL, "ioflush")) != 0)
Index: src/sys/rump/librump/rumpvfs/rump_vfs_private.h
diff -u src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.7 src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.8
--- src/sys/rump/librump/rumpvfs/rump_vfs_private.h:1.7 Wed Oct 14 17:29:20 2009
+++ src/sys/rump/librump/rumpvfs/rump_vfs_private.h Thu Nov 26 20:58:51 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_vfs_private.h,v 1.7 2009/10/14 17:29:20 pooka Exp $ */
+/* $NetBSD: rump_vfs_private.h,v 1.8 2009/11/26 20:58:51 pooka Exp $ */
/*
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
@@ -31,6 +31,7 @@
#include <sys/types.h>
void rump_vfs_init(void);
+void rump_vfs_init2(void);
void rump_vfs_fini(void);
void rumpfs_init(void);
Index: src/sys/rump/librump/rumpvfs/rumpfs.c
diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.29 src/sys/rump/librump/rumpvfs/rumpfs.c:1.30
--- src/sys/rump/librump/rumpvfs/rumpfs.c:1.29 Wed Oct 14 18:18:53 2009
+++ src/sys/rump/librump/rumpvfs/rumpfs.c Thu Nov 26 20:58:51 2009
@@ -1,9 +1,7 @@
-/* $NetBSD: rumpfs.c,v 1.29 2009/10/14 18:18:53 pooka Exp $ */
+/* $NetBSD: rumpfs.c,v 1.30 2009/11/26 20:58:51 pooka Exp $ */
/*
- * Copyright (c) 2007 Antti Kantee. All Rights Reserved.
- *
- * Development of this software was supported by Google Summer of Code.
+ * Copyright (c) 2009 Antti Kantee. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.29 2009/10/14 18:18:53 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.30 2009/11/26 20:58:51 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -37,6 +35,7 @@
#include <sys/fcntl.h>
#include <sys/kauth.h>
#include <sys/malloc.h>
+#include <sys/module.h>
#include <sys/mount.h>
#include <sys/namei.h>
#include <sys/lock.h>
@@ -140,6 +139,10 @@
#define rn_offset rn_u.reg.offset
#define rn_dir rn_u.dir
+struct rumpfs_mount {
+ struct vnode *rfsmp_rvp;
+};
+
static struct rumpfs_node *makeprivate(enum vtype, dev_t, off_t);
/*
@@ -310,7 +313,6 @@
* rumpfs
*/
-static struct mount rump_mnt;
static int lastino = 1;
static kmutex_t reclock;
@@ -365,7 +367,7 @@
}
static int
-makevnode(struct rumpfs_node *rn, struct vnode **vpp)
+makevnode(struct mount *mp, struct rumpfs_node *rn, struct vnode **vpp)
{
struct vnode *vp;
int (**vpops)(void *);
@@ -384,7 +386,7 @@
&& va->va_type != VSOCK)
return EOPNOTSUPP;
- rv = getnewvnode(VT_RUMP, &rump_mnt, vpops, &vp);
+ rv = getnewvnode(VT_RUMP, mp, vpops, &vp);
if (rv)
return rv;
@@ -476,7 +478,7 @@
goto getvnode;
*vpp = vp;
} else {
- rv = makevnode(rn, vpp);
+ rv = makevnode(dvp->v_mount, rn, vpp);
rn->rn_vp = *vpp;
mutex_exit(&reclock);
if (rv)
@@ -518,7 +520,7 @@
rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
mutex_enter(&reclock);
- rv = makevnode(rn, vpp);
+ rv = makevnode(dvp->v_mount, rn, vpp);
mutex_exit(&reclock);
if (rv)
goto out;
@@ -554,7 +556,7 @@
rn = makeprivate(va->va_type, va->va_rdev, DEV_BSIZE);
mutex_enter(&reclock);
- rv = makevnode(rn, vpp);
+ rv = makevnode(dvp->v_mount, rn, vpp);
mutex_exit(&reclock);
if (rv)
goto out;
@@ -595,7 +597,7 @@
}
rn = makeprivate(VSOCK, NODEV, DEV_BSIZE);
mutex_enter(&reclock);
- rv = makevnode(rn, vpp);
+ rv = makevnode(dvp->v_mount, rn, vpp);
mutex_exit(&reclock);
if (rv)
goto out;
@@ -770,30 +772,133 @@
return VOCALL(opvec, ap->a_desc->vdesc_offset, v);
}
+/*
+ * Begin vfs-level stuff
+ */
+
+VFS_PROTOS(rumpfs);
+struct vfsops rumpfs_vfsops = {
+ .vfs_name = MOUNT_RUMPFS,
+ .vfs_min_mount_data = 0,
+ .vfs_mount = rumpfs_mount,
+ .vfs_start = (void *)nullop,
+ .vfs_unmount = rumpfs_unmount,
+ .vfs_root = rumpfs_root,
+ .vfs_quotactl = (void *)eopnotsupp,
+ .vfs_sync = (void *)nullop,
+ .vfs_vget = rumpfs_vget,
+ .vfs_fhtovp = (void *)eopnotsupp,
+ .vfs_vptofh = (void *)eopnotsupp,
+ .vfs_init = rumpfs_init,
+ .vfs_reinit = NULL,
+ .vfs_done = rumpfs_done,
+ .vfs_mountroot = rumpfs_mountroot,
+ .vfs_snapshot = (void *)eopnotsupp,
+ .vfs_extattrctl = (void *)eopnotsupp,
+ .vfs_suspendctl = (void *)eopnotsupp,
+ .vfs_opv_descs = rump_opv_descs,
+ /* vfs_refcount */
+ /* vfs_list */
+};
+
+int
+rumpfs_mount(struct mount *mp, const char *mntpath, void *arg, size_t *alen)
+{
+
+ return EOPNOTSUPP;
+}
+
+int
+rumpfs_unmount(struct mount *mp, int flags)
+{
+
+ return EOPNOTSUPP; /* ;) */
+}
+
+int
+rumpfs_root(struct mount *mp, struct vnode **vpp)
+{
+ struct rumpfs_mount *rfsmp = mp->mnt_data;
+
+ vget(rfsmp->rfsmp_rvp, LK_EXCLUSIVE | LK_RETRY);
+ *vpp = rfsmp->rfsmp_rvp;
+ return 0;
+}
+
+int
+rumpfs_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
+{
+
+ return EOPNOTSUPP;
+}
+
void
-rumpfs_init(void)
+rumpfs_init()
{
- struct rumpfs_node *rn;
- int rv;
CTASSERT(RUMP_ETFS_SIZE_ENDOFF == RUMPBLK_SIZENOTSET);
mutex_init(&reclock, MUTEX_DEFAULT, IPL_NONE);
mutex_init(&etfs_lock, MUTEX_DEFAULT, IPL_NONE);
+}
+
+void
+rumpfs_done()
+{
+
+ mutex_destroy(&reclock);
+ mutex_destroy(&etfs_lock);
+}
- /* XXX: init properly instead of this crap */
- rump_mnt.mnt_refcnt = 1;
- rump_mnt.mnt_flag = MNT_ROOTFS;
- rw_init(&rump_mnt.mnt_unmounting);
- TAILQ_INIT(&rump_mnt.mnt_vnodelist);
+int
+rumpfs_mountroot()
+{
+ struct mount *mp;
+ struct rumpfs_mount *rfsmp;
+ struct rumpfs_node *rn;
+ int error;
+
+ if ((error = vfs_rootmountalloc(MOUNT_RUMPFS, "rootdev", &mp)) != 0) {
+ vrele(rootvp);
+ return error;
+ }
+
+ rfsmp = kmem_alloc(sizeof(*rfsmp), KM_SLEEP);
- vfs_opv_init(rump_opv_descs);
rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
mutex_enter(&reclock);
- rv = makevnode(rn, &rootvnode);
+ error = makevnode(mp, rn, &rfsmp->rfsmp_rvp);
mutex_exit(&reclock);
- if (rv)
- panic("could not create root vnode: %d", rv);
- rootvnode->v_vflag |= VV_ROOT;
- VOP_UNLOCK(rootvnode, 0);
+ rfsmp->rfsmp_rvp->v_vflag |= VV_ROOT;
+ if (error)
+ panic("could not create root vnode: %d", error);
+ mp->mnt_data = rfsmp;
+ VOP_UNLOCK(rfsmp->rfsmp_rvp, 0);
+
+ mp->mnt_flag |= MNT_ROOTFS;
+ rumpfs_vfsops.vfs_refcount++;
+
+ mutex_enter(&mountlist_lock);
+ CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
+ mutex_exit(&mountlist_lock);
+
+ vfs_unbusy(mp, false, NULL);
+
+ return 0;
+}
+
+MODULE(MODULE_CLASS_VFS, rumpfs, NULL);
+
+static int
+rumpfs_modcmd(modcmd_t cmd, void *arg)
+{
+
+ switch (cmd) {
+ case MODULE_CMD_INIT:
+ return vfs_attach(&rumpfs_vfsops);
+ case MODULE_CMD_FINI:
+ return vfs_detach(&rumpfs_vfsops);
+ default:
+ return ENOTTY;
+ }
}