Module Name:    src
Committed By:   hannken
Date:           Fri Dec 26 15:23:21 UTC 2014

Modified Files:
        src/sys/fs/sysvbfs: sysvbfs.c sysvbfs.h sysvbfs_vfsops.c
            sysvbfs_vnops.c

Log Message:
Change sysvbfs to vcache.


To generate a diff of this commit:
cvs rdiff -u -r1.14 -r1.15 src/sys/fs/sysvbfs/sysvbfs.c
cvs rdiff -u -r1.9 -r1.10 src/sys/fs/sysvbfs/sysvbfs.h
cvs rdiff -u -r1.44 -r1.45 src/sys/fs/sysvbfs/sysvbfs_vfsops.c
cvs rdiff -u -r1.55 -r1.56 src/sys/fs/sysvbfs/sysvbfs_vnops.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/fs/sysvbfs/sysvbfs.c
diff -u src/sys/fs/sysvbfs/sysvbfs.c:1.14 src/sys/fs/sysvbfs/sysvbfs.c:1.15
--- src/sys/fs/sysvbfs/sysvbfs.c:1.14	Fri Jul 25 08:20:52 2014
+++ src/sys/fs/sysvbfs/sysvbfs.c	Fri Dec 26 15:23:21 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs.c,v 1.14 2014/07/25 08:20:52 dholland Exp $	*/
+/*	$NetBSD: sysvbfs.c,v 1.15 2014/12/26 15:23:21 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs.c,v 1.14 2014/07/25 08:20:52 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs.c,v 1.15 2014/12/26 15:23:21 hannken Exp $");
 
 #include <sys/resource.h>
 #include <sys/param.h>
@@ -121,6 +121,7 @@ struct vfsops sysvbfs_vfsops = {
 	.vfs_statvfs = sysvbfs_statvfs,
 	.vfs_sync = sysvbfs_sync,
 	.vfs_vget = sysvbfs_vget,
+	.vfs_loadvnode = sysvbfs_loadvnode,
 	.vfs_fhtovp = sysvbfs_fhtovp,
 	.vfs_vptofh = sysvbfs_vptofh,
 	.vfs_init = sysvbfs_init,

Index: src/sys/fs/sysvbfs/sysvbfs.h
diff -u src/sys/fs/sysvbfs/sysvbfs.h:1.9 src/sys/fs/sysvbfs/sysvbfs.h:1.10
--- src/sys/fs/sysvbfs/sysvbfs.h:1.9	Thu May 27 23:40:12 2010
+++ src/sys/fs/sysvbfs/sysvbfs.h	Fri Dec 26 15:23:21 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs.h,v 1.9 2010/05/27 23:40:12 pooka Exp $	*/
+/*	$NetBSD: sysvbfs.h,v 1.10 2014/12/26 15:23:21 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -53,15 +53,12 @@ struct sysvbfs_node {
 	int update_atime;
 	int update_mtime;
 	int removed;
-
-	LIST_ENTRY(sysvbfs_node) link;
 };
 
 struct sysvbfs_mount {
 	struct mount *mountp;
 	struct vnode *devvp;		/* block device mounted vnode */
 	struct bfs *bfs;
-	LIST_HEAD(, sysvbfs_node) bnode_head;
 };
 
 /* v-node ops. */

Index: src/sys/fs/sysvbfs/sysvbfs_vfsops.c
diff -u src/sys/fs/sysvbfs/sysvbfs_vfsops.c:1.44 src/sys/fs/sysvbfs/sysvbfs_vfsops.c:1.45
--- src/sys/fs/sysvbfs/sysvbfs_vfsops.c:1.44	Sun Dec  7 23:48:04 2014
+++ src/sys/fs/sysvbfs/sysvbfs_vfsops.c	Fri Dec 26 15:23:21 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs_vfsops.c,v 1.44 2014/12/07 23:48:04 justin Exp $	*/
+/*	$NetBSD: sysvbfs_vfsops.c,v 1.45 2014/12/26 15:23:21 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vfsops.c,v 1.44 2014/12/07 23:48:04 justin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vfsops.c,v 1.45 2014/12/26 15:23:21 hannken Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -189,7 +189,6 @@ sysvbfs_mountfs(struct vnode *devvp, str
 		VOP_CLOSE(devvp, oflags, NOCRED);
 		goto out;
 	}
-	LIST_INIT(&bmp->bnode_head);
 
 	mp->mnt_data = bmp;
 	mp->mnt_stat.f_fsidx.__fsid_val[0] = (long)devvp->v_rdev;
@@ -289,89 +288,58 @@ sysvbfs_statvfs(struct mount *mp, struct
 int
 sysvbfs_sync(struct mount *mp, int waitfor, kauth_cred_t cred)
 {
-	struct sysvbfs_mount *bmp = mp->mnt_data;
-	struct sysvbfs_node *bnode;
-	struct vnode *v;
+	struct vnode_iterator *marker;
+	struct vnode *vp;
 	int err, error;
 
 	DPRINTF("%s:\n", __func__);
 	error = 0;
-	mutex_enter(&mntvnode_lock);
-	for (bnode = LIST_FIRST(&bmp->bnode_head); bnode != NULL;
-	    bnode = LIST_NEXT(bnode, link)) {
-		v = bnode->vnode;
-	    	mutex_enter(v->v_interlock);
-		mutex_exit(&mntvnode_lock);
-		err = vget(v, LK_EXCLUSIVE | LK_NOWAIT);
-		if (err == 0) {
-			err = VOP_FSYNC(v, cred, FSYNC_WAIT, 0, 0);
-			vput(v);
+	vfs_vnode_iterator_init(mp, &marker);
+	while ((vp = vfs_vnode_iterator_next(marker, NULL, NULL)) != NULL) {
+		err = vn_lock(vp, LK_EXCLUSIVE);
+		if (err) {
+			vrele(vp);
+			continue;
 		}
+		err = VOP_FSYNC(vp, cred, FSYNC_WAIT, 0, 0);
+		vput(vp);
 		if (err != 0)
 			error = err;
-		mutex_enter(&mntvnode_lock);
 	}
-	mutex_exit(&mntvnode_lock);
+	vfs_vnode_iterator_destroy(marker);
 
 	return error;
 }
 
 int
-sysvbfs_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
+sysvbfs_loadvnode(struct mount *mp, struct vnode *vp,
+    const void *key, size_t key_len, const void **new_key)
 {
-	struct sysvbfs_mount *bmp = mp->mnt_data;
-	struct bfs *bfs = bmp->bfs;
-	struct vnode *vp;
+	struct sysvbfs_mount *bmp;
+	struct bfs *bfs;
 	struct sysvbfs_node *bnode;
 	struct bfs_inode *inode;
-	int error;
+	uint16_t ino;
+
+	KASSERT(key_len == sizeof(ino));
+	memcpy(&ino, key, key_len);
+
+	DPRINTF("%s: i-node=%u\n", __func__, ino);
+
+	bmp = mp->mnt_data;
+	bfs = bmp->bfs;
 
-	DPRINTF("%s: i-node=%lld\n", __func__, (long long)ino);
 	/* Lookup requested i-node */
 	if (!bfs_inode_lookup(bfs, ino, &inode)) {
 		DPRINTF("%s: bfs_inode_lookup failed.\n", __func__);
 		return ENOENT;
 	}
 
- retry:
-	mutex_enter(&mntvnode_lock);
-	for (bnode = LIST_FIRST(&bmp->bnode_head); bnode != NULL;
-	    bnode = LIST_NEXT(bnode, link)) {
-		if (bnode->inode->number == ino) {
-			vp = bnode->vnode;
-			mutex_enter(vp->v_interlock);
-			mutex_exit(&mntvnode_lock);
-			if (vget(vp, LK_EXCLUSIVE) == 0) {
-				*vpp = vp;
-				return 0;
-			} else {
-				goto retry;
-			}
-		}
-	}
-	mutex_exit(&mntvnode_lock);
-
-	/* Allocate v-node. */
-	error = getnewvnode(VT_SYSVBFS, mp, sysvbfs_vnodeop_p, NULL, &vp);
-	if (error) {
-		DPRINTF("%s: getnewvnode error.\n", __func__);
-		return error;
-	}
-	/* Lock vnode here */
-	vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
-
-	/* Allocate i-node */
-	vp->v_data = pool_get(&sysvbfs_node_pool, PR_WAITOK);
-	memset(vp->v_data, 0, sizeof(struct sysvbfs_node));
-	bnode = vp->v_data;
-	mutex_enter(&mntvnode_lock);
-	LIST_INSERT_HEAD(&bmp->bnode_head, bnode, link);
-	mutex_exit(&mntvnode_lock);
-	bnode->vnode = vp;
-	bnode->bmp = bmp;
-	bnode->inode = inode;
-	bnode->lockf = NULL; /* advlock */
+	bnode = pool_get(&sysvbfs_node_pool, PR_WAITOK);
 
+	vp->v_tag = VT_SYSVBFS;
+	vp->v_op = sysvbfs_vnodeop_p;
+	vp->v_data = bnode;
 	if (ino == BFS_ROOT_INODE) {	/* BFS is flat filesystem */
 		vp->v_type = VDIR;
 		vp->v_vflag |= VV_ROOT;
@@ -379,8 +347,40 @@ sysvbfs_vget(struct mount *mp, ino_t ino
 		vp->v_type = VREG;
 	}
 
+	bnode->vnode = vp;
+	bnode->bmp = bmp;
+	bnode->inode = inode;
+	bnode->lockf = NULL; /* advlock */
+
 	genfs_node_init(vp, &sysvbfs_genfsops);
 	uvm_vnp_setsize(vp, bfs_file_size(inode));
+
+	*new_key = &bnode->inode->number;
+
+	return 0;
+}
+
+int
+sysvbfs_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
+{
+	int error;
+	uint16_t number;
+	struct vnode *vp;
+
+	KASSERT(ino <= UINT16_MAX);
+	number = ino;
+
+	DPRINTF("%s: i-node=%u\n", __func__, number);
+
+	error = vcache_get(mp, &number, sizeof(number), &vp);
+	if (error)
+		return error;
+	error = vn_lock(vp, LK_EXCLUSIVE);
+	if (error) {
+		vrele(vp);
+		return error;
+	}
+
 	*vpp = vp;
 
 	return 0;

Index: src/sys/fs/sysvbfs/sysvbfs_vnops.c
diff -u src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.55 src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.56
--- src/sys/fs/sysvbfs/sysvbfs_vnops.c:1.55	Fri Dec 26 15:22:15 2014
+++ src/sys/fs/sysvbfs/sysvbfs_vnops.c	Fri Dec 26 15:23:21 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysvbfs_vnops.c,v 1.55 2014/12/26 15:22:15 hannken Exp $	*/
+/*	$NetBSD: sysvbfs_vnops.c,v 1.56 2014/12/26 15:23:21 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.55 2014/12/26 15:22:15 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sysvbfs_vnops.c,v 1.56 2014/12/26 15:23:21 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -697,13 +697,13 @@ sysvbfs_reclaim(void *v)
 	struct bfs *bfs = bnode->bmp->bfs;
 
 	DPRINTF("%s:\n", __func__);
+
+	vcache_remove(vp->v_mount,
+	    &bnode->inode->number, sizeof(bnode->inode->number));
 	if (bnode->removed) {
 		if (bfs_inode_delete(bfs, bnode->inode->number) != 0)
 			DPRINTF("%s: delete inode failed\n", __func__);
 	}
-	mutex_enter(&mntvnode_lock);
-	LIST_REMOVE(bnode, link);
-	mutex_exit(&mntvnode_lock);
 	genfs_node_destroy(vp);
 	pool_put(&sysvbfs_node_pool, bnode);
 	vp->v_data = NULL;

Reply via email to