pass1b.c revision 267654
1283514Sarybchik/*
2283514Sarybchik * Copyright (c) 1980, 1986, 1993
3283514Sarybchik *	The Regents of the University of California.  All rights reserved.
4283514Sarybchik *
5283514Sarybchik * Redistribution and use in source and binary forms, with or without
6283514Sarybchik * modification, are permitted provided that the following conditions
7283514Sarybchik * are met:
8283514Sarybchik * 1. Redistributions of source code must retain the above copyright
9283514Sarybchik *    notice, this list of conditions and the following disclaimer.
10283514Sarybchik * 2. Redistributions in binary form must reproduce the above copyright
11283514Sarybchik *    notice, this list of conditions and the following disclaimer in the
12283514Sarybchik *    documentation and/or other materials provided with the distribution.
13283514Sarybchik * 4. Neither the name of the University nor the names of its contributors
14283514Sarybchik *    may be used to endorse or promote products derived from this software
15283514Sarybchik *    without specific prior written permission.
16283514Sarybchik *
17283514Sarybchik * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18283514Sarybchik * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19283514Sarybchik * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20283514Sarybchik * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21283514Sarybchik * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22283514Sarybchik * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23283514Sarybchik * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24283514Sarybchik * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25283514Sarybchik * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26283514Sarybchik * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27283514Sarybchik * SUCH DAMAGE.
28283514Sarybchik */
29283514Sarybchik
30283514Sarybchik#if 0
31283514Sarybchik#ifndef lint
32283514Sarybchikstatic const char sccsid[] = "@(#)pass1b.c	8.4 (Berkeley) 4/28/95";
33283514Sarybchik#endif /* not lint */
34283514Sarybchik#endif
35283514Sarybchik#include <sys/cdefs.h>
36283514Sarybchik__FBSDID("$FreeBSD: releng/9.3/sbin/fsck_ffs/pass1b.c 136346 2004-10-10 06:37:56Z imp $");
37283514Sarybchik
38283514Sarybchik#include <sys/param.h>
39283514Sarybchik
40283514Sarybchik#include <ufs/ufs/dinode.h>
41283514Sarybchik#include <ufs/ffs/fs.h>
42283514Sarybchik
43283514Sarybchik#include <string.h>
44283514Sarybchik
45283514Sarybchik#include "fsck.h"
46283514Sarybchik
47283514Sarybchikstatic  struct dups *duphead;
48283514Sarybchikstatic int pass1bcheck(struct inodesc *);
49283514Sarybchik
50293927Sarybchikvoid
51283514Sarybchikpass1b(void)
52283514Sarybchik{
53283514Sarybchik	int c, i;
54283514Sarybchik	union dinode *dp;
55283514Sarybchik	struct inodesc idesc;
56283514Sarybchik	ino_t inumber;
57283514Sarybchik
58283514Sarybchik	memset(&idesc, 0, sizeof(struct inodesc));
59283514Sarybchik	idesc.id_type = ADDR;
60283514Sarybchik	idesc.id_func = pass1bcheck;
61283514Sarybchik	duphead = duplist;
62283514Sarybchik	inumber = 0;
63283514Sarybchik	for (c = 0; c < sblock.fs_ncg; c++) {
64283514Sarybchik		if (got_siginfo) {
65283514Sarybchik			printf("%s: phase 1b: cyl group %d of %d (%d%%)\n",
66283514Sarybchik			    cdevname, c, sblock.fs_ncg,
67293927Sarybchik			    c * 100 / sblock.fs_ncg);
68283514Sarybchik			got_siginfo = 0;
69283514Sarybchik		}
70283514Sarybchik		if (got_sigalarm) {
71283514Sarybchik			setproctitle("%s p1b %d%%", cdevname,
72283514Sarybchik			    c * 100 / sblock.fs_ncg);
73283514Sarybchik			got_sigalarm = 0;
74283514Sarybchik		}
75283514Sarybchik		for (i = 0; i < sblock.fs_ipg; i++, inumber++) {
76283514Sarybchik			if (inumber < ROOTINO)
77283514Sarybchik				continue;
78283514Sarybchik			dp = ginode(inumber);
79283514Sarybchik			if (dp == NULL)
80283514Sarybchik				continue;
81283514Sarybchik			idesc.id_number = inumber;
82283514Sarybchik			if (inoinfo(inumber)->ino_state != USTATE &&
83283514Sarybchik			    (ckinode(dp, &idesc) & STOP))
84283514Sarybchik				return;
85283514Sarybchik		}
86283514Sarybchik	}
87283514Sarybchik}
88283514Sarybchik
89283514Sarybchikstatic int
90294381Sarybchikpass1bcheck(struct inodesc *idesc)
91283514Sarybchik{
92293955Sarybchik	struct dups *dlp;
93293955Sarybchik	int nfrags, res = KEEPON;
94293955Sarybchik	ufs2_daddr_t blkno = idesc->id_blkno;
95293955Sarybchik
96294381Sarybchik	for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
97283514Sarybchik		if (chkrange(blkno, 1))
98283514Sarybchik			res = SKIP;
99283514Sarybchik		for (dlp = duphead; dlp; dlp = dlp->next) {
100283514Sarybchik			if (dlp->dup == blkno) {
101283514Sarybchik				blkerror(idesc->id_number, "DUP", blkno);
102283514Sarybchik				dlp->dup = duphead->dup;
103283514Sarybchik				duphead->dup = blkno;
104283514Sarybchik				duphead = duphead->next;
105283514Sarybchik			}
106283514Sarybchik			if (dlp == muldup)
107283514Sarybchik				break;
108283514Sarybchik		}
109283514Sarybchik		if (muldup == 0 || duphead == muldup->next)
110283514Sarybchik			return (STOP);
111283514Sarybchik	}
112283514Sarybchik	return (res);
113283514Sarybchik}
114283514Sarybchik