122052Sdist /* 222052Sdist * Copyright (c) 1980 Regents of the University of California. 322052Sdist * All rights reserved. The Berkeley software License Agreement 422052Sdist * specifies the terms and conditions for redistribution. 522052Sdist */ 622052Sdist 716266Smckusick #ifndef lint 8*26479Smckusick static char sccsid[] = "@(#)pass4.c 5.2 (Berkeley) 03/05/86"; 922052Sdist #endif not lint 1016266Smckusick 1116266Smckusick #include <sys/param.h> 1216266Smckusick #include <sys/inode.h> 1316266Smckusick #include <sys/fs.h> 1416266Smckusick #include "fsck.h" 1516266Smckusick 1616266Smckusick int pass4check(); 1716266Smckusick 1816266Smckusick pass4() 1916266Smckusick { 2021759Smckusick register ino_t inumber; 2121759Smckusick register struct zlncnt *zlnp; 2221759Smckusick struct inodesc idesc; 2316266Smckusick int n; 2416266Smckusick 2516266Smckusick bzero((char *)&idesc, sizeof(struct inodesc)); 2616266Smckusick idesc.id_type = ADDR; 2716266Smckusick idesc.id_func = pass4check; 2816266Smckusick for (inumber = ROOTINO; inumber <= lastino; inumber++) { 2916266Smckusick idesc.id_number = inumber; 3016266Smckusick switch (statemap[inumber]) { 3116266Smckusick 3216266Smckusick case FSTATE: 3317937Smckusick case DFOUND: 3416266Smckusick n = lncntp[inumber]; 3516266Smckusick if (n) 3616266Smckusick adjust(&idesc, (short)n); 3716266Smckusick else { 3821759Smckusick for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 3921759Smckusick if (zlnp->zlncnt == inumber) { 40*26479Smckusick zlnp->zlncnt = zlnhead->zlncnt; 41*26479Smckusick zlnp = zlnhead; 42*26479Smckusick zlnhead = zlnhead->next; 43*26479Smckusick free(zlnp); 4416266Smckusick clri(&idesc, "UNREF", 1); 4516266Smckusick break; 4616266Smckusick } 4716266Smckusick } 4816266Smckusick break; 4916266Smckusick 5016266Smckusick case DSTATE: 5116266Smckusick clri(&idesc, "UNREF", 1); 5216266Smckusick break; 5316266Smckusick 5417937Smckusick case DCLEAR: 5517937Smckusick case FCLEAR: 5616266Smckusick clri(&idesc, "BAD/DUP", 1); 5716266Smckusick break; 5816266Smckusick } 5916266Smckusick } 6016266Smckusick } 6116266Smckusick 6216266Smckusick pass4check(idesc) 6316266Smckusick register struct inodesc *idesc; 6416266Smckusick { 6521744Smckusick register struct dups *dlp; 6616266Smckusick int nfrags, res = KEEPON; 6716266Smckusick daddr_t blkno = idesc->id_blkno; 6816266Smckusick 6916266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 7021744Smckusick if (outrange(blkno, 1)) { 7116266Smckusick res = SKIP; 7221744Smckusick } else if (getbmap(blkno)) { 7321744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 7421744Smckusick if (dlp->dup != blkno) 7521744Smckusick continue; 7621744Smckusick dlp->dup = duplist->dup; 7721744Smckusick dlp = duplist; 7821744Smckusick duplist = duplist->next; 79*26479Smckusick free(dlp); 8021744Smckusick break; 8121744Smckusick } 8221744Smckusick if (dlp == 0) { 8321744Smckusick clrbmap(blkno); 8421744Smckusick n_blks--; 8521744Smckusick } 8616266Smckusick } 8716266Smckusick } 8816266Smckusick return (res); 8916266Smckusick } 90