Module Name:    src
Committed By:   pooka
Date:           Thu Nov 11 16:01:59 UTC 2010

Modified Files:
        src/sys/rump/librump/rumpvfs: rumpfs.c

Log Message:
support vfs_mount/unmount


To generate a diff of this commit:
cvs rdiff -u -r1.68 -r1.69 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/rumpvfs/rumpfs.c
diff -u src/sys/rump/librump/rumpvfs/rumpfs.c:1.68 src/sys/rump/librump/rumpvfs/rumpfs.c:1.69
--- src/sys/rump/librump/rumpvfs/rumpfs.c:1.68	Thu Nov 11 15:05:54 2010
+++ src/sys/rump/librump/rumpvfs/rumpfs.c	Thu Nov 11 16:01:59 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpfs.c,v 1.68 2010/11/11 15:05:54 pooka Exp $	*/
+/*	$NetBSD: rumpfs.c,v 1.69 2010/11/11 16:01:59 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009  Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.68 2010/11/11 15:05:54 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.69 2010/11/11 16:01:59 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -98,6 +98,7 @@
 	{ &vop_read_desc, rump_vop_read },
 	{ &vop_write_desc, rump_vop_write },
 	{ &vop_open_desc, rump_vop_open },
+	{ &vop_close_desc, genfs_nullop },
 	{ &vop_seek_desc, genfs_seek },
 	{ &vop_getpages_desc, genfs_getpages },
 	{ &vop_putpages_desc, genfs_putpages },
@@ -183,6 +184,7 @@
 #define RUMPNODE_CANRECLAIM	0x01
 #define RUMPNODE_DIR_ET		0x02
 #define RUMPNODE_DIR_ETSUBS	0x04
+#define RUMPNODE_ET_PHONE_HOST	0x10
 
 struct rumpfs_mount {
 	struct vnode *rfsmp_rvp;
@@ -339,6 +341,8 @@
 	et->et_removing = false;
 	et->et_blkmin = dmin;
 
+	rn->rn_flags |= RUMPNODE_ET_PHONE_HOST;
+
 	if (ftype == RUMP_ETFS_REG || REGDIR(ftype) || et->et_blkmin != -1) {
 		size_t len = strlen(hostpath)+1;
 
@@ -947,7 +951,7 @@
 	int mode = ap->a_mode;
 	int error = EINVAL;
 
-	if (vp->v_type != VREG || rn->rn_hostpath == NULL)
+	if (vp->v_type != VREG || (rn->rn_flags & RUMPNODE_ET_PHONE_HOST) == 0)
 		return 0;
 
 	if (mode & FREAD) {
@@ -1126,7 +1130,7 @@
 	struct rumpfs_node *rn = vp->v_data;
 	int error;
 
-	if (vp->v_type == VREG) {
+	if (rn->rn_flags & RUMPNODE_ET_PHONE_HOST && vp->v_type == VREG) {
 		if (rn->rn_readfd != -1) {
 			rumpuser_close(rn->rn_readfd, &error);
 			rn->rn_readfd = -1;
@@ -1137,7 +1141,7 @@
 		}
 	}
 	*ap->a_recycle = (rn->rn_flags & RUMPNODE_CANRECLAIM) ? true : false;
-		
+
 	VOP_UNLOCK(vp);
 	return 0;
 }
@@ -1222,22 +1226,62 @@
 	/* vfs_list */
 };
 
+static int
+rumpfs_mountfs(struct mount *mp)
+{
+	struct rumpfs_mount *rfsmp;
+	struct rumpfs_node *rn;
+	int error;
+
+	rfsmp = kmem_alloc(sizeof(*rfsmp), KM_SLEEP);
+
+	rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
+	rn->rn_parent = rn;
+	if ((error = makevnode(mp, rn, &rfsmp->rfsmp_rvp)) != 0)
+		return error;
+
+	rfsmp->rfsmp_rvp->v_vflag |= VV_ROOT;
+	VOP_UNLOCK(rfsmp->rfsmp_rvp);
+
+	mp->mnt_data = rfsmp;
+	mp->mnt_stat.f_namemax = MAXNAMLEN;
+	mp->mnt_stat.f_iosize = 512;
+	mp->mnt_flag |= MNT_LOCAL;
+	mp->mnt_iflag |= IMNT_MPSAFE;
+	vfs_getnewfsid(mp);
+
+	return 0;
+}
+
 int
 rumpfs_mount(struct mount *mp, const char *mntpath, void *arg, size_t *alen)
 {
+	int error;
 
-	return EOPNOTSUPP;
+	error = set_statvfs_info(mntpath, UIO_USERSPACE, "rumpfs", UIO_SYSSPACE,
+	    mp->mnt_op->vfs_name, mp, curlwp);
+	if (error)
+		return error;
+
+	return rumpfs_mountfs(mp);
 }
 
 int
-rumpfs_unmount(struct mount *mp, int flags)
+rumpfs_unmount(struct mount *mp, int mntflags)
 {
+	struct rumpfs_mount *rfsmp = mp->mnt_data;
+	int flags = 0, error;
 
-	/* if going for it, just lie about it */
-	if (panicstr)
-		return 0;
+	if (panicstr || mntflags & MNT_FORCE)
+		flags |= FORCECLOSE;
 
-	return EOPNOTSUPP; /* ;) */
+	if ((error = vflush(mp, rfsmp->rfsmp_rvp, flags)) != 0)
+		return error;
+	vgone(rfsmp->rfsmp_rvp); /* XXX */
+
+	kmem_free(rfsmp, sizeof(*rfsmp));
+
+	return 0;
 }
 
 int
@@ -1280,8 +1324,6 @@
 rumpfs_mountroot()
 {
 	struct mount *mp;
-	struct rumpfs_mount *rfsmp;
-	struct rumpfs_node *rn;
 	int error;
 
 	if ((error = vfs_rootmountalloc(MOUNT_RUMPFS, "rootdev", &mp)) != 0) {
@@ -1289,31 +1331,17 @@
 		return error;
 	}
 
-	rfsmp = kmem_alloc(sizeof(*rfsmp), KM_SLEEP);
-
-	rn = makeprivate(VDIR, NODEV, DEV_BSIZE);
-	rn->rn_parent = rn;
-	error = makevnode(mp, rn, &rfsmp->rfsmp_rvp);
-	if (error)
-		panic("could not create root vnode: %d", error);
-	rfsmp->rfsmp_rvp->v_vflag |= VV_ROOT;
-	VOP_UNLOCK(rfsmp->rfsmp_rvp);
+	if ((error = rumpfs_mountfs(mp)) != 0)
+		panic("mounting rootfs failed: %d", error);
 
 	mutex_enter(&mountlist_lock);
 	CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
 	mutex_exit(&mountlist_lock);
 
-	mp->mnt_data = rfsmp;
-	mp->mnt_stat.f_namemax = MAXNAMLEN;
-	mp->mnt_stat.f_iosize = 512;
-	mp->mnt_flag |= MNT_LOCAL;
-	mp->mnt_iflag |= IMNT_MPSAFE;
-	vfs_getnewfsid(mp);
-
 	error = set_statvfs_info("/", UIO_SYSSPACE, "rumpfs", UIO_SYSSPACE,
 	    mp->mnt_op->vfs_name, mp, curlwp);
 	if (error)
-		panic("set statvfsinfo for rootfs failed");
+		panic("set_statvfs_info failed for rootfs: %d", error);
 
 	vfs_unbusy(mp, false, NULL);
 

Reply via email to