summaryrefslogtreecommitdiff
path: root/ufs-fsck/pass1b.c
diff options
context:
space:
mode:
Diffstat (limited to 'ufs-fsck/pass1b.c')
-rw-r--r--ufs-fsck/pass1b.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/ufs-fsck/pass1b.c b/ufs-fsck/pass1b.c
index c259a6ad..0eaf6198 100644
--- a/ufs-fsck/pass1b.c
+++ b/ufs-fsck/pass1b.c
@@ -1,4 +1,4 @@
-/* Pass 1b of fsck
+/* Pass 1b of fsck -- scan inodes for references to duplicate blocks
Copyright (C) 1994 Free Software Foundation, Inc.
Written by Michael I. Bushnell.
@@ -25,6 +25,7 @@ pass1b ()
int cg, i;
ino_t number;
int dupblk;
+ struct dups *duphead = duplist;
/* Check each block of file DP; if the block is in the dup block
list then add it to the dup block list under this file.
@@ -34,6 +35,7 @@ pass1b ()
checkblock (daddr_t bno, int nfrags)
{
struct dups *dlp;
+ int hadbad = 0;
for (nfrags; nfrags > 0; bno++, nfrags--)
{
@@ -45,19 +47,18 @@ pass1b ()
{
if (!dupblk)
printf ("I=%lu HAD DUPLICATE BLOCKS\n", number);
- dupblk = 1;
+ dupblk++;
printf ("DUPLICATE BLOCK %d\n", bno);
dlp->dup = duphead->dup;
duphead->dup = blkno;
duphead = duphead->next;
+ hadbad = 1;
}
if (dlp == muldup)
break;
}
- if (muldup == 0 || duphead == muldup->next)
- return RET_BAD;
}
- return RET_GOOD;
+ return hadbad ? RET_BAD : RET_GOOD;
}
/* Call CHECKBLOCK for each block of each node, to see if it holds
@@ -72,6 +73,16 @@ pass1b ()
getinode (number, dp);
dupblk = 0;
allblock_iterate (dp, checkblock);
+ if (dupblk)
+ {
+ printf ("I=%ld has %d DUPLICATE BLOCKS\n", number, dupblk);
+ if (reply ("CLEAR"))
+ {
+ clear_inode (number, dp);
+ inode_state[number] = UNALLOC;
+ }
+ else if (inodestate[number] == DIR)
+ inodestate[number] = BADDIR;
}
}
}