Print this page
3746 ZRLs are racy
Submitted by:   Justin Gibbs <justing@spectralogic.com>

@@ -74,10 +74,11 @@
 zrl_add(zrlock_t *zrl)
 #endif
 {
         uint32_t n = (uint32_t)zrl->zr_refcount;
 
+        while (1) {
         while (n != ZRL_LOCKED) {
                 uint32_t cas = atomic_cas_32(
                     (uint32_t *)&zrl->zr_refcount, n, n + 1);
                 if (cas == n) {
                         ASSERT((int32_t)n >= 0);

@@ -91,22 +92,16 @@
 #endif
                         return;
                 }
                 n = cas;
         }
-
         mutex_enter(&zrl->zr_mtx);
         while (zrl->zr_refcount == ZRL_LOCKED) {
                 cv_wait(&zrl->zr_cv, &zrl->zr_mtx);
         }
-        ASSERT(zrl->zr_refcount >= 0);
-        zrl->zr_refcount++;
-#ifdef  ZFS_DEBUG
-        zrl->zr_owner = curthread;
-        zrl->zr_caller = zc;
-#endif
         mutex_exit(&zrl->zr_mtx);
+        }
 }
 
 void
 zrl_remove(zrlock_t *zrl)
 {