tdb_transaction_lock() and tdb_transaction_unlock() do nothing if we
hold the allrecord lock. However, the two locks don't overlap, so
this is wrong.
This simplification makes the transaction lock a straight-forward nested
lock.
There are two callers for these functions:
1) The transaction code, which already makes sure the allrecord_lock
isn't held.
2) The traverse code, which wants to stop transactions whether it has the
allrecord lock or not. There have been deadlocks here before, however
this should not bring them back (I hope!)
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
(Imported from commit
b754f61d235bdc3e410b60014d6be4072645e16f)
*/
int tdb_transaction_lock(struct tdb_context *tdb, int ltype)
{
- if (tdb->allrecord_lock.count) {
- return 0;
- }
if (tdb->transaction_lock_count > 0) {
tdb->transaction_lock_count++;
return 0;
int tdb_transaction_unlock(struct tdb_context *tdb, int ltype)
{
int ret;
- if (tdb->allrecord_lock.count) {
- return 0;
- }
if (tdb->transaction_lock_count > 1) {
tdb->transaction_lock_count--;
return 0;