]> git.ozlabs.org Git - ccan/blobdiff - ccan/tdb2/summary.c
tdb2: remove tailer
[ccan] / ccan / tdb2 / summary.c
index e7a291967cb034cda442b807ed563fc8c7c2b58e..3df822ba7a11f6c0c7929b5e02473097e7ad8f58 100644 (file)
@@ -66,7 +66,7 @@ static tdb_len_t summarize_zone(struct tdb_context *tdb, tdb_off_t zone_off,
                                unsigned int *num_buckets)
 {
        struct free_zone_header zhdr;
-       tdb_off_t off;
+       tdb_off_t off, end;
        tdb_len_t len;
        unsigned int hdrlen;
        tdb_len_t unc = 0;
@@ -79,9 +79,12 @@ static tdb_len_t summarize_zone(struct tdb_context *tdb, tdb_off_t zone_off,
 
        hdrlen = sizeof(zhdr)
                + (BUCKETS_FOR_ZONE(zhdr.zone_bits) + 1) * sizeof(tdb_off_t);
-       for (off = zone_off + hdrlen;
-            off < zone_off + (1ULL << zhdr.zone_bits);
-            off += len) {
+
+       end = zone_off + (1ULL << zhdr.zone_bits);
+       if (end > tdb->map_size)
+               end = tdb->map_size;
+
+       for (off = zone_off + hdrlen; off < end; off += len) {
                union {
                        struct tdb_used_record u;
                        struct tdb_free_record f;
@@ -89,7 +92,7 @@ static tdb_len_t summarize_zone(struct tdb_context *tdb, tdb_off_t zone_off,
                p = tdb_get(tdb, off, &pad, sizeof(pad));
                if (!p)
                        return TDB_OFF_ERR;
-               if (frec_magic(&p->f) == TDB_FREE_MAGIC) {
+               if (rec_magic(&p->u) != TDB_MAGIC) {
                        len = p->f.data_len;
                        tally_add(free, len);
                        bucketlen[size_to_bucket(frec_zone_bits(&p->f), len)]++;
@@ -163,6 +166,8 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
                *bucketsg[BUCKETS_FOR_ZONE(63)+1] = { NULL };
        char *ret = NULL;
 
+       zonesg = hashesg = freeg = keysg = datag = extrag = uncoalg = NULL;
+
        if (tdb_allrecord_lock(tdb, F_RDLCK, TDB_LOCK_WAIT, false) != 0)
                return NULL;
 
@@ -222,9 +227,6 @@ char *tdb_summary(struct tdb_context *tdb, enum tdb_summary_flags flags)
                                                      HISTO_WIDTH,
                                                      HISTO_HEIGHT);
                }
-       } else {
-               zonesg = hashesg = freeg = keysg = datag = extrag = uncoalg
-                       = NULL;
        }
 
        /* 20 is max length of a %llu. */