pass4.c revision 7585
1238438Sdteske/* 2238438Sdteske * Copyright (c) 1980, 1986, 1993 3249746Sdteske * The Regents of the University of California. All rights reserved. 4252980Sdteske * 5238438Sdteske * Redistribution and use in source and binary forms, with or without 6238438Sdteske * modification, are permitted provided that the following conditions 7238438Sdteske * are met: 8238438Sdteske * 1. Redistributions of source code must retain the above copyright 9238438Sdteske * notice, this list of conditions and the following disclaimer. 10238438Sdteske * 2. Redistributions in binary form must reproduce the above copyright 11238438Sdteske * notice, this list of conditions and the following disclaimer in the 12238438Sdteske * documentation and/or other materials provided with the distribution. 13238438Sdteske * 3. All advertising materials mentioning features or use of this software 14238438Sdteske * must display the following acknowledgement: 15238438Sdteske * This product includes software developed by the University of 16252987Sdteske * California, Berkeley and its contributors. 17238438Sdteske * 4. Neither the name of the University nor the names of its contributors 18238438Sdteske * may be used to endorse or promote products derived from this software 19238438Sdteske * without specific prior written permission. 20252987Sdteske * 21238438Sdteske * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22238438Sdteske * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23238438Sdteske * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24238438Sdteske * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25238438Sdteske * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26238438Sdteske * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27238438Sdteske * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28238438Sdteske * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29238438Sdteske * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30238438Sdteske * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31240684Sdteske * SUCH DAMAGE. 32240684Sdteske */ 33244675Sdteske 34240684Sdteske#ifndef lint 35240684Sdteskestatic const char sccsid[] = "@(#)pass4.c 8.1 (Berkeley) 6/5/93"; 36238438Sdteske#endif /* not lint */ 37240684Sdteske 38238438Sdteske#include <sys/param.h> 39238438Sdteske#include <sys/time.h> 40260678Sdteske#include <ufs/ufs/dinode.h> 41260678Sdteske#include <ufs/ffs/fs.h> 42238438Sdteske#include <stdlib.h> 43238438Sdteske#include <string.h> 44238438Sdteske#include "fsck.h" 45238438Sdteske 46238438Sdteskeint pass4check(); 47238438Sdteske 48238438Sdteskevoid 49238438Sdteskepass4() 50238438Sdteske{ 51251264Sdteske register ino_t inumber; 52251264Sdteske register struct zlncnt *zlnp; 53238438Sdteske struct dinode *dp; 54238438Sdteske struct inodesc idesc; 55238438Sdteske int n; 56238438Sdteske 57238438Sdteske bzero((char *)&idesc, sizeof(struct inodesc)); 58251264Sdteske idesc.id_type = ADDR; 59251264Sdteske idesc.id_func = pass4check; 60238438Sdteske for (inumber = ROOTINO; inumber <= lastino; inumber++) { 61251190Sdteske idesc.id_number = inumber; 62251190Sdteske switch (statemap[inumber]) { 63251190Sdteske 64251190Sdteske case FSTATE: 65251190Sdteske case DFOUND: 66251190Sdteske n = lncntp[inumber]; 67251190Sdteske if (n) 68238438Sdteske adjust(&idesc, (short)n); 69251244Sdteske else { 70251244Sdteske for (zlnp = zlnhead; zlnp; zlnp = zlnp->next) 71251244Sdteske if (zlnp->zlncnt == inumber) { 72251236Sdteske zlnp->zlncnt = zlnhead->zlncnt; 73251236Sdteske zlnp = zlnhead; 74251244Sdteske zlnhead = zlnhead->next; 75251244Sdteske free((char *)zlnp); 76251244Sdteske clri(&idesc, "UNREF", 1); 77251244Sdteske break; 78251244Sdteske } 79251244Sdteske } 80251244Sdteske break; 81251244Sdteske 82251244Sdteske case DSTATE: 83240768Sdteske clri(&idesc, "UNREF", 1); 84240768Sdteske break; 85240768Sdteske 86251236Sdteske case DCLEAR: 87251236Sdteske dp = ginode(inumber); 88251244Sdteske if (dp->di_size == 0) { 89240768Sdteske clri(&idesc, "ZERO LENGTH", 1); 90238438Sdteske break; 91238438Sdteske } 92238438Sdteske /* fall through */ 93238438Sdteske case FCLEAR: 94238438Sdteske clri(&idesc, "BAD/DUP", 1); 95238438Sdteske break; 96238438Sdteske 97238438Sdteske case USTATE: 98238438Sdteske break; 99238438Sdteske 100250633Sdteske default: 101238438Sdteske errexit("BAD STATE %d FOR INODE I=%d", 102252178Sdteske statemap[inumber], inumber); 103238438Sdteske } 104238438Sdteske } 105238438Sdteske} 106238438Sdteske 107238438Sdteskeint 108238438Sdteskepass4check(idesc) 109238438Sdteske register struct inodesc *idesc; 110238438Sdteske{ 111238438Sdteske register struct dups *dlp; 112238438Sdteske int nfrags, res = KEEPON; 113238438Sdteske daddr_t blkno = idesc->id_blkno; 114238438Sdteske 115238438Sdteske for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) { 116238438Sdteske if (chkrange(blkno, 1)) { 117238438Sdteske res = SKIP; 118251236Sdteske } else if (testbmap(blkno)) { 119251236Sdteske for (dlp = duplist; dlp; dlp = dlp->next) { 120238438Sdteske if (dlp->dup != blkno) 121251967Sdteske continue; 122238438Sdteske dlp->dup = duplist->dup; 123251967Sdteske dlp = duplist; 124251967Sdteske duplist = duplist->next; 125251967Sdteske free((char *)dlp); 126251967Sdteske break; 127238438Sdteske } 128251967Sdteske if (dlp == 0) { 129251967Sdteske clrbmap(blkno); 130251974Sdteske n_blks--; 131251967Sdteske } 132251967Sdteske } 133251967Sdteske } 134238438Sdteske return (res); 135238438Sdteske} 136238438Sdteske