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)