tdb: cleanup: tdb_release_extra_locks() helper
authorRusty Russell <rusty@rustcorp.com.au>
Wed, 24 Feb 2010 00:11:15 +0000 (10:41 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Wed, 24 Feb 2010 00:11:15 +0000 (10:41 +1030)
Move locking intelligence back into lock.c, rather than open-coding the
lock release in transaction.c.

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

index 4f8970fd34bc4e7766e2748e2bbf077ad76a5f97..3013b06af6ec855477b0991422a2948bf7b69359 100644 (file)
@@ -702,3 +702,23 @@ bool tdb_have_extra_locks(struct tdb_context *tdb)
        }
        return false;
 }
        }
        return false;
 }
+
+/* The transaction code uses this to remove all locks. */
+void tdb_release_extra_locks(struct tdb_context *tdb)
+{
+       unsigned int i;
+
+       if (tdb->allrecord_lock.count != 0) {
+               tdb_brunlock(tdb, tdb->allrecord_lock.ltype,
+                            FREELIST_TOP, 4*tdb->header.hash_size);
+               tdb->allrecord_lock.count = 0;
+       }
+
+       for (i=0;i<tdb->num_lockrecs;i++) {
+               tdb_brunlock(tdb, tdb->lockrecs[i].ltype,
+                            tdb->lockrecs[i].off, 1);
+       }
+       tdb->num_locks = 0;
+       tdb->num_lockrecs = 0;
+       SAFE_FREE(tdb->lockrecs);
+}
index 1af975de6e70b4dcac3a94006ba8e7c1789178cf..32c05210ba2a037db9c98d460469cb40cb7fdbd6 100644 (file)
@@ -235,6 +235,7 @@ int tdb_brlock(struct tdb_context *tdb,
 int tdb_brunlock(struct tdb_context *tdb,
                 int rw_type, tdb_off_t offset, size_t len);
 bool tdb_have_extra_locks(struct tdb_context *tdb);
 int tdb_brunlock(struct tdb_context *tdb,
                 int rw_type, tdb_off_t offset, size_t len);
 bool tdb_have_extra_locks(struct tdb_context *tdb);
+void tdb_release_extra_locks(struct tdb_context *tdb);
 int tdb_transaction_lock(struct tdb_context *tdb, int ltype);
 int tdb_transaction_unlock(struct tdb_context *tdb, int ltype);
 int tdb_brlock_upgrade(struct tdb_context *tdb, tdb_off_t offset, size_t len);
 int tdb_transaction_lock(struct tdb_context *tdb, int ltype);
 int tdb_transaction_unlock(struct tdb_context *tdb, int ltype);
 int tdb_brlock_upgrade(struct tdb_context *tdb, tdb_off_t offset, size_t len);
index 36b5c035b7f8280acaed3da6902749228590dd36..02ef72a3574ae74939e2b2117799527495483a9d 100644 (file)
@@ -620,23 +620,7 @@ static int _tdb_transaction_cancel(struct tdb_context *tdb, int ltype)
                tdb->transaction->open_lock_taken = false;
        }
 
                tdb->transaction->open_lock_taken = false;
        }
 
-       /* remove any global lock created during the transaction */
-       if (tdb->allrecord_lock.count != 0) {
-               tdb_brunlock(tdb, tdb->allrecord_lock.ltype,
-                            FREELIST_TOP, 4*tdb->header.hash_size);
-               tdb->allrecord_lock.count = 0;
-       }
-
-       /* remove any locks created during the transaction */
-       if (tdb->num_locks != 0) {
-               for (i=0;i<tdb->num_lockrecs;i++) {
-                       tdb_brunlock(tdb, tdb->lockrecs[i].ltype,
-                                    tdb->lockrecs[i].off, 1);
-               }
-               tdb->num_locks = 0;
-               tdb->num_lockrecs = 0;
-               SAFE_FREE(tdb->lockrecs);
-       }
+       tdb_release_extra_locks(tdb);
 
        /* restore the normal io methods */
        tdb->methods = tdb->transaction->io_methods;
 
        /* restore the normal io methods */
        tdb->methods = tdb->transaction->io_methods;