1*22052Sdist /* 2*22052Sdist * Copyright (c) 1980 Regents of the University of California. 3*22052Sdist * All rights reserved. The Berkeley software License Agreement 4*22052Sdist * specifies the terms and conditions for redistribution. 5*22052Sdist */ 6*22052Sdist 716266Smckusick #ifndef lint 8*22052Sdist static char sccsid[] = "@(#)pass4.c 5.1 (Berkeley) 06/05/85"; 9*22052Sdist #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) { 4016266Smckusick clri(&idesc, "UNREF", 1); 4116266Smckusick break; 4216266Smckusick } 4316266Smckusick } 4416266Smckusick break; 4516266Smckusick 4616266Smckusick case DSTATE: 4716266Smckusick clri(&idesc, "UNREF", 1); 4816266Smckusick break; 4916266Smckusick 5017937Smckusick case DCLEAR: 5117937Smckusick case FCLEAR: 5216266Smckusick clri(&idesc, "BAD/DUP", 1); 5316266Smckusick break; 5416266Smckusick } 5516266Smckusick } 5616266Smckusick } 5716266Smckusick 5816266Smckusick pass4check(idesc) 5916266Smckusick register struct inodesc *idesc; 6016266Smckusick { 6121744Smckusick register struct dups *dlp; 6216266Smckusick int nfrags, res = KEEPON; 6316266Smckusick daddr_t blkno = idesc->id_blkno; 6416266Smckusick 6516266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 6621744Smckusick if (outrange(blkno, 1)) { 6716266Smckusick res = SKIP; 6821744Smckusick } else if (getbmap(blkno)) { 6921744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 7021744Smckusick if (dlp->dup != blkno) 7121744Smckusick continue; 7221744Smckusick dlp->dup = duplist->dup; 7321744Smckusick dlp = duplist; 7421744Smckusick duplist = duplist->next; 7521759Smckusick /* free(dlp); */ 7621744Smckusick break; 7721744Smckusick } 7821744Smckusick if (dlp == 0) { 7921744Smckusick clrbmap(blkno); 8021744Smckusick n_blks--; 8121744Smckusick } 8216266Smckusick } 8316266Smckusick } 8416266Smckusick return (res); 8516266Smckusick } 86