X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Flock.c;h=19b92d9ae09c63152b87d10062b1363a8c063516;hp=870601126bdb82d72163f3aba5b0f76f66c5c86e;hb=a879e3e2859e17496f29e14b8f393583b2c93f19;hpb=99e576ac94fd86fcba188fb72ced9e8087ac1680 diff --git a/ccan/tdb/lock.c b/ccan/tdb/lock.c index 87060112..19b92d9a 100644 --- a/ccan/tdb/lock.c +++ b/ccan/tdb/lock.c @@ -675,6 +675,11 @@ bool tdb_have_extra_locks(struct tdb_context *tdb) return true; } + /* We always hold the active lock if CLEAR_IF_FIRST. */ + if (find_nestlock(tdb, ACTIVE_LOCK)) { + extra--; + } + /* In a transaction, we expect to hold the transaction lock */ if (tdb->transaction && find_nestlock(tdb, TRANSACTION_LOCK)) { extra--; @@ -683,7 +688,8 @@ bool tdb_have_extra_locks(struct tdb_context *tdb) return extra; } -/* The transaction code uses this to remove all locks. */ +/* The transaction code uses this to remove all locks. Note that this + may include OPEN_LOCK. */ void tdb_release_extra_locks(struct tdb_context *tdb) { unsigned int i, extra = 0; @@ -697,8 +703,11 @@ void tdb_release_extra_locks(struct tdb_context *tdb) for (i=0;inum_lockrecs;i++) { struct tdb_lock_type *lck = &tdb->lockrecs[i]; + /* Don't release transaction or active locks! */ if (tdb->transaction && lck->off == TRANSACTION_LOCK) { tdb->lockrecs[extra++] = *lck; + } else if (lck->off == ACTIVE_LOCK) { + tdb->lockrecs[extra++] = *lck; } else { tdb_brunlock(tdb, lck->ltype, lck->off, 1); }