Blame


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