aboutsummaryrefslogtreecommitdiff
path: root/sys/ufs
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>2005-03-14 10:21:16 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>2005-03-14 10:21:16 +0000
commit14bc0685ac4ab830413ad874b80dc9c2b9a3bd65 (patch)
tree1f2f90e3bd98ec078fdcb18aea036502e68476af /sys/ufs
parent6c325a2a21b30c878cac1c633e90fc3f79dff99a (diff)
downloadsrc-14bc0685ac4ab830413ad874b80dc9c2b9a3bd65.tar.gz
src-14bc0685ac4ab830413ad874b80dc9c2b9a3bd65.zip
Use vfs_hash instead of home-rolled.
Notes
Notes: svn path=/head/; revision=143562
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c23
-rw-r--r--sys/ufs/ufs/inode.h2
-rw-r--r--sys/ufs/ufs/ufs_extern.h5
-rw-r--r--sys/ufs/ufs/ufs_ihash.c170
-rw-r--r--sys/ufs/ufs/ufs_inode.c2
-rw-r--r--sys/ufs/ufs/ufs_vfsops.c2
6 files changed, 13 insertions, 191 deletions
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index 23575e3daf72..c551efba3997 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -1173,9 +1173,11 @@ ffs_vget(mp, ino, flags, vpp)
struct cdev *dev;
int error;
- ump = VFSTOUFS(mp);
- dev = ump->um_dev;
- fs = ump->um_fs;
+ error = vfs_hash_get(mp, ino, flags, curthread, vpp);
+ if (error)
+ return (error);
+ if (*vpp != NULL)
+ return (0);
/*
* We do not lock vnode creation as it is believed to be too
@@ -1183,10 +1185,10 @@ ffs_vget(mp, ino, flags, vpp)
* for same ino by different processes. We just allow them to race
* and check later to decide who wins. Let the race begin!
*/
- if ((error = ufs_ihashget(dev, ino, flags, vpp)) != 0)
- return (error);
- if (*vpp != NULL)
- return (0);
+
+ ump = VFSTOUFS(mp);
+ dev = ump->um_dev;
+ fs = ump->um_fs;
/*
* If this MALLOC() is performed after the getnewvnode()
@@ -1195,7 +1197,7 @@ ffs_vget(mp, ino, flags, vpp)
* which will cause a panic because ffs_sync() blindly
* dereferences vp->v_data (as well it should).
*/
- ip = uma_zalloc(uma_inode, M_WAITOK);
+ ip = uma_zalloc(uma_inode, M_WAITOK | M_ZERO);
/* Allocate a new vnode/inode. */
if (fs->fs_magic == FS_UFS1_MAGIC)
@@ -1207,7 +1209,6 @@ ffs_vget(mp, ino, flags, vpp)
uma_zfree(uma_inode, ip);
return (error);
}
- bzero((caddr_t)ip, sizeof(struct inode));
/*
* FFS supports recursive locking.
*/
@@ -1234,11 +1235,11 @@ ffs_vget(mp, ino, flags, vpp)
lockmgr(vp->v_vnlock, LK_EXCLUSIVE, (struct mtx *)0, td);
/*
- * Atomicaly (in terms of ufs_hash operations) check the hash for
+ * Atomicaly (in terms of vfs_hash operations) check the hash for
* duplicate of vnode being created and add it to the hash. If a
* duplicate vnode was found, it will be vget()ed from hash for us.
*/
- if ((error = ufs_ihashins(ip, flags, vpp)) != 0) {
+ if ((error = vfs_hash_insert(vp, ino, flags, curthread, vpp)) != 0) {
vput(vp);
*vpp = NULL;
return (error);
diff --git a/sys/ufs/ufs/inode.h b/sys/ufs/ufs/inode.h
index 8fcfe7a9ae36..0417f9c7cdc5 100644
--- a/sys/ufs/ufs/inode.h
+++ b/sys/ufs/ufs/inode.h
@@ -57,7 +57,6 @@
* active, and is put back when the file is no longer being used.
*/
struct inode {
- LIST_ENTRY(inode) i_hash;/* Hash chain. */
TAILQ_ENTRY(inode) i_nextsnap; /* snapshot file list. */
struct vnode *i_vnode;/* Vnode associated with this inode. */
struct ufsmount *i_ump;/* Ufsmount point associated with this inode. */
@@ -118,7 +117,6 @@ struct inode {
#define IN_UPDATE 0x0004 /* Modification time update request. */
#define IN_MODIFIED 0x0008 /* Inode has been modified. */
#define IN_RENAME 0x0010 /* Inode is being renamed. */
-#define IN_HASHED 0x0020 /* Inode is on hash list */
#define IN_LAZYMOD 0x0040 /* Modified, but don't write yet. */
#define IN_SPACECOUNTED 0x0080 /* Blocks to be freed in free count. */
diff --git a/sys/ufs/ufs/ufs_extern.h b/sys/ufs/ufs/ufs_extern.h
index e6a7c42b3d15..40a659dfdac6 100644
--- a/sys/ufs/ufs/ufs_extern.h
+++ b/sys/ufs/ufs/ufs_extern.h
@@ -71,11 +71,6 @@ int ufs_direnter(struct vnode *, struct vnode *, struct direct *,
int ufs_dirremove(struct vnode *, struct inode *, int, int);
int ufs_dirrewrite(struct inode *, struct inode *, ino_t, int, int);
int ufs_getlbns(struct vnode *, ufs2_daddr_t, struct indir *, int *);
-int ufs_ihashget(struct cdev *, ino_t, int, struct vnode **);
-void ufs_ihashinit(void);
-int ufs_ihashins(struct inode *, int, struct vnode **);
-void ufs_ihashrem(struct inode *);
-void ufs_ihashuninit(void);
int ufs_inactive(struct vop_inactive_args *);
int ufs_init(struct vfsconf *);
void ufs_itimes(struct vnode *vp);
diff --git a/sys/ufs/ufs/ufs_ihash.c b/sys/ufs/ufs/ufs_ihash.c
deleted file mode 100644
index 81c4e2ed0f6c..000000000000
--- a/sys/ufs/ufs/ufs_ihash.c
+++ /dev/null
@@ -1,170 +0,0 @@
-/*-
- * Copyright (c) 1982, 1986, 1989, 1991, 1993, 1995
- * The Regents of the University of California. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * @(#)ufs_ihash.c 8.7 (Berkeley) 5/17/95
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/kernel.h>
-#include <sys/lock.h>
-#include <sys/vnode.h>
-#include <sys/malloc.h>
-#include <sys/proc.h>
-#include <sys/mutex.h>
-#include <sys/mount.h>
-
-#include <ufs/ufs/quota.h>
-#include <ufs/ufs/inode.h>
-#include <ufs/ufs/ufs_extern.h>
-
-static MALLOC_DEFINE(M_UFSIHASH, "UFS ihash", "UFS Inode hash tables");
-/*
- * Structures associated with inode cacheing.
- */
-static LIST_HEAD(ihashhead, inode) *ihashtbl;
-static u_long ihash; /* size of hash table - 1 */
-#define INOHASH(device, inum) (&ihashtbl[(minor(device) + (inum)) & ihash])
-static struct mtx ufs_ihash_mtx;
-
-/*
- * Initialize inode hash table.
- */
-void
-ufs_ihashinit()
-{
-
- ihashtbl = hashinit(desiredvnodes, M_UFSIHASH, &ihash);
- mtx_init(&ufs_ihash_mtx, "ufs ihash", NULL, MTX_DEF);
-}
-
-/*
- * Destroy the inode hash table.
- */
-void
-ufs_ihashuninit()
-{
-
- hashdestroy(ihashtbl, M_UFSIHASH, ihash);
- mtx_destroy(&ufs_ihash_mtx);
-}
-
-/*
- * Use the device/inum pair to find the incore inode, and return a pointer
- * to it. If it is in core, but locked, wait for it.
- */
-int
-ufs_ihashget(dev, inum, flags, vpp)
- struct cdev *dev;
- ino_t inum;
- int flags;
- struct vnode **vpp;
-{
- struct thread *td = curthread; /* XXX */
- struct inode *ip;
- struct vnode *vp;
- int error;
-
- *vpp = NULL;
-loop:
- mtx_lock(&ufs_ihash_mtx);
- LIST_FOREACH(ip, INOHASH(dev, inum), i_hash) {
- if (inum == ip->i_number && dev == ip->i_dev) {
- vp = ITOV(ip);
- VI_LOCK(vp);
- mtx_unlock(&ufs_ihash_mtx);
- error = vget(vp, flags | LK_INTERLOCK, td);
- if (error == ENOENT)
- goto loop;
- if (error)
- return (error);
- *vpp = vp;
- return (0);
- }
- }
- mtx_unlock(&ufs_ihash_mtx);
- return (0);
-}
-
-/*
- * Check hash for duplicate of passed inode, and add if there is no one.
- * if there is a duplicate, vget() it and return to the caller.
- */
-int
-ufs_ihashins(ip, flags, ovpp)
- struct inode *ip;
- int flags;
- struct vnode **ovpp;
-{
- struct thread *td = curthread; /* XXX */
- struct ihashhead *ipp;
- struct inode *oip;
- struct vnode *ovp;
- int error;
-
-loop:
- mtx_lock(&ufs_ihash_mtx);
- ipp = INOHASH(ip->i_dev, ip->i_number);
- LIST_FOREACH(oip, ipp, i_hash) {
- if (ip->i_number == oip->i_number && ip->i_dev == oip->i_dev) {
- ovp = ITOV(oip);
- VI_LOCK(ovp);
- mtx_unlock(&ufs_ihash_mtx);
- error = vget(ovp, flags | LK_INTERLOCK, td);
- if (error == ENOENT)
- goto loop;
- if (error)
- return (error);
- *ovpp = ovp;
- return (0);
- }
- }
- LIST_INSERT_HEAD(ipp, ip, i_hash);
- ip->i_flag |= IN_HASHED;
- mtx_unlock(&ufs_ihash_mtx);
- *ovpp = NULL;
- return (0);
-}
-
-/*
- * Remove the inode from the hash table.
- */
-void
-ufs_ihashrem(ip)
- struct inode *ip;
-{
- mtx_lock(&ufs_ihash_mtx);
- if (ip->i_flag & IN_HASHED) {
- ip->i_flag &= ~IN_HASHED;
- LIST_REMOVE(ip, i_hash);
- }
- mtx_unlock(&ufs_ihash_mtx);
-}
diff --git a/sys/ufs/ufs/ufs_inode.c b/sys/ufs/ufs/ufs_inode.c
index 6cce782230f9..b3d6638c2364 100644
--- a/sys/ufs/ufs/ufs_inode.c
+++ b/sys/ufs/ufs/ufs_inode.c
@@ -156,7 +156,7 @@ ufs_reclaim(ap)
/*
* Remove the inode from its hash chain.
*/
- ufs_ihashrem(ip);
+ vfs_hash_remove(vp);
/*
* Purge old data structures associated with the inode.
*/
diff --git a/sys/ufs/ufs/ufs_vfsops.c b/sys/ufs/ufs/ufs_vfsops.c
index c84ebf9a9554..31a73bae588b 100644
--- a/sys/ufs/ufs/ufs_vfsops.c
+++ b/sys/ufs/ufs/ufs_vfsops.c
@@ -149,7 +149,6 @@ ufs_init(vfsp)
struct vfsconf *vfsp;
{
- ufs_ihashinit();
#ifdef QUOTA
dqinit();
#endif
@@ -167,7 +166,6 @@ ufs_uninit(vfsp)
struct vfsconf *vfsp;
{
- ufs_ihashuninit();
#ifdef QUOTA
dquninit();
#endif