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