- int64_t ret;
- bool was_ro = tdb->read_only;
- tdb->read_only = true;
- ret = traverse(tdb, F_RDLCK, fn, p);
- tdb->read_only = was_ro;
- return ret;
+ struct traverse_info tinfo;
+ struct hash_info h;
+ struct tdb_used_record rec;
+ enum TDB_ERROR ecode;
+
+ tinfo.prev = find_and_lock(tdb, key, F_RDLCK, &h, &rec, &tinfo);
+ if (TDB_OFF_IS_ERR(tinfo.prev)) {
+ tdb->ecode = tinfo.prev;
+ return tdb_null;
+ }
+ tdb_unlock_hashes(tdb, h.hlock_start, h.hlock_range, F_RDLCK);
+
+ ecode = next_in_hash(tdb, &tinfo, &key, NULL);
+ if (ecode == TDB_SUCCESS) {
+ return key;
+ }
+ if (ecode == TDB_ERR_NOEXIST)
+ ecode = TDB_SUCCESS;
+ tdb->ecode = ecode;
+ return tdb_null;