4 * checkhammer blockmapdump btreedump
17 static void parseBlockMap(FILE *fp
);
18 static void parseBTree(FILE *fp
);
19 static void dumpResults(void);
20 static int rbmap_cmp(struct rbmap
*, struct rbmap
*);
22 typedef u_int64_t hammer_off_t
;
23 typedef struct rbmap
*rbmap_t
;
25 RB_HEAD(rbmap_tree
, rbmap
);
26 RB_PROTOTYPE2(rbmap_tree
, rbmap
, rbentry
, rbmap_cmp
, hammer_off_t
);
29 RB_ENTRY(rbmap
) rbentry
;
37 RB_GENERATE2(rbmap_tree
, rbmap
, rbentry
, rbmap_cmp
, hammer_off_t
, base
);
39 struct rbmap_tree rbroot
;
43 rbmap_cmp(struct rbmap
*rb1
, struct rbmap
*rb2
)
45 if (rb1
->base
< rb2
->base
)
47 if (rb1
->base
> rb2
->base
)
53 main(int ac
, char **av
)
58 fprintf(stderr
, "checkhammer blockmapdump btreedump\n");
61 if ((fp
= fopen(av
[1], "r")) == NULL
) {
62 fprintf(stderr
, "Unable to open %s\n", av
[1]);
69 if ((fp
= fopen(av
[2], "r")) == NULL
) {
70 fprintf(stderr
, "Unable to open %s\n", av
[1]);
81 parseBlockMap(FILE *fp
)
90 while (fgets(buf
, sizeof(buf
), fp
) != NULL
) {
91 if (sscanf(buf
, " 4%llx zone=%d app=%lld free=%lld",
92 &base
, &zone
, &app
, &free
) != 4)
94 if (RB_LOOKUP(rbmap_tree
, &rbroot
, (hammer_off_t
)base
))
96 map
= malloc(sizeof(*map
));
97 map
->base
= (hammer_off_t
)base
;
99 map
->free
= (long)free
;
102 RB_INSERT(rbmap_tree
, &rbroot
, map
);
114 while (fgets(buf
, sizeof(buf
), fp
) != NULL
) {
115 if (sscanf(buf
, " NODE 8%llx", &base
) == 1) {
116 base
&= 0x0FFFFFFFFF800000LLU
;
117 map
= RB_LOOKUP(rbmap_tree
, &rbroot
, base
);
119 printf("(not in blockmap): %s", buf
);
124 if (sscanf(buf
, " dataoff=%llx/%lld",
125 &base
, &bytes
) == 2) {
126 base
&= 0x0FFFFFFFFF800000LLU
;
127 map
= RB_LOOKUP(rbmap_tree
, &rbroot
, base
);
129 printf("(not in blockmap): %s", buf
);
132 map
->bytes
+= (bytes
+ 15) & ~15;
143 printf("mismatches: (blockmap, actual)\n");
144 RB_FOREACH(map
, rbmap_tree
, &rbroot
) {
145 bfree
= 8192 * 1024 - (int64_t)map
->bytes
;
150 if (map
->free
== bfree
)
154 * If the block is completely allocated but our calculations
155 * show nobody is referencing it it is probably an undo,
156 * blockmap, or unavailable reserved area.
158 if (map
->free
== 0 && bfree
== 8192 * 1024) {
159 if (map
->zone
== 3 || map
->zone
== 4 ||
164 printf(" bmap %016jx %jd %jd\n",
166 (intmax_t)(int64_t)map
->free
,
167 (intmax_t)(int64_t)bfree
);