checkarenas.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. static int verbose;
  5. static void
  6. checkArena(Arena *arena, int scan, int fix)
  7. {
  8. Arena old;
  9. int err, e;
  10. if(verbose && arena->clumps)
  11. printArena(2, arena);
  12. old = *arena;
  13. if(scan){
  14. arena->used = 0;
  15. arena->clumps = 0;
  16. arena->cclumps = 0;
  17. arena->uncsize = 0;
  18. }
  19. err = 0;
  20. for(;;){
  21. e = syncArena(arena, 1000, 0, fix);
  22. err |= e;
  23. if(!(e & SyncHeader))
  24. break;
  25. if(verbose && arena->clumps)
  26. fprint(2, ".");
  27. }
  28. if(verbose && arena->clumps)
  29. fprint(2, "\n");
  30. err &= ~SyncHeader;
  31. if(arena->used != old.used
  32. || arena->clumps != old.clumps
  33. || arena->cclumps != old.cclumps
  34. || arena->uncsize != old.uncsize){
  35. fprint(2, "incorrect arena header fields\n");
  36. printArena(2, arena);
  37. err |= SyncHeader;
  38. }
  39. if(!err || !fix)
  40. return;
  41. fprint(2, "writing fixed arena header fields\n");
  42. if(!wbArena(arena))
  43. fprint(2, "arena header write failed: %r\n");
  44. }
  45. void
  46. usage(void)
  47. {
  48. fprint(2, "usage: checkarenas [-afv] file\n");
  49. exits(0);
  50. }
  51. int
  52. main(int argc, char *argv[])
  53. {
  54. ArenaPart *ap;
  55. Part *part;
  56. char *file;
  57. int i, fix, scan;
  58. fmtinstall('V', vtScoreFmt);
  59. fmtinstall('R', vtErrFmt);
  60. vtAttach();
  61. statsInit();
  62. fix = 0;
  63. scan = 0;
  64. ARGBEGIN{
  65. case 'f':
  66. fix++;
  67. break;
  68. case 'a':
  69. scan = 1;
  70. break;
  71. case 'v':
  72. verbose++;
  73. break;
  74. default:
  75. usage();
  76. break;
  77. }ARGEND
  78. if(!fix)
  79. readonly = 1;
  80. if(argc != 1)
  81. usage();
  82. file = argv[0];
  83. part = initPart(file, 0);
  84. if(part == nil)
  85. fatal("can't open partition %s: %r", file);
  86. ap = initArenaPart(part);
  87. if(ap == nil)
  88. fatal("can't initialize arena partition in %s: %R", file);
  89. if(verbose > 1){
  90. printArenaPart(2, ap);
  91. fprint(2, "\n");
  92. }
  93. initDCache(8 * MaxDiskBlock);
  94. for(i = 0; i < ap->narenas; i++)
  95. checkArena(ap->arenas[i], scan, fix);
  96. if(verbose > 1)
  97. printStats();
  98. exits(0);
  99. return 0; /* shut up stupid compiler */
  100. }