1 #ifndef lint 2 static char version[] = "@(#)pass4.c 3.3 (Berkeley) 05/31/85"; 3 #endif 4 5 #include <sys/param.h> 6 #include <sys/inode.h> 7 #include <sys/fs.h> 8 #include "fsck.h" 9 10 int pass4check(); 11 12 pass4() 13 { 14 register ino_t inumber, *blp; 15 int n; 16 struct inodesc idesc; 17 18 bzero((char *)&idesc, sizeof(struct inodesc)); 19 idesc.id_type = ADDR; 20 idesc.id_func = pass4check; 21 for (inumber = ROOTINO; inumber <= lastino; inumber++) { 22 idesc.id_number = inumber; 23 switch (statemap[inumber]) { 24 25 case FSTATE: 26 case DFOUND: 27 n = lncntp[inumber]; 28 if (n) 29 adjust(&idesc, (short)n); 30 else { 31 for (blp = badlncnt;blp < badlnp; blp++) 32 if (*blp == inumber) { 33 clri(&idesc, "UNREF", 1); 34 break; 35 } 36 } 37 break; 38 39 case DSTATE: 40 clri(&idesc, "UNREF", 1); 41 break; 42 43 case DCLEAR: 44 case FCLEAR: 45 clri(&idesc, "BAD/DUP", 1); 46 break; 47 } 48 } 49 } 50 51 pass4check(idesc) 52 register struct inodesc *idesc; 53 { 54 register struct dups *dlp; 55 int nfrags, res = KEEPON; 56 daddr_t blkno = idesc->id_blkno; 57 58 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 59 if (outrange(blkno, 1)) { 60 res = SKIP; 61 } else if (getbmap(blkno)) { 62 for (dlp = duplist; dlp; dlp = dlp->next) { 63 if (dlp->dup != blkno) 64 continue; 65 dlp->dup = duplist->dup; 66 dlp = duplist; 67 duplist = duplist->next; 68 free(dlp); 69 break; 70 } 71 if (dlp == 0) { 72 clrbmap(blkno); 73 n_blks--; 74 } 75 } 76 } 77 return (res); 78 } 79