- n++;
- if (ALLOC(dp)) {
- if (!isset(cgrp.cg_iused, i)) {
- if (debug)
- printf("%d bad, not used\n",
- inumber);
- inosumbad++;
- }
- n--;
- lastino = inumber;
- 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;
- 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;
- }
- 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;
- idesc.id_filesize = 0;
- (void)ckinode(dp, &idesc);
- idesc.id_filesize *= btodb(sblock.fs_fsize);
- if (dp->di_blocks != idesc.id_filesize) {
- pwarn("INCORRECT BLOCK COUNT I=%u (%ld should be %ld)",
- inumber, dp->di_blocks,
- idesc.id_filesize);
- if (preen)
- printf(" (CORRECTED)\n");
- else if (reply("CORRECT") == 0)
- continue;
- dp->di_blocks = idesc.id_filesize;
- inodirty();
- }
- continue;
- unknown:
- pfatal("UNKNOWN FILE TYPE I=%u", inumber);
- if (reply("CLEAR") == 1) {
- zapino(dp);
- inodirty();
- inosumbad++;
- }
- } else {
- if (isset(cgrp.cg_iused, i)) {
- if (debug)
- printf("%d bad, marked used\n",
- inumber);
- inosumbad++;
- n--;
- }
- partial = 0;
- for (j = 0; j < NDADDR; j++)
- if (dp->di_db[j] != 0)
- partial++;
- for (j = 0; j < NIADDR; j++)
- if (dp->di_ib[j] != 0)
- partial++;
- if (partial || dp->di_mode != 0 ||
- dp->di_size != 0) {