+ off = r->next;
+ }
+
+ /* If we found anything at all, use it. */
+ if (best_off) {
+ struct tdb_used_record rec;
+ size_t leftover;
+
+ /* We're happy with this size: take it. */
+ if (remove_from_list(tdb, b_off, best_off, &best) != 0)
+ goto unlock_err;
+
+ leftover = record_leftover(keylen, datalen, want_extra,
+ best.data_len);
+
+ assert(keylen + datalen + leftover <= best.data_len);
+ /* We need to mark non-free before we drop lock, otherwise
+ * coalesce() could try to merge it! */
+ if (set_header(tdb, &rec, keylen, datalen,
+ best.data_len - leftover,
+ hashlow, zone_bits) != 0)
+ goto unlock_err;
+
+ if (tdb_write_convert(tdb, best_off, &rec, sizeof(rec)) != 0)
+ goto unlock_err;
+
+ tdb_unlock_free_bucket(tdb, b_off);
+
+ if (leftover) {
+ if (add_free_record(tdb, zone_bits,
+ best_off + sizeof(rec)
+ + best.data_len - leftover,
+ leftover))
+ return TDB_OFF_ERR;
+ }
+ return best_off;