Skip to content
This repository has been archived by the owner on Nov 7, 2019. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
5812 assertion failed in zrl_tryenter(): zr_owner==NULL
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Alex Reece <alex@delphix.com>
Reviewed by: Will Andrews <will@freebsd.org>
Approved by: Gordon Ross <gwr@nexenta.com>
  • Loading branch information
ahrens committed Apr 26, 2015
1 parent 732885f commit 8df1730
Showing 1 changed file with 14 additions and 13 deletions.
27 changes: 14 additions & 13 deletions usr/src/uts/common/fs/zfs/zrlock.c
Expand Up @@ -20,6 +20,7 @@
*/
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014 by Delphix. All rights reserved.
*/

/*
Expand All @@ -42,7 +43,7 @@
* A ZRL can be locked only while there are zero references, so ZRL_LOCKED is
* treated as zero references.
*/
#define ZRL_LOCKED ((uint32_t)-1)
#define ZRL_LOCKED -1
#define ZRL_DESTROYED -2

void
Expand All @@ -60,7 +61,7 @@ zrl_init(zrlock_t *zrl)
void
zrl_destroy(zrlock_t *zrl)
{
ASSERT(zrl->zr_refcount == 0);
ASSERT0(zrl->zr_refcount);

mutex_destroy(&zrl->zr_mtx);
zrl->zr_refcount = ZRL_DESTROYED;
Expand All @@ -80,7 +81,7 @@ zrl_add(zrlock_t *zrl)
uint32_t cas = atomic_cas_32(
(uint32_t *)&zrl->zr_refcount, n, n + 1);
if (cas == n) {
ASSERT((int32_t)n >= 0);
ASSERT3S((int32_t)n, >=, 0);
#ifdef ZFS_DEBUG
if (zrl->zr_owner == curthread) {
DTRACE_PROBE2(zrlock__reentry,
Expand All @@ -98,7 +99,7 @@ zrl_add(zrlock_t *zrl)
while (zrl->zr_refcount == ZRL_LOCKED) {
cv_wait(&zrl->zr_cv, &zrl->zr_mtx);
}
ASSERT(zrl->zr_refcount >= 0);
ASSERT3S(zrl->zr_refcount, >=, 0);
zrl->zr_refcount++;
#ifdef ZFS_DEBUG
zrl->zr_owner = curthread;
Expand All @@ -112,14 +113,14 @@ zrl_remove(zrlock_t *zrl)
{
uint32_t n;

n = atomic_dec_32_nv((uint32_t *)&zrl->zr_refcount);
ASSERT((int32_t)n >= 0);
#ifdef ZFS_DEBUG
if (zrl->zr_owner == curthread) {
zrl->zr_owner = NULL;
zrl->zr_caller = NULL;
}
#endif
n = atomic_dec_32_nv((uint32_t *)&zrl->zr_refcount);
ASSERT3S((int32_t)n, >=, 0);
}

int
Expand All @@ -132,26 +133,26 @@ zrl_tryenter(zrlock_t *zrl)
(uint32_t *)&zrl->zr_refcount, 0, ZRL_LOCKED);
if (cas == 0) {
#ifdef ZFS_DEBUG
ASSERT(zrl->zr_owner == NULL);
ASSERT3P(zrl->zr_owner, ==, NULL);
zrl->zr_owner = curthread;
#endif
return (1);
}
}

ASSERT((int32_t)n > ZRL_DESTROYED);
ASSERT3S((int32_t)n, >, ZRL_DESTROYED);

return (0);
}

void
zrl_exit(zrlock_t *zrl)
{
ASSERT(zrl->zr_refcount == ZRL_LOCKED);
ASSERT3S(zrl->zr_refcount, ==, ZRL_LOCKED);

mutex_enter(&zrl->zr_mtx);
#ifdef ZFS_DEBUG
ASSERT(zrl->zr_owner == curthread);
ASSERT3P(zrl->zr_owner, ==, curthread);
zrl->zr_owner = NULL;
membar_producer(); /* make sure the owner store happens first */
#endif
Expand All @@ -163,7 +164,7 @@ zrl_exit(zrlock_t *zrl)
int
zrl_refcount(zrlock_t *zrl)
{
ASSERT(zrl->zr_refcount > ZRL_DESTROYED);
ASSERT3S(zrl->zr_refcount, >, ZRL_DESTROYED);

int n = (int)zrl->zr_refcount;
return (n <= 0 ? 0 : n);
Expand All @@ -172,15 +173,15 @@ zrl_refcount(zrlock_t *zrl)
int
zrl_is_zero(zrlock_t *zrl)
{
ASSERT(zrl->zr_refcount > ZRL_DESTROYED);
ASSERT3S(zrl->zr_refcount, >, ZRL_DESTROYED);

return (zrl->zr_refcount <= 0);
}

int
zrl_is_locked(zrlock_t *zrl)
{
ASSERT(zrl->zr_refcount > ZRL_DESTROYED);
ASSERT3S(zrl->zr_refcount, >, ZRL_DESTROYED);

return (zrl->zr_refcount == ZRL_LOCKED);
}
Expand Down

0 comments on commit 8df1730

Please sign in to comment.