Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sbin/fsck_ffs/pass1b.c
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause
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
#include <sys/param.h>
33
34
#include <ufs/ufs/dinode.h>
35
#include <ufs/ffs/fs.h>
36
37
#include <string.h>
38
39
#include "fsck.h"
40
41
static struct dups *duphead;
42
static int pass1bcheck(struct inodesc *);
43
44
void
45
pass1b(void)
46
{
47
int c, i;
48
union dinode *dp;
49
struct inodesc idesc;
50
ino_t inumber, inosused;
51
52
memset(&idesc, 0, sizeof(struct inodesc));
53
idesc.id_func = pass1bcheck;
54
duphead = duplist;
55
for (c = 0; c < sblock.fs_ncg; c++) {
56
if (got_siginfo) {
57
printf("%s: phase 1b: cyl group %d of %d (%d%%)\n",
58
cdevname, c, sblock.fs_ncg,
59
c * 100 / sblock.fs_ncg);
60
got_siginfo = 0;
61
}
62
if (got_sigalarm) {
63
setproctitle("%s p1b %d%%", cdevname,
64
c * 100 / sblock.fs_ncg);
65
got_sigalarm = 0;
66
}
67
inosused = inostathead[c].il_numalloced;
68
if (inosused == 0)
69
continue;
70
setinodebuf(c, inosused);
71
inumber = c * sblock.fs_ipg;
72
for (i = 0; i < inosused; i++, inumber++) {
73
if (inumber < UFS_ROOTINO) {
74
(void)getnextinode(inumber, 0);
75
continue;
76
}
77
dp = getnextinode(inumber, 0);
78
idesc.id_number = inumber;
79
idesc.id_type = inoinfo(inumber)->ino_idtype;
80
if (inoinfo(inumber)->ino_state != USTATE &&
81
(ckinode(dp, &idesc) & STOP)) {
82
rerun = 1;
83
freeinodebuf();
84
return;
85
}
86
}
87
}
88
freeinodebuf();
89
}
90
91
static int
92
pass1bcheck(struct inodesc *idesc)
93
{
94
struct dups *dlp;
95
int nfrags, res = KEEPON;
96
ufs2_daddr_t blkno = idesc->id_blkno;
97
98
for (nfrags = idesc->id_numfrags; nfrags > 0; blkno++, nfrags--) {
99
if (chkrange(blkno, 1))
100
res = SKIP;
101
for (dlp = duphead; dlp; dlp = dlp->next) {
102
if (dlp->dup == blkno) {
103
blkerror(idesc->id_number, "DUP", blkno);
104
dlp->dup = duphead->dup;
105
duphead->dup = blkno;
106
duphead = duphead->next;
107
}
108
if (dlp == muldup)
109
break;
110
}
111
if (muldup == NULL || duphead == muldup->next) {
112
rerun = 1;
113
return (STOP);
114
}
115
}
116
return (res);
117
}
118
119