tdb: tdb_allrecord_lock/tdb_allrecord_unlock/tdb_allrecord_upgrade
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 17 Feb 2010 05:12:15 +0000 (15:42 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 17 Feb 2010 05:12:15 +0000 (15:42 +1030)
commitfca1621965c547e2d076eca2a2599e9629f91266
tree94abacb92dfa97c70e2137e9a2a6b63f2c73938c
parentcaaf5c6baa1a4f340c1f38edd99b3a8b56621b8b
tdb: tdb_allrecord_lock/tdb_allrecord_unlock/tdb_allrecord_upgrade

Centralize locking of all chains of the tdb; rename _tdb_lockall to
tdb_allrecord_lock and _tdb_unlockall to tdb_allrecord_unlock, and
tdb_brlock_upgrade to tdb_allrecord_upgrade.

Then we use this in the transaction code.  Unfortunately, if the transaction
code records that it has grabbed the allrecord lock read-only, write locks
will fail, so we treat this upgradable lock as a write lock, and mark it
as upgradable using the otherwise-unused offset field.

One subtlety: now the transaction code is using the allrecord_lock, the
tdb_release_extra_locks() function drops it for us, so we no longer need
to do it manually in _tdb_transaction_cancel.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
lib/tdb/common/lock.c
lib/tdb/common/tdb_private.h
lib/tdb/common/transaction.c