X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ffree.c;h=361171902680ece2441e698a3b960df6ddb781de;hb=7a36f69eea4ee572bdf191d6048350751cd2ab5b;hp=efc29e884ea2078c54ed28616b9d0cdce1228ac1;hpb=84a19b9bada57df46adc76d46672546a675b00a7;p=ccan diff --git a/ccan/tdb2/free.c b/ccan/tdb2/free.c index efc29e88..36117190 100644 --- a/ccan/tdb2/free.c +++ b/ccan/tdb2/free.c @@ -164,13 +164,10 @@ tdb_off_t bucket_off(tdb_off_t zone_off, tdb_off_t bucket) /* Returns free_buckets + 1, or list number to search. */ static tdb_off_t find_free_head(struct tdb_context *tdb, tdb_off_t bucket) { - tdb_off_t b; - /* Speculatively search for a non-zero bucket. */ - b = tdb_find_nonzero_off(tdb, bucket_off(tdb->zone_off, bucket), - BUCKETS_FOR_ZONE(tdb->zhdr.zone_bits) + 1 - - bucket); - return bucket + b; + return tdb_find_nonzero_off(tdb, bucket_off(tdb->zone_off, 0), + bucket, + BUCKETS_FOR_ZONE(tdb->zhdr.zone_bits) + 1); } /* Remove from free bucket. */ @@ -510,10 +507,10 @@ int set_header(struct tdb_context *tdb, { uint64_t keybits = (fls64(keylen) + 1) / 2; - /* Use top bits of hash, so it's independent of hash table size. */ + /* Use bottom bits of hash, so it's independent of hash table size. */ rec->magic_and_meta = zone_bits - | ((hash >> 59) << 6) + | ((hash & ((1 << 5)-1)) << 6) | ((actuallen - (keylen + datalen)) << 11) | (keybits << 43) | (TDB_MAGIC << 48); @@ -654,8 +651,8 @@ tdb_off_t alloc(struct tdb_context *tdb, size_t keylen, size_t datalen, tdb_len_t size, actual; struct tdb_used_record rec; - /* We don't want header to change during this! */ - assert(tdb->header_uptodate); + /* We can't hold pointers during this: we could unmap! */ + assert(!tdb->direct_access); size = adjust_size(keylen, datalen, growing);