X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Ftdb2%2Ffree.c;h=b41e1d58d2a699a76f74c98cb17f0e5e21ba5a97;hb=539f1af037858b905c50c560f2a608555d8457ff;hp=49880f18dd51517601eca798d163e5e98b10b514;hpb=115648946c7a78e87fb45eac6c1759a347d4c7f8;p=ccan-lca-2011.git diff --git a/ccan/tdb2/free.c b/ccan/tdb2/free.c index 49880f1..b41e1d5 100644 --- a/ccan/tdb2/free.c +++ b/ccan/tdb2/free.c @@ -278,7 +278,8 @@ static int coalesce(struct tdb_context *tdb, if (!r) goto err; - if (frec_magic(r) != TDB_FREE_MAGIC) { + if (frec_magic(r) != TDB_FREE_MAGIC + || frec_flist(r) == TDB_FLIST_NONE) { tdb_access_release(tdb, r); break; } @@ -343,11 +344,11 @@ static int coalesce(struct tdb_context *tdb, /* We have to drop this to avoid deadlocks, so make sure record * doesn't get coalesced by someone else! */ - rec.magic_and_prev = TDB_COALESCING_MAGIC - << (64 - TDB_OFF_UPPER_STEAL); - /* FIXME: Use 255 as invalid free list? */ - rec.flist_and_len = end - off - sizeof(struct tdb_used_record); - if (tdb_write_convert(tdb, off, &rec, sizeof(rec)) != 0) + rec.flist_and_len = (TDB_FLIST_NONE << (64 - TDB_OFF_UPPER_STEAL)) + | (end - off - sizeof(struct tdb_used_record)); + if (tdb_write_off(tdb, off + offsetof(struct tdb_free_record, + flist_and_len), + rec.flist_and_len) != 0) goto err; add_stat(tdb, alloc_coalesce_succeeded, 1);