18fae3551SRodney W. Grimes /* 28fae3551SRodney W. Grimes * Copyright (c) 1980, 1986, 1993 38fae3551SRodney W. Grimes * The Regents of the University of California. All rights reserved. 48fae3551SRodney W. Grimes * 58fae3551SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 68fae3551SRodney W. Grimes * modification, are permitted provided that the following conditions 78fae3551SRodney W. Grimes * are met: 88fae3551SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 98fae3551SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 108fae3551SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 118fae3551SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 128fae3551SRodney W. Grimes * documentation and/or other materials provided with the distribution. 138fae3551SRodney W. Grimes * 3. All advertising materials mentioning features or use of this software 148fae3551SRodney W. Grimes * must display the following acknowledgement: 158fae3551SRodney W. Grimes * This product includes software developed by the University of 168fae3551SRodney W. Grimes * California, Berkeley and its contributors. 178fae3551SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 188fae3551SRodney W. Grimes * may be used to endorse or promote products derived from this software 198fae3551SRodney W. Grimes * without specific prior written permission. 208fae3551SRodney W. Grimes * 218fae3551SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 228fae3551SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 238fae3551SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 248fae3551SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 258fae3551SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 268fae3551SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 278fae3551SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 288fae3551SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 298fae3551SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 308fae3551SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 318fae3551SRodney W. Grimes * SUCH DAMAGE. 328fae3551SRodney W. Grimes */ 338fae3551SRodney W. Grimes 348fae3551SRodney W. Grimes #ifndef lint 358fae3551SRodney W. Grimes static char sccsid[] = "@(#)pass4.c 8.1 (Berkeley) 6/5/93"; 368fae3551SRodney W. Grimes #endif /* not lint */ 378fae3551SRodney W. Grimes 388fae3551SRodney W. Grimes #include <sys/param.h> 398fae3551SRodney W. Grimes #include <sys/time.h> 408fae3551SRodney W. Grimes #include <ufs/ufs/dinode.h> 418fae3551SRodney W. Grimes #include <ufs/ffs/fs.h> 428fae3551SRodney W. Grimes #include <stdlib.h> 438fae3551SRodney W. Grimes #include <string.h> 448fae3551SRodney W. Grimes #include "fsck.h" 458fae3551SRodney W. Grimes 468fae3551SRodney W. Grimes int pass4check(); 478fae3551SRodney W. Grimes 488fae3551SRodney W. Grimes pass4() 498fae3551SRodney W. Grimes { 508fae3551SRodney W. Grimes register ino_t inumber; 518fae3551SRodney W. Grimes register struct zlncnt *zlnp; 528fae3551SRodney W. Grimes struct dinode *dp; 538fae3551SRodney W. Grimes struct inodesc idesc; 548fae3551SRodney W. Grimes int n; 558fae3551SRodney W. Grimes 568fae3551SRodney W. Grimes bzero((char *)&idesc, sizeof(struct inodesc)); 578fae3551SRodney W. Grimes idesc.id_type = ADDR; 588fae3551SRodney W. Grimes idesc.id_func = pass4check; 598fae3551SRodney W. Grimes for (inumber = ROOTINO; inumber <= lastino; inumber++) { 608fae3551SRodney W. Grimes idesc.id_number = inumber; 618fae3551SRodney W. Grimes switch (statemap[inumber]) { 628fae3551SRodney W. Grimes 638fae3551SRodney W. Grimes case FSTATE: 648fae3551SRodney W. Grimes case DFOUND: 658fae3551SRodney W. Grimes n = lncntp[inumber]; 668fae3551SRodney W. Grimes if (n) 678fae3551SRodney W. Grimes adjust(&idesc, (short)n); 688fae3551SRodney W. Grimes else { 698fae3551SRodney W. Grimes for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 708fae3551SRodney W. Grimes if (zlnp->zlncnt == inumber) { 718fae3551SRodney W. Grimes zlnp->zlncnt = zlnhead->zlncnt; 728fae3551SRodney W. Grimes zlnp = zlnhead; 738fae3551SRodney W. Grimes zlnhead = zlnhead->next; 748fae3551SRodney W. Grimes free((char *)zlnp); 758fae3551SRodney W. Grimes clri(&idesc, "UNREF", 1); 768fae3551SRodney W. Grimes break; 778fae3551SRodney W. Grimes } 788fae3551SRodney W. Grimes } 798fae3551SRodney W. Grimes break; 808fae3551SRodney W. Grimes 818fae3551SRodney W. Grimes case DSTATE: 828fae3551SRodney W. Grimes clri(&idesc, "UNREF", 1); 838fae3551SRodney W. Grimes break; 848fae3551SRodney W. Grimes 858fae3551SRodney W. Grimes case DCLEAR: 868fae3551SRodney W. Grimes dp = ginode(inumber); 878fae3551SRodney W. Grimes if (dp->di_size == 0) { 888fae3551SRodney W. Grimes clri(&idesc, "ZERO LENGTH", 1); 898fae3551SRodney W. Grimes break; 908fae3551SRodney W. Grimes } 918fae3551SRodney W. Grimes /* fall through */ 928fae3551SRodney W. Grimes case FCLEAR: 938fae3551SRodney W. Grimes clri(&idesc, "BAD/DUP", 1); 948fae3551SRodney W. Grimes break; 958fae3551SRodney W. Grimes 968fae3551SRodney W. Grimes case USTATE: 978fae3551SRodney W. Grimes break; 988fae3551SRodney W. Grimes 998fae3551SRodney W. Grimes default: 1008fae3551SRodney W. Grimes errexit("BAD STATE %d FOR INODE I=%d", 1018fae3551SRodney W. Grimes statemap[inumber], inumber); 1028fae3551SRodney W. Grimes } 1038fae3551SRodney W. Grimes } 1048fae3551SRodney W. Grimes } 1058fae3551SRodney W. Grimes 1068fae3551SRodney W. Grimes pass4check(idesc) 1078fae3551SRodney W. Grimes register struct inodesc *idesc; 1088fae3551SRodney W. Grimes { 1098fae3551SRodney W. Grimes register struct dups *dlp; 1108fae3551SRodney W. Grimes int nfrags, res = KEEPON; 1118fae3551SRodney W. Grimes daddr_t blkno = idesc->id_blkno; 1128fae3551SRodney W. Grimes 1138fae3551SRodney W. Grimes for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 1148fae3551SRodney W. Grimes if (chkrange(blkno, 1)) { 1158fae3551SRodney W. Grimes res = SKIP; 1168fae3551SRodney W. Grimes } else if (testbmap(blkno)) { 1178fae3551SRodney W. Grimes for (dlp = duplist; dlp; dlp = dlp->next) { 1188fae3551SRodney W. Grimes if (dlp->dup != blkno) 1198fae3551SRodney W. Grimes continue; 1208fae3551SRodney W. Grimes dlp->dup = duplist->dup; 1218fae3551SRodney W. Grimes dlp = duplist; 1228fae3551SRodney W. Grimes duplist = duplist->next; 1238fae3551SRodney W. Grimes free((char *)dlp); 1248fae3551SRodney W. Grimes break; 1258fae3551SRodney W. Grimes } 1268fae3551SRodney W. Grimes if (dlp == 0) { 1278fae3551SRodney W. Grimes clrbmap(blkno); 1288fae3551SRodney W. Grimes n_blks--; 1298fae3551SRodney W. Grimes } 1308fae3551SRodney W. Grimes } 1318fae3551SRodney W. Grimes } 1328fae3551SRodney W. Grimes return (res); 1338fae3551SRodney W. Grimes } 134