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"
5 7a4ee46d 2003-11-23 devnull static int verbose;
7 7a4ee46d 2003-11-23 devnull static void
8 7a4ee46d 2003-11-23 devnull checkarena(Arena *arena, int scan, int fix)
10 7a4ee46d 2003-11-23 devnull Arena old;
11 7a4ee46d 2003-11-23 devnull int err, e;
13 7a4ee46d 2003-11-23 devnull if(verbose && arena->clumps)
14 7a4ee46d 2003-11-23 devnull printarena(2, arena);
16 7a4ee46d 2003-11-23 devnull old = *arena;
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;
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))
31 7a4ee46d 2003-11-23 devnull if(verbose && arena->clumps)
32 7a4ee46d 2003-11-23 devnull fprint(2, ".");
34 7a4ee46d 2003-11-23 devnull if(verbose && arena->clumps)
35 7a4ee46d 2003-11-23 devnull fprint(2, "\n");
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;
47 7a4ee46d 2003-11-23 devnull if(!err || !fix)
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");
56 7a4ee46d 2003-11-23 devnull usage(void)
58 7a4ee46d 2003-11-23 devnull fprint(2, "usage: checkarenas [-afv] file\n");
59 7a4ee46d 2003-11-23 devnull threadexitsall(0);
63 7a4ee46d 2003-11-23 devnull threadmain(int argc, char *argv[])
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;
70 7a4ee46d 2003-11-23 devnull fmtinstall('V', vtscorefmt);
72 7a4ee46d 2003-11-23 devnull statsinit();
75 7a4ee46d 2003-11-23 devnull scan = 0;
76 7a4ee46d 2003-11-23 devnull ARGBEGIN{
77 7a4ee46d 2003-11-23 devnull case 'f':
80 7a4ee46d 2003-11-23 devnull case 'a':
81 7a4ee46d 2003-11-23 devnull scan = 1;
83 7a4ee46d 2003-11-23 devnull case 'v':
84 7a4ee46d 2003-11-23 devnull verbose++;
92 7a4ee46d 2003-11-23 devnull readonly = 1;
94 7a4ee46d 2003-11-23 devnull if(argc != 1)
97 7a4ee46d 2003-11-23 devnull file = argv[0];
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);
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);
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");
112 7a4ee46d 2003-11-23 devnull initdcache(8 * MaxDiskBlock);
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);
117 7a4ee46d 2003-11-23 devnull if(verbose > 1)
118 7a4ee46d 2003-11-23 devnull printstats();
119 7a4ee46d 2003-11-23 devnull threadexitsall(0);