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)

Reply via email to