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*39972Smckusick static char sccsid[] = "@(#)pass4.c 5.6 (Berkeley) 02/01/90"; 922052Sdist #endif not lint 1016266Smckusick 1116266Smckusick #include <sys/param.h> 1239383Smckusick #include <ufs/dinode.h> 1338337Smckusick #include <ufs/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) { 4026479Smckusick zlnp->zlncnt = zlnhead->zlncnt; 4126479Smckusick zlnp = zlnhead; 4226479Smckusick zlnhead = zlnhead->next; 43*39972Smckusick free((char *)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; 5826480Smckusick 5926480Smckusick case USTATE: 6026480Smckusick break; 6126480Smckusick 6226480Smckusick default: 6326480Smckusick errexit("BAD STATE %d FOR INODE I=%d", 6426480Smckusick statemap[inumber], inumber); 6516266Smckusick } 6616266Smckusick } 6716266Smckusick } 6816266Smckusick 6916266Smckusick pass4check(idesc) 7016266Smckusick register struct inodesc *idesc; 7116266Smckusick { 7221744Smckusick register struct dups *dlp; 7316266Smckusick int nfrags, res = KEEPON; 7416266Smckusick daddr_t blkno = idesc->id_blkno; 7516266Smckusick 7616266Smckusick for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 77*39972Smckusick if (chkrange(blkno, 1)) { 7816266Smckusick res = SKIP; 79*39972Smckusick } else if (testbmap(blkno)) { 8021744Smckusick for (dlp = duplist; dlp; dlp = dlp->next) { 8121744Smckusick if (dlp->dup != blkno) 8221744Smckusick continue; 8321744Smckusick dlp->dup = duplist->dup; 8421744Smckusick dlp = duplist; 8521744Smckusick duplist = duplist->next; 86*39972Smckusick free((char *)dlp); 8721744Smckusick break; 8821744Smckusick } 8921744Smckusick if (dlp == 0) { 9021744Smckusick clrbmap(blkno); 9121744Smckusick n_blks--; 9221744Smckusick } 9316266Smckusick } 9416266Smckusick } 9516266Smckusick return (res); 9616266Smckusick } 97