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.4 (Berkeley) 06/26/89"; 9 #endif not lint 10 11 #include <sys/param.h> 12 #include <sys/time.h> 13 #include <sys/vnode.h> 14 #include <ufs/inode.h> 15 #include <ufs/fs.h> 16 #include "fsck.h" 17 18 int pass4check(); 19 20 pass4() 21 { 22 register ino_t inumber; 23 register struct zlncnt *zlnp; 24 struct inodesc idesc; 25 int n; 26 27 bzero((char *)&idesc, sizeof(struct inodesc)); 28 idesc.id_type = ADDR; 29 idesc.id_func = pass4check; 30 for (inumber = ROOTINO; inumber <= lastino; inumber++) { 31 idesc.id_number = inumber; 32 switch (statemap[inumber]) { 33 34 case FSTATE: 35 case DFOUND: 36 n = lncntp[inumber]; 37 if (n) 38 adjust(&idesc, (short)n); 39 else { 40 for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 41 if (zlnp->zlncnt == inumber) { 42 zlnp->zlncnt = zlnhead->zlncnt; 43 zlnp = zlnhead; 44 zlnhead = zlnhead->next; 45 free(zlnp); 46 clri(&idesc, "UNREF", 1); 47 break; 48 } 49 } 50 break; 51 52 case DSTATE: 53 clri(&idesc, "UNREF", 1); 54 break; 55 56 case DCLEAR: 57 case FCLEAR: 58 clri(&idesc, "BAD/DUP", 1); 59 break; 60 61 case USTATE: 62 break; 63 64 default: 65 errexit("BAD STATE %d FOR INODE I=%d", 66 statemap[inumber], inumber); 67 } 68 } 69 } 70 71 pass4check(idesc) 72 register struct inodesc *idesc; 73 { 74 register struct dups *dlp; 75 int nfrags, res = KEEPON; 76 daddr_t blkno = idesc->id_blkno; 77 78 for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 79 if (outrange(blkno, 1)) { 80 res = SKIP; 81 } else if (getbmap(blkno)) { 82 for (dlp = duplist; dlp; dlp = dlp->next) { 83 if (dlp->dup != blkno) 84 continue; 85 dlp->dup = duplist->dup; 86 dlp = duplist; 87 duplist = duplist->next; 88 free(dlp); 89 break; 90 } 91 if (dlp == 0) { 92 clrbmap(blkno); 93 n_blks--; 94 } 95 } 96 } 97 return (res); 98 } 99