Blame


1 7a4ee46d 2003-11-23 devnull #include "stdinc.h"
2 7a4ee46d 2003-11-23 devnull #include "dat.h"
3 7a4ee46d 2003-11-23 devnull #include "fns.h"
4 7a4ee46d 2003-11-23 devnull
5 7a4ee46d 2003-11-23 devnull static int verbose;
6 7a4ee46d 2003-11-23 devnull
7 7a4ee46d 2003-11-23 devnull static void
8 7a4ee46d 2003-11-23 devnull checkarena(Arena *arena, int scan, int fix)
9 7a4ee46d 2003-11-23 devnull {
10 7a4ee46d 2003-11-23 devnull Arena old;
11 7a4ee46d 2003-11-23 devnull int err, e;
12 7a4ee46d 2003-11-23 devnull
13 7a4ee46d 2003-11-23 devnull if(verbose && arena->clumps)
14 7a4ee46d 2003-11-23 devnull printarena(2, arena);
15 7a4ee46d 2003-11-23 devnull
16 7a4ee46d 2003-11-23 devnull old = *arena;
17 7a4ee46d 2003-11-23 devnull
18 7a4ee46d 2003-11-23 devnull if(scan){
19 7a4ee46d 2003-11-23 devnull arena->used = 0;
20 7a4ee46d 2003-11-23 devnull arena->clumps = 0;
21 7a4ee46d 2003-11-23 devnull arena->cclumps = 0;
22 7a4ee46d 2003-11-23 devnull arena->uncsize = 0;
23 7a4ee46d 2003-11-23 devnull }
24 7a4ee46d 2003-11-23 devnull
25 7a4ee46d 2003-11-23 devnull err = 0;
26 7a4ee46d 2003-11-23 devnull for(;;){
27 7a4ee46d 2003-11-23 devnull e = syncarena(arena, 1000, 0, fix);
28 7a4ee46d 2003-11-23 devnull err |= e;
29 7a4ee46d 2003-11-23 devnull if(!(e & SyncHeader))
30 7a4ee46d 2003-11-23 devnull break;
31 7a4ee46d 2003-11-23 devnull if(verbose && arena->clumps)
32 7a4ee46d 2003-11-23 devnull fprint(2, ".");
33 7a4ee46d 2003-11-23 devnull }
34 7a4ee46d 2003-11-23 devnull if(verbose && arena->clumps)
35 7a4ee46d 2003-11-23 devnull fprint(2, "\n");
36 7a4ee46d 2003-11-23 devnull
37 7a4ee46d 2003-11-23 devnull err &= ~SyncHeader;
38 7a4ee46d 2003-11-23 devnull if(arena->used != old.used
39 7a4ee46d 2003-11-23 devnull || arena->clumps != old.clumps
40 7a4ee46d 2003-11-23 devnull || arena->cclumps != old.cclumps
41 7a4ee46d 2003-11-23 devnull || arena->uncsize != old.uncsize){
42 7a4ee46d 2003-11-23 devnull fprint(2, "incorrect arena header fields\n");
43 7a4ee46d 2003-11-23 devnull printarena(2, arena);
44 7a4ee46d 2003-11-23 devnull err |= SyncHeader;
45 7a4ee46d 2003-11-23 devnull }
46 7a4ee46d 2003-11-23 devnull
47 7a4ee46d 2003-11-23 devnull if(!err || !fix)
48 7a4ee46d 2003-11-23 devnull return;
49 7a4ee46d 2003-11-23 devnull
50 7a4ee46d 2003-11-23 devnull fprint(2, "writing fixed arena header fields\n");
51 7a4ee46d 2003-11-23 devnull if(wbarena(arena) < 0)
52 7a4ee46d 2003-11-23 devnull fprint(2, "arena header write failed: %r\n");
53 7a4ee46d 2003-11-23 devnull }
54 7a4ee46d 2003-11-23 devnull
55 7a4ee46d 2003-11-23 devnull void
56 7a4ee46d 2003-11-23 devnull usage(void)
57 7a4ee46d 2003-11-23 devnull {
58 7a4ee46d 2003-11-23 devnull fprint(2, "usage: checkarenas [-afv] file\n");
59 7a4ee46d 2003-11-23 devnull threadexitsall(0);
60 7a4ee46d 2003-11-23 devnull }
61 7a4ee46d 2003-11-23 devnull
62 7a4ee46d 2003-11-23 devnull void
63 7a4ee46d 2003-11-23 devnull threadmain(int argc, char *argv[])
64 7a4ee46d 2003-11-23 devnull {
65 7a4ee46d 2003-11-23 devnull ArenaPart *ap;
66 7a4ee46d 2003-11-23 devnull Part *part;
67 7a4ee46d 2003-11-23 devnull char *file;
68 7a4ee46d 2003-11-23 devnull int i, fix, scan;
69 7a4ee46d 2003-11-23 devnull
70 7a4ee46d 2003-11-23 devnull fmtinstall('V', vtscorefmt);
71 7a4ee46d 2003-11-23 devnull
72 7a4ee46d 2003-11-23 devnull statsinit();
73 7a4ee46d 2003-11-23 devnull
74 7a4ee46d 2003-11-23 devnull fix = 0;
75 7a4ee46d 2003-11-23 devnull scan = 0;
76 7a4ee46d 2003-11-23 devnull ARGBEGIN{
77 7a4ee46d 2003-11-23 devnull case 'f':
78 7a4ee46d 2003-11-23 devnull fix++;
79 7a4ee46d 2003-11-23 devnull break;
80 7a4ee46d 2003-11-23 devnull case 'a':
81 7a4ee46d 2003-11-23 devnull scan = 1;
82 7a4ee46d 2003-11-23 devnull break;
83 7a4ee46d 2003-11-23 devnull case 'v':
84 7a4ee46d 2003-11-23 devnull verbose++;
85 7a4ee46d 2003-11-23 devnull break;
86 7a4ee46d 2003-11-23 devnull default:
87 7a4ee46d 2003-11-23 devnull usage();
88 7a4ee46d 2003-11-23 devnull break;
89 7a4ee46d 2003-11-23 devnull }ARGEND
90 7a4ee46d 2003-11-23 devnull
91 7a4ee46d 2003-11-23 devnull if(!fix)
92 7a4ee46d 2003-11-23 devnull readonly = 1;
93 7a4ee46d 2003-11-23 devnull
94 7a4ee46d 2003-11-23 devnull if(argc != 1)
95 7a4ee46d 2003-11-23 devnull usage();
96 7a4ee46d 2003-11-23 devnull
97 7a4ee46d 2003-11-23 devnull file = argv[0];
98 7a4ee46d 2003-11-23 devnull
99 7a4ee46d 2003-11-23 devnull part = initpart(file, 0);
100 7a4ee46d 2003-11-23 devnull if(part == nil)
101 7a4ee46d 2003-11-23 devnull sysfatal("can't open partition %s: %r", file);
102 7a4ee46d 2003-11-23 devnull
103 7a4ee46d 2003-11-23 devnull ap = initarenapart(part);
104 7a4ee46d 2003-11-23 devnull if(ap == nil)
105 7a4ee46d 2003-11-23 devnull sysfatal("can't initialize arena partition in %s: %r", file);
106 7a4ee46d 2003-11-23 devnull
107 7a4ee46d 2003-11-23 devnull if(verbose > 1){
108 7a4ee46d 2003-11-23 devnull printarenapart(2, ap);
109 7a4ee46d 2003-11-23 devnull fprint(2, "\n");
110 7a4ee46d 2003-11-23 devnull }
111 7a4ee46d 2003-11-23 devnull
112 7a4ee46d 2003-11-23 devnull initdcache(8 * MaxDiskBlock);
113 7a4ee46d 2003-11-23 devnull
114 7a4ee46d 2003-11-23 devnull for(i = 0; i < ap->narenas; i++)
115 7a4ee46d 2003-11-23 devnull checkarena(ap->arenas[i], scan, fix);
116 7a4ee46d 2003-11-23 devnull
117 7a4ee46d 2003-11-23 devnull if(verbose > 1)
118 7a4ee46d 2003-11-23 devnull printstats();
119 7a4ee46d 2003-11-23 devnull threadexitsall(0);
120 7a4ee46d 2003-11-23 devnull }