diff options
| author | hannken <hannken@NetBSD.org> | 2014-12-26 15:23:21 +0000 |
|---|---|---|
| committer | hannken <hannken@NetBSD.org> | 2014-12-26 15:23:21 +0000 |
| commit | 9ab44bf5879bb3aeb4d27ca5bf832b32b005db93 (patch) | |
| tree | a4dccf51834f18083cfd10038840d4f307e5944d /sys/fs/sysvbfs | |
| parent | 86795a1b01290bb6e2661ee6bdce6274ad4923d7 (diff) | |
Change sysvbfs to vcache.
Diffstat (limited to 'sys/fs/sysvbfs')
| -rw-r--r-- | sys/fs/sysvbfs/sysvbfs.c | 5 | ||||
| -rw-r--r-- | sys/fs/sysvbfs/sysvbfs.h | 5 | ||||
| -rw-r--r-- | sys/fs/sysvbfs/sysvbfs_vfsops.c | 124 | ||||
| -rw-r--r-- | sys/fs/sysvbfs/sysvbfs_vnops.c | 10 |
4 files changed, 71 insertions, 73 deletions
diff --git a/sys/fs/sysvbfs/sysvbfs.c b/sys/fs/sysvbfs/sysvbfs.c index b6fdd9cc344..3eb1a18e312 100644 --- a/sys/fs/sysvbfs/sysvbfs.c +++ b/sys/fs/sysvbfs/sysvbfs.c @@ -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, diff --git a/sys/fs/sysvbfs/sysvbfs.h b/sys/fs/sysvbfs/sysvbfs.h index ed3ccb446ac..77cbd1a1082 100644 --- a/sys/fs/sysvbfs/sysvbfs.h +++ b/sys/fs/sysvbfs/sysvbfs.h @@ -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. */ diff --git a/sys/fs/sysvbfs/sysvbfs_vfsops.c b/sys/fs/sysvbfs/sysvbfs_vfsops.c index c891b0f630b..a4380870a36 100644 --- a/sys/fs/sysvbfs/sysvbfs_vfsops.c +++ b/sys/fs/sysvbfs/sysvbfs_vfsops.c @@ -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, struct mount *mp, struct lwp *l) 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 statvfs *f) 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, struct vnode **vpp) 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; diff --git a/sys/fs/sysvbfs/sysvbfs_vnops.c b/sys/fs/sysvbfs/sysvbfs_vnops.c index 91c23b15aa0..64e57bcefd3 100644 --- a/sys/fs/sysvbfs/sysvbfs_vnops.c +++ b/sys/fs/sysvbfs/sysvbfs_vnops.c @@ -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; |
