+ statemap[inumber] = USTATE;
+ continue;
+ }
+ lastino = inumber;
+ if (dp->di_size < 0) {
+ if (debug)
+ printf("bad size %d:", dp->di_size);
+ goto unknown;
+ }
+ ndb = howmany(dp->di_size, sblock.fs_bsize);
+ if (SPECIAL(dp))
+ ndb++;
+ for (j = ndb; j < NDADDR; j++)
+ if (dp->di_db[j] != 0) {
+ if (debug)
+ printf("bad direct addr: %d\n",
+ dp->di_db[j]);
+ goto unknown;
+ }
+ for (j = 0, ndb -= NDADDR; ndb > 0; j++)
+ ndb /= NINDIR(&sblock);
+ for (; j < NIADDR; j++)
+ if (dp->di_ib[j] != 0) {
+ if (debug)
+ printf("bad indirect addr: %d\n",
+ dp->di_ib[j]);
+ goto unknown;
+ }
+ if (!preen && (dp->di_mode & IFMT) == IFMT &&
+ reply("HOLD BAD BLOCK") == 1) {
+ dp->di_size = sblock.fs_fsize;
+ dp->di_mode = IFREG|0600;
+ inodirty();
+ } else if (ftypeok(dp) == 0)
+ goto unknown;
+ n_files++;
+ lncntp[inumber] = dp->di_nlink;
+ if (dp->di_nlink <= 0) {
+ if (badlnp < &badlncnt[MAXLNCNT])
+ *badlnp++ = inumber;
+ else {
+ pfatal("LINK COUNT TABLE OVERFLOW");
+ if (reply("CONTINUE") == 0)
+ errexit("");
+ }
+ }
+ statemap[inumber] = DIRCT(dp) ? DSTATE : FSTATE;
+ badblk = dupblk = 0; maxblk = 0;
+ idesc.id_number = inumber;
+ (void)ckinode(dp, &idesc);
+ idesc.id_entryno *= btodb(sblock.fs_fsize);
+ if (dp->di_blocks != idesc.id_entryno) {
+ pwarn("INCORRECT BLOCK COUNT I=%u (%ld should be %ld)",
+ inumber, dp->di_blocks, idesc.id_entryno);
+ if (preen)
+ printf(" (CORRECTED)\n");
+ else if (reply("CORRECT") == 0)
+ continue;
+ dp->di_blocks = idesc.id_entryno;
+ inodirty();
+ }
+ continue;
+ unknown:
+ pfatal("UNKNOWN FILE TYPE I=%u", inumber);
+ if (reply("CLEAR") == 1) {
+ zapino(dp);
+ inodirty();