Blame


1 28b49df3 2006-07-18 devnull #include "stdinc.h"
2 28b49df3 2006-07-18 devnull #include "dat.h"
3 28b49df3 2006-07-18 devnull #include "fns.h"
4 28b49df3 2006-07-18 devnull
5 28b49df3 2006-07-18 devnull uchar buf[64*1024];
6 28b49df3 2006-07-18 devnull
7 28b49df3 2006-07-18 devnull void
8 28b49df3 2006-07-18 devnull usage(void)
9 28b49df3 2006-07-18 devnull {
10 28b49df3 2006-07-18 devnull fprint(2, "usage: printarenapart arenafile [offset]\n");
11 28b49df3 2006-07-18 devnull threadexitsall("usage");
12 28b49df3 2006-07-18 devnull }
13 28b49df3 2006-07-18 devnull
14 5d03af65 2012-05-29 rsc /* unused */
15 5d03af65 2012-05-29 rsc void
16 28b49df3 2006-07-18 devnull rdarena(Arena *arena, u64int offset)
17 28b49df3 2006-07-18 devnull {
18 28b49df3 2006-07-18 devnull u64int a, aa, e;
19 28b49df3 2006-07-18 devnull u32int magic;
20 28b49df3 2006-07-18 devnull Clump cl;
21 28b49df3 2006-07-18 devnull uchar score[VtScoreSize];
22 28b49df3 2006-07-18 devnull ZBlock *lump;
23 28b49df3 2006-07-18 devnull
24 28b49df3 2006-07-18 devnull printarena(2, arena);
25 28b49df3 2006-07-18 devnull
26 28b49df3 2006-07-18 devnull a = arena->base;
27 28b49df3 2006-07-18 devnull e = arena->base + arena->size;
28 28b49df3 2006-07-18 devnull if(offset != ~(u64int)0) {
29 28b49df3 2006-07-18 devnull if(offset >= e-a)
30 f5a8ea6f 2011-06-02 rsc sysfatal("bad offset %llud >= %llud",
31 28b49df3 2006-07-18 devnull offset, e-a);
32 28b49df3 2006-07-18 devnull aa = offset;
33 28b49df3 2006-07-18 devnull } else
34 28b49df3 2006-07-18 devnull aa = 0;
35 28b49df3 2006-07-18 devnull
36 28b49df3 2006-07-18 devnull for(; aa < e; aa += ClumpSize+cl.info.size) {
37 28b49df3 2006-07-18 devnull magic = clumpmagic(arena, aa);
38 28b49df3 2006-07-18 devnull if(magic == ClumpFreeMagic)
39 28b49df3 2006-07-18 devnull break;
40 28b49df3 2006-07-18 devnull if(magic != arena->clumpmagic) {
41 28b49df3 2006-07-18 devnull fprint(2, "illegal clump magic number %#8.8ux offset %llud\n",
42 28b49df3 2006-07-18 devnull magic, aa);
43 28b49df3 2006-07-18 devnull break;
44 28b49df3 2006-07-18 devnull }
45 28b49df3 2006-07-18 devnull lump = loadclump(arena, aa, 0, &cl, score, 0);
46 28b49df3 2006-07-18 devnull if(lump == nil) {
47 28b49df3 2006-07-18 devnull fprint(2, "clump %llud failed to read: %r\n", aa);
48 28b49df3 2006-07-18 devnull break;
49 28b49df3 2006-07-18 devnull }
50 28b49df3 2006-07-18 devnull if(cl.info.type != VtCorruptType) {
51 28b49df3 2006-07-18 devnull scoremem(score, lump->data, cl.info.uncsize);
52 28b49df3 2006-07-18 devnull if(scorecmp(cl.info.score, score) != 0) {
53 28b49df3 2006-07-18 devnull fprint(2, "clump %llud has mismatched score\n", aa);
54 28b49df3 2006-07-18 devnull break;
55 28b49df3 2006-07-18 devnull }
56 28b49df3 2006-07-18 devnull if(vttypevalid(cl.info.type) < 0) {
57 28b49df3 2006-07-18 devnull fprint(2, "clump %llud has bad type %d\n", aa, cl.info.type);
58 28b49df3 2006-07-18 devnull break;
59 28b49df3 2006-07-18 devnull }
60 28b49df3 2006-07-18 devnull }
61 28b49df3 2006-07-18 devnull print("%22llud %V %3d %5d\n", aa, score, cl.info.type, cl.info.uncsize);
62 28b49df3 2006-07-18 devnull freezblock(lump);
63 28b49df3 2006-07-18 devnull }
64 28b49df3 2006-07-18 devnull print("end offset %llud\n", aa);
65 28b49df3 2006-07-18 devnull }
66 28b49df3 2006-07-18 devnull
67 28b49df3 2006-07-18 devnull void
68 28b49df3 2006-07-18 devnull threadmain(int argc, char *argv[])
69 28b49df3 2006-07-18 devnull {
70 28b49df3 2006-07-18 devnull char *file, *p, *name;
71 28b49df3 2006-07-18 devnull char *table;
72 28b49df3 2006-07-18 devnull u64int offset;
73 28b49df3 2006-07-18 devnull Part *part;
74 28b49df3 2006-07-18 devnull ArenaPart ap;
75 28b49df3 2006-07-18 devnull ArenaHead head;
76 28b49df3 2006-07-18 devnull Arena tail;
77 28b49df3 2006-07-18 devnull char ct[40], mt[40];
78 28b49df3 2006-07-18 devnull
79 28b49df3 2006-07-18 devnull readonly = 1; /* for part.c */
80 28b49df3 2006-07-18 devnull ARGBEGIN{
81 28b49df3 2006-07-18 devnull default:
82 28b49df3 2006-07-18 devnull usage();
83 28b49df3 2006-07-18 devnull break;
84 28b49df3 2006-07-18 devnull }ARGEND
85 28b49df3 2006-07-18 devnull
86 28b49df3 2006-07-18 devnull switch(argc) {
87 28b49df3 2006-07-18 devnull default:
88 28b49df3 2006-07-18 devnull usage();
89 28b49df3 2006-07-18 devnull case 1:
90 28b49df3 2006-07-18 devnull file = argv[0];
91 28b49df3 2006-07-18 devnull }
92 28b49df3 2006-07-18 devnull
93 28b49df3 2006-07-18 devnull ventifmtinstall();
94 28b49df3 2006-07-18 devnull statsinit();
95 28b49df3 2006-07-18 devnull
96 28b49df3 2006-07-18 devnull part = initpart(file, OREAD|ODIRECT);
97 28b49df3 2006-07-18 devnull if(part == nil)
98 28b49df3 2006-07-18 devnull sysfatal("can't open file %s: %r", file);
99 28b49df3 2006-07-18 devnull if(readpart(part, PartBlank, buf, sizeof buf) < 0)
100 28b49df3 2006-07-18 devnull sysfatal("can't read file %s: %r", file);
101 28b49df3 2006-07-18 devnull
102 28b49df3 2006-07-18 devnull if(unpackarenapart(&ap, buf) < 0)
103 28b49df3 2006-07-18 devnull sysfatal("corrupted arena part header: %r");
104 28b49df3 2006-07-18 devnull
105 28b49df3 2006-07-18 devnull print("# arena part version=%d blocksize=%d arenabase=%d\n",
106 28b49df3 2006-07-18 devnull ap.version, ap.blocksize, ap.arenabase);
107 28b49df3 2006-07-18 devnull ap.tabbase = (PartBlank+HeadSize+ap.blocksize-1)&~(ap.blocksize-1);
108 28b49df3 2006-07-18 devnull ap.tabsize = ap.arenabase - ap.tabbase;
109 28b49df3 2006-07-18 devnull
110 28b49df3 2006-07-18 devnull table = malloc(ap.tabsize+1);
111 28b49df3 2006-07-18 devnull if(readpart(part, ap.tabbase, (uchar*)table, ap.tabsize) < 0)
112 28b49df3 2006-07-18 devnull sysfatal("read %s: %r", file);
113 28b49df3 2006-07-18 devnull table[ap.tabsize] = 0;
114 28b49df3 2006-07-18 devnull
115 28b49df3 2006-07-18 devnull partblocksize(part, ap.blocksize);
116 28b49df3 2006-07-18 devnull initdcache(8 * MaxDiskBlock);
117 28b49df3 2006-07-18 devnull
118 28b49df3 2006-07-18 devnull for(p=table; p && *p; p=strchr(p, '\n')){
119 28b49df3 2006-07-18 devnull if(*p == '\n')
120 28b49df3 2006-07-18 devnull p++;
121 28b49df3 2006-07-18 devnull name = p;
122 28b49df3 2006-07-18 devnull p = strpbrk(p, " \t");
123 28b49df3 2006-07-18 devnull if(p == nil){
124 28b49df3 2006-07-18 devnull fprint(2, "bad line: %s\n", name);
125 28b49df3 2006-07-18 devnull break;
126 28b49df3 2006-07-18 devnull }
127 28b49df3 2006-07-18 devnull offset = strtoull(p, nil, 0);
128 28b49df3 2006-07-18 devnull if(readpart(part, offset, buf, sizeof buf) < 0){
129 28b49df3 2006-07-18 devnull fprint(2, "%s: read %s: %r\n", argv0, file);
130 28b49df3 2006-07-18 devnull continue;
131 28b49df3 2006-07-18 devnull }
132 28b49df3 2006-07-18 devnull if(unpackarenahead(&head, buf) < 0){
133 28b49df3 2006-07-18 devnull fprint(2, "%s: unpackarenahead: %r\n", argv0);
134 28b49df3 2006-07-18 devnull continue;
135 28b49df3 2006-07-18 devnull }
136 28b49df3 2006-07-18 devnull if(readpart(part, offset+head.size-head.blocksize, buf, head.blocksize) < 0){
137 28b49df3 2006-07-18 devnull fprint(2, "%s: read %s: %r\n", argv0, file);
138 28b49df3 2006-07-18 devnull continue;
139 28b49df3 2006-07-18 devnull }
140 28b49df3 2006-07-18 devnull if(unpackarena(&tail, buf) < 0){
141 28b49df3 2006-07-18 devnull fprint(2, "%s: unpackarena: %r\n", argv0);
142 28b49df3 2006-07-18 devnull continue;
143 28b49df3 2006-07-18 devnull }
144 28b49df3 2006-07-18 devnull print("arena %s %lld clumps=%,d cclumps=%,d used=%,lld uncsize=%,lld%s\n",
145 28b49df3 2006-07-18 devnull tail.name, offset,
146 28b49df3 2006-07-18 devnull tail.diskstats.clumps, tail.diskstats.cclumps,
147 28b49df3 2006-07-18 devnull tail.diskstats.used, tail.diskstats.uncsize,
148 28b49df3 2006-07-18 devnull tail.diskstats.sealed ? " sealed" : "");
149 28b49df3 2006-07-18 devnull strcpy(ct, ctime(tail.ctime));
150 28b49df3 2006-07-18 devnull ct[28] = 0;
151 28b49df3 2006-07-18 devnull strcpy(mt, ctime(tail.wtime));
152 28b49df3 2006-07-18 devnull mt[28] = 0;
153 28b49df3 2006-07-18 devnull print("\tctime=%s\n\tmtime=%s\n", ct, mt);
154 28b49df3 2006-07-18 devnull }
155 28b49df3 2006-07-18 devnull threadexitsall(0);
156 28b49df3 2006-07-18 devnull }