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