dynamically allocate the duplicate block table
[unix-history] / usr / src / sbin / fsck / pass4.c
#ifndef lint
static char version[] = "@(#)pass4.c 3.3 (Berkeley) %G%";
#endif
#include <sys/param.h>
#include <sys/inode.h>
#include <sys/fs.h>
#include "fsck.h"
int pass4check();
pass4()
{
register ino_t inumber, *blp;
int n;
struct inodesc idesc;
bzero((char *)&idesc, sizeof(struct inodesc));
idesc.id_type = ADDR;
idesc.id_func = pass4check;
for (inumber = ROOTINO; inumber <= lastino; inumber++) {
idesc.id_number = inumber;
switch (statemap[inumber]) {
case FSTATE:
case DFOUND:
n = lncntp[inumber];
if (n)
adjust(&idesc, (short)n);
else {
for (blp = badlncnt;blp < badlnp; blp++)
if (*blp == inumber) {
clri(&idesc, "UNREF", 1);
break;
}
}
break;
case DSTATE:
clri(&idesc, "UNREF", 1);
break;
case DCLEAR:
case FCLEAR:
clri(&idesc, "BAD/DUP", 1);
break;
}
}
}
pass4check(idesc)
register struct inodesc *idesc;
{
register struct dups *dlp;
int nfrags, res = KEEPON;
daddr_t blkno = idesc->id_blkno;
for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
if (outrange(blkno, 1)) {
res = SKIP;
} else if (getbmap(blkno)) {
for (dlp = duplist; dlp; dlp = dlp->next) {
if (dlp->dup != blkno)
continue;
dlp->dup = duplist->dup;
dlp = duplist;
duplist = duplist->next;
free(dlp);
break;
}
if (dlp == 0) {
clrbmap(blkno);
n_blks--;
}
}
}
return (res);
}