1/*	$NetBSD: pass4.c,v 1.9 2008/03/16 23:17:55 lukem Exp $	*/
2
3/*
4 * Copyright (c) 1980, 1986, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32/*
33 * Copyright (c) 1997 Manuel Bouyer.
34 *
35 * Redistribution and use in source and binary forms, with or without
36 * modification, are permitted provided that the following conditions
37 * are met:
38 * 1. Redistributions of source code must retain the above copyright
39 *    notice, this list of conditions and the following disclaimer.
40 * 2. Redistributions in binary form must reproduce the above copyright
41 *    notice, this list of conditions and the following disclaimer in the
42 *    documentation and/or other materials provided with the distribution.
43 *
44 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
45 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
46 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
47 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
48 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
49 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
53 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54 */
55
56#include <sys/cdefs.h>
57#ifndef lint
58#if 0
59static char sccsid[] = "@(#)pass4.c	8.1 (Berkeley) 6/5/93";
60#else
61__RCSID("$NetBSD: pass4.c,v 1.9 2008/03/16 23:17:55 lukem Exp $");
62#endif
63#endif /* not lint */
64
65#include <sys/param.h>
66#include <sys/time.h>
67#include <ufs/ext2fs/ext2fs_dinode.h>
68#include <ufs/ext2fs/ext2fs.h>
69#include <stdlib.h>
70#include <string.h>
71
72#include "fsutil.h"
73#include "fsck.h"
74#include "extern.h"
75
76void
77pass4(void)
78{
79	ino_t inumber;
80	struct zlncnt *zlnp;
81	struct ext2fs_dinode *dp;
82	struct inodesc idesc;
83	int n;
84
85	memset(&idesc, 0, sizeof(struct inodesc));
86	idesc.id_type = ADDR;
87	idesc.id_func = pass4check;
88	for (inumber = EXT2_ROOTINO; inumber <= lastino; inumber++) {
89		if (inumber < EXT2_FIRSTINO && inumber > EXT2_ROOTINO)
90			continue;
91		idesc.id_number = inumber;
92		switch (statemap[inumber]) {
93
94		case FSTATE:
95		case DFOUND:
96			n = lncntp[inumber];
97			if (n)
98				adjust(&idesc, (short)n);
99			else {
100				for (zlnp = zlnhead; zlnp; zlnp = zlnp->next)
101					if (zlnp->zlncnt == inumber) {
102						zlnp->zlncnt = zlnhead->zlncnt;
103						zlnp = zlnhead;
104						zlnhead = zlnhead->next;
105						free((char *)zlnp);
106						clri(&idesc, "UNREF", 1);
107						break;
108					}
109			}
110			break;
111
112		case DSTATE:
113			clri(&idesc, "UNREF", 1);
114			break;
115
116		case DCLEAR:
117			dp = ginode(inumber);
118			if (inosize(dp) == 0) {
119				clri(&idesc, "ZERO LENGTH", 1);
120				break;
121			}
122			/* fall through */
123		case FCLEAR:
124			clri(&idesc, "BAD/DUP", 1);
125			break;
126
127		case USTATE:
128			break;
129
130		default:
131			errexit("BAD STATE %d FOR INODE I=%llu",
132			    statemap[inumber], (unsigned long long)inumber);
133		}
134	}
135}
136
137int
138pass4check(struct inodesc *idesc)
139{
140	struct dups *dlp;
141	int nfrags, res = KEEPON;
142	daddr_t blkno = idesc->id_blkno;
143
144	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
145		if (chkrange(blkno, 1)) {
146			res = SKIP;
147		} else if (testbmap(blkno)) {
148			for (dlp = duplist; dlp; dlp = dlp->next) {
149				if (dlp->dup != blkno)
150					continue;
151				dlp->dup = duplist->dup;
152				dlp = duplist;
153				duplist = duplist->next;
154				free((char *)dlp);
155				break;
156			}
157			if (dlp == 0) {
158				clrbmap(blkno);
159				n_blks--;
160			}
161		}
162	}
163	return (res);
164}
165