123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #include "stdinc.h"
- #include "dat.h"
- #include "fns.h"
- static int verbose;
- static void
- checkarena(Arena *arena, int scan, int fix)
- {
- ATailStats old;
- int err, e;
- if(verbose && arena->memstats.clumps)
- printarena(2, arena);
- old = arena->memstats;
- if(scan){
- arena->memstats.used = 0;
- arena->memstats.clumps = 0;
- arena->memstats.cclumps = 0;
- arena->memstats.uncsize = 0;
- }
- err = 0;
- for(;;){
- e = syncarena(arena, 1000, 0, fix);
- err |= e;
- if(!(e & SyncHeader))
- break;
- if(verbose && arena->memstats.clumps)
- fprint(2, ".");
- }
- if(verbose && arena->memstats.clumps)
- fprint(2, "\n");
- err &= ~SyncHeader;
- if(arena->memstats.used != old.used
- || arena->memstats.clumps != old.clumps
- || arena->memstats.cclumps != old.cclumps
- || arena->memstats.uncsize != old.uncsize){
- fprint(2, "%s: incorrect arena header fields\n", arena->name);
- printarena(2, arena);
- err |= SyncHeader;
- }
- if(!err || !fix)
- return;
- fprint(2, "%s: writing fixed arena header fields\n", arena->name);
- arena->diskstats = arena->memstats;
- if(wbarena(arena) < 0)
- fprint(2, "arena header write failed: %r\n");
- flushdcache();
- }
- void
- usage(void)
- {
- fprint(2, "usage: checkarenas [-afv] file [arenaname...]\n");
- threadexitsall(0);
- }
- int
- should(char *name, int argc, char **argv)
- {
- int i;
- if(argc == 0)
- return 1;
- for(i=0; i<argc; i++)
- if(strcmp(name, argv[i]) == 0)
- return 1;
- return 0;
- }
- void
- threadmain(int argc, char *argv[])
- {
- ArenaPart *ap;
- Part *part;
- char *file;
- int i, fix, scan;
- ventifmtinstall();
- statsinit();
- fix = 0;
- scan = 0;
- ARGBEGIN{
- case 'f':
- fix++;
- break;
- case 'a':
- scan = 1;
- break;
- case 'v':
- verbose++;
- break;
- default:
- usage();
- break;
- }ARGEND
- if(!fix)
- readonly = 1;
- if(argc < 1)
- usage();
- file = argv[0];
- argc--;
- argv++;
- part = initpart(file, (fix ? ORDWR : OREAD)|ODIRECT);
- if(part == nil)
- sysfatal("can't open partition %s: %r", file);
- ap = initarenapart(part);
- if(ap == nil)
- sysfatal("can't initialize arena partition in %s: %r", file);
- if(verbose > 1){
- printarenapart(2, ap);
- fprint(2, "\n");
- }
- initdcache(8 * MaxDiskBlock);
- for(i = 0; i < ap->narenas; i++)
- if(should(ap->arenas[i]->name, argc, argv))
- checkarena(ap->arenas[i], scan, fix);
- if(verbose > 1)
- printstats();
- threadexitsall(0);
- }
|