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)