The ufs dirhash code has been mutex ready since introduction.
Index: dirhash.h
===================================================================
RCS file: /home/tedu/cvs/src/sys/ufs/ufs/dirhash.h,v
retrieving revision 1.4
diff -u -r1.4 dirhash.h
--- dirhash.h 29 Apr 2006 23:09:45 -0000 1.4
+++ dirhash.h 24 Apr 2010 00:56:43 -0000
@@ -29,7 +29,7 @@
#ifndef _UFS_UFS_DIRHASH_H_
#define _UFS_UFS_DIRHASH_H_
-#include <sys/rwlock.h>
+#include <sys/mutex.h>
/*
* For fast operations on large directories, we maintain a hash
@@ -83,6 +83,7 @@
((dh)->dh_hash[(slot) >> DH_BLKOFFSHIFT][(slot) & DH_BLKOFFMASK])
struct dirhash {
+ struct mutex dh_mtx; /* protects all fields except dh_list */
doff_t **dh_hash; /* the hash array (2-level) */
int dh_narrays; /* number of entries in dh_hash */
int dh_hlen; /* total slots in the 2-level hash array */
Index: ufs_dirhash.c
===================================================================
RCS file: /home/tedu/cvs/src/sys/ufs/ufs/ufs_dirhash.c,v
retrieving revision 1.21
diff -u -r1.21 ufs_dirhash.c
--- ufs_dirhash.c 20 Aug 2009 19:18:05 -0000 1.21
+++ ufs_dirhash.c 24 Apr 2010 01:00:38 -0000
@@ -36,7 +36,6 @@
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/lock.h>
-#include <sys/rwlock.h>
#include <sys/malloc.h>
#include <sys/pool.h>
#include <sys/proc.h>
@@ -45,6 +44,7 @@
#include <sys/mount.h>
#include <sys/sysctl.h>
#include <sys/hash.h>
+#include <sys/mutex.h>
#include <ufs/ufs/quota.h>
#include <ufs/ufs/inode.h>
@@ -74,10 +74,10 @@
struct pool ufsdirhash_pool;
-#define DIRHASHLIST_LOCK()
-#define DIRHASHLIST_UNLOCK()
-#define DIRHASH_LOCK(dh)
-#define DIRHASH_UNLOCK(dh)
+#define DIRHASHLIST_LOCK() mtx_enter(&ufsdirhash_mtx)
+#define DIRHASHLIST_UNLOCK() mtx_leave(&ufsdirhash_mtx)
+#define DIRHASH_LOCK(dh) mtx_enter(&(dh)->dh_mtx)
+#define DIRHASH_UNLOCK(dh) mtx_leave(&(dh)->dh_mtx)
#define DIRHASH_BLKALLOC() pool_get(&ufsdirhash_pool, PR_NOWAIT)
#define DIRHASH_BLKFREE(v) pool_put(&ufsdirhash_pool, v)
@@ -88,6 +88,7 @@
TAILQ_HEAD(, dirhash) ufsdirhash_list;
/* Protects: ufsdirhash_list, `dh_list' field, ufs_dirhashmem. */
+struct mutex ufsdirhash_mtx;
/*
* Locking order:
@@ -187,6 +188,7 @@
}
/* Initialise the hash table and block statistics. */
+ mtx_init(&dh->dh_mtx, IPL_NONE);
dh->dh_narrays = narrays;
dh->dh_hlen = nslots;
dh->dh_nblk = nblocks;
@@ -1058,6 +1060,7 @@
pool_init(&ufsdirhash_pool, DH_NBLKOFF * sizeof(doff_t), 0, 0, 0,
"dirhash", &pool_allocator_nointr);
pool_sethiwat(&ufsdirhash_pool, 512);
+ mtx_init(&ufsdirhash_mtx, IPL_NONE);
TAILQ_INIT(&ufsdirhash_list);
#if defined (__sparc__) && !defined (__sparc64__)
if (!CPU_ISSUN4OR4C)