We can run summary with a recovery area, or a dead zone.
}
/* Slow, but should be very rare. */
}
/* Slow, but should be very rare. */
-static size_t dead_space(struct tdb_context *tdb, tdb_off_t off)
+size_t dead_space(struct tdb_context *tdb, tdb_off_t off)
unsigned int size_to_bucket(tdb_len_t data_len);
tdb_off_t bucket_off(tdb_off_t flist_off, unsigned bucket);
unsigned int size_to_bucket(tdb_len_t data_len);
tdb_off_t bucket_off(tdb_off_t flist_off, unsigned bucket);
+/* Used by tdb_summary */
+size_t dead_space(struct tdb_context *tdb, tdb_off_t off);
+
/* io.c: */
/* Initialize tdb->methods. */
void tdb_io_init(struct tdb_context *tdb);
/* io.c: */
/* Initialize tdb->methods. */
void tdb_io_init(struct tdb_context *tdb);
union {
struct tdb_used_record u;
struct tdb_free_record f;
union {
struct tdb_used_record u;
struct tdb_free_record f;
+ struct tdb_recovery_record r;
- p = tdb_get(tdb, off, &pad, sizeof(pad));
+ /* We might not be able to get the whole thing. */
+ p = tdb_get(tdb, off, &pad, sizeof(p->f));
- if (rec_magic(&p->u) != TDB_MAGIC) {
+ if (p->r.magic == TDB_RECOVERY_INVALID_MAGIC
+ || p->r.magic == TDB_RECOVERY_MAGIC) {
+ len = sizeof(p->r) + p->r.max_len;
+ } else if (rec_magic(&p->u) != TDB_MAGIC) {
len = p->f.data_len;
tally_add(free, len);
tally_add(buckets, size_to_bucket(len));
len += sizeof(p->u);
unc++;
len = p->f.data_len;
tally_add(free, len);
tally_add(buckets, size_to_bucket(len));
len += sizeof(p->u);
unc++;
+ } else if (frec_magic(&p->f) == TDB_FREE_MAGIC) {
if (unc) {
tally_add(uncoal, unc);
unc = 0;
if (unc) {
tally_add(uncoal, unc);
unc = 0;
tally_add(data, rec_data_length(&p->u));
}
tally_add(extra, rec_extra_padding(&p->u));
tally_add(data, rec_data_length(&p->u));
}
tally_add(extra, rec_extra_padding(&p->u));
+ } else
+ len = dead_space(tdb, off);
}
if (unc)
tally_add(uncoal, unc);
}
if (unc)
tally_add(uncoal, unc);