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)
{