- /* FIXME: Should we do header_uptodate and return retry here? */
- return tdb_nest_lock(tdb, TDB_HASH_LOCK_START + list, ltype, waitflag);
+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;
+ }
+ }
+ return list;