-again:
- if (tdb_nest_lock(tdb, TDB_HASH_LOCK_START + list, ltype, waitflag))
- return TDB_OFF_ERR;
-
- if (can_change && unlikely(header_changed(tdb))) {
- tdb_off_t new = hash & ((1ULL << tdb->header.v.hash_bits) - 1);
- if (new != list) {
- tdb_nest_unlock(tdb, TDB_HASH_LOCK_START+list, ltype);
- list = new;
- goto again;
- }
+ if (tdb_has_free_lock(tdb)) {
+ tdb->ecode = TDB_ERR_LOCK;
+ tdb->log(tdb, TDB_DEBUG_ERROR, tdb->log_priv,
+ "tdb_lock_hashes: have free lock already\n");
+ return -1;
+ }
+
+ if (tdb_has_expansion_lock(tdb)) {
+ tdb->ecode = TDB_ERR_LOCK;
+ tdb->log(tdb, TDB_DEBUG_ERROR, tdb->log_priv,
+ "tdb_lock_hashes: have expansion lock already\n");
+ return -1;