116266Smckusick #ifndef lint 2*21744Smckusick static char version[] = "@(#)pass4.c 3.3 (Berkeley) 05/31/85"; 316266Smckusick #endif 416266Smckusick 516266Smckusick #include <sys/param.h> 616266Smckusick #include <sys/inode.h> 716266Smckusick #include <sys/fs.h> 816266Smckusick #include "fsck.h" 916266Smckusick 1016266Smckusick int pass4check(); 1116266Smckusick 1216266Smckusick pass4() 1316266Smckusick { 1416266Smckusick register ino_t inumber, *blp; 1516266Smckusick int n; 1616266Smckusick struct inodesc idesc; 1716266Smckusick 1816266Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 1916266Smckusick idesc.id_type = ADDR; 2016266Smckusick idesc.id_func = pass4check; 2116266Smckusick for (inumber = ROOTINO; inumber <= lastino; inumber++) { 2216266Smckusick idesc.id_number = inumber; 2316266Smckusick switch (statemap[inumber]) { 2416266Smckusick 2516266Smckusick case FSTATE: 2617937Smckusick case DFOUND: 2716266Smckusick n = lncntp[inumber]; 2816266Smckusick if (n) 2916266Smckusick adjust(&idesc, (short)n); 3016266Smckusick else { 3116266Smckusick for (blp = badlncnt;blp < badlnp; blp++) 3216266Smckusick if (*blp == inumber) { 3316266Smckusick clri(&idesc, "UNREF", 1); 3416266Smckusick break; 3516266Smckusick } 3616266Smckusick } 3716266Smckusick break; 3816266Smckusick 3916266Smckusick case DSTATE: 4016266Smckusick clri(&idesc, "UNREF", 1); 4116266Smckusick break; 4216266Smckusick 4317937Smckusick case DCLEAR: 4417937Smckusick case FCLEAR: 4516266Smckusick clri(&idesc, "BAD/DUP", 1); 4616266Smckusick break; 4716266Smckusick } 4816266Smckusick } 4916266Smckusick } 5016266Smckusick 5116266Smckusick pass4check(idesc) 5216266Smckusick register struct inodesc *idesc; 5316266Smckusick { 54*21744Smckusick register struct dups *dlp; 5516266Smckusick int nfrags, res = KEEPON; 5616266Smckusick daddr_t blkno = idesc->id_blkno; 5716266Smckusick 5816266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 59*21744Smckusick if (outrange(blkno, 1)) { 6016266Smckusick res = SKIP; 61*21744Smckusick } else if (getbmap(blkno)) { 62*21744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 63*21744Smckusick if (dlp->dup != blkno) 64*21744Smckusick continue; 65*21744Smckusick dlp->dup = duplist->dup; 66*21744Smckusick dlp = duplist; 67*21744Smckusick duplist = duplist->next; 68*21744Smckusick free(dlp); 69*21744Smckusick break; 70*21744Smckusick } 71*21744Smckusick if (dlp == 0) { 72*21744Smckusick clrbmap(blkno); 73*21744Smckusick n_blks--; 74*21744Smckusick } 7516266Smckusick } 7616266Smckusick } 7716266Smckusick return (res); 7816266Smckusick } 79