Module Name:    src
Committed By:   pooka
Date:           Thu Apr 16 17:50:02 UTC 2009

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

Log Message:
Allocate vnodes properly with getnewvnode() and support reclaim.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 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.11 src/sys/rump/librump/rumpvfs/rumpfs.c:1.12
--- src/sys/rump/librump/rumpvfs/rumpfs.c:1.11	Tue Apr  7 18:35:49 2009
+++ src/sys/rump/librump/rumpvfs/rumpfs.c	Thu Apr 16 17:50:02 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpfs.c,v 1.11 2009/04/07 18:35:49 pooka Exp $	*/
+/*	$NetBSD: rumpfs.c,v 1.12 2009/04/16 17:50:02 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.11 2009/04/07 18:35:49 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpfs.c,v 1.12 2009/04/16 17:50:02 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/mount.h>
@@ -55,6 +55,7 @@
 
 static int rump_vop_lookup(void *);
 static int rump_vop_getattr(void *);
+static int rump_vop_reclaim(void *);
 static int rump_vop_success(void *);
 
 int (**dead_vnodeop_p)(void *);
@@ -82,6 +83,7 @@
 	{ &vop_fsync_desc, rump_vop_success },
 	{ &vop_lock_desc, genfs_lock },
 	{ &vop_unlock_desc, genfs_unlock },
+	{ &vop_reclaim_desc, rump_vop_reclaim },
 	{ NULL, NULL }
 };
 const struct vnodeopv_desc rump_vnodeop_opv_desc =
@@ -130,44 +132,36 @@
 rump_makevnode(const char *path, size_t size, enum vtype vt, struct vnode **vpp)
 {
 	struct vnode *vp;
+	int (**vpops)(void *);
 	int rv;
 
-	vp = kmem_alloc(sizeof(struct vnode), KM_SLEEP);
+	if (vt == VREG || vt == VCHR) {
+		vt = VBLK;
+		vpops = spec_vnodeop_p;
+	} else {
+		vpops = rump_vnodeop_p;
+	}
+	if (vt != VBLK && vt != VDIR)
+		panic("rump_makevnode: only VBLK/VDIR vnodes supported");
+
+	rv = getnewvnode(VT_RUMP, &rump_mnt, vpops, &vp);
+	if (rv)
+		return rv;
+
 	vp->v_size = vp->v_writesize = size;
 	vp->v_type = vt;
-	if (vp->v_type == VREG || vp->v_type == VCHR)
-		vp->v_type = VBLK;
-
-	if (vp->v_type != VBLK && vp->v_type != VDIR)
-		panic("rump_makevnode: only VBLK/VDIR vnodes supported");
 
 	if (vp->v_type == VBLK) {
 		rv = rumpblk_register(path);
-		if (rv == -1) {
-			rv = EINVAL;
-			goto bad;
-		}
+		if (rv == -1)
+			panic("rump_makevnode: lazy bum");
 		spec_node_init(vp, makedev(RUMPBLK, rv));
-		vp->v_op = spec_vnodeop_p;
-	} else {
-		vp->v_op = rump_vnodeop_p;
 	}
-	vp->v_tag = VT_RUMP;
-	vp->v_mount = &rump_mnt;
-	vp->v_vnlock = &vp->v_lock;
-	vp->v_usecount = 1;
-	vp->v_data = makevattr(vp->v_type);
-	mutex_init(&vp->v_interlock, MUTEX_DEFAULT, IPL_NONE);
-	memset(&vp->v_lock, 0, sizeof(vp->v_lock));
-	rw_init(&vp->v_lock.vl_lock);
-	cv_init(&vp->v_cv, "vnode");
+	if (vt != VBLK)
+		vp->v_data = makevattr(vp->v_type);
 	*vpp = vp;
 
 	return 0;
-
- bad:
-	kmem_free(vp, sizeof(*vp));
-	return rv;
 }
 
 /*
@@ -244,11 +238,30 @@
 	return 0;
 }
 
+static int
+rump_vop_reclaim(void *v)
+{
+	struct vop_reclaim_args /* {
+		struct vnode *a_vp;
+	} */ *ap = v;
+	struct vnode *vp = ap->a_vp;
+
+	kmem_free(vp->v_data, sizeof(struct vattr));
+	vp->v_data = NULL;
+
+	return 0;
+}
+
 void
 rumpfs_init(void)
 {
 	int rv;
 
+	/* XXX: init properly instead of this crap */
+	rump_mnt.mnt_refcnt = 1;
+	rw_init(&rump_mnt.mnt_unmounting);
+	TAILQ_INIT(&rump_mnt.mnt_vnodelist);
+
 	vfs_opv_init(rump_opv_descs);
 	rv = rump_makevnode("/", 0, VDIR, &rootvnode);
 	if (rv)

Reply via email to