Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sbin/fsck_ffs/fsck.h
39475 views
1
/*-
2
* SPDX-License-Identifier: BSD-3-Clause and BSD-2-Clause
3
*
4
* Copyright (c) 2002 Networks Associates Technology, Inc.
5
* All rights reserved.
6
*
7
* This software was developed for the FreeBSD Project by Marshall
8
* Kirk McKusick and Network Associates Laboratories, the Security
9
* Research Division of Network Associates, Inc. under DARPA/SPAWAR
10
* contract N66001-01-C-8035 ("CBOSS"), as part of the DARPA CHATS
11
* research program.
12
*
13
* Redistribution and use in source and binary forms, with or without
14
* modification, are permitted provided that the following conditions
15
* are met:
16
* 1. Redistributions of source code must retain the above copyright
17
* notice, this list of conditions and the following disclaimer.
18
* 2. Redistributions in binary form must reproduce the above copyright
19
* notice, this list of conditions and the following disclaimer in the
20
* documentation and/or other materials provided with the distribution.
21
*
22
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
* SUCH DAMAGE.
33
*
34
* Copyright (c) 1980, 1986, 1993
35
* The Regents of the University of California. All rights reserved.
36
*
37
* Redistribution and use in source and binary forms, with or without
38
* modification, are permitted provided that the following conditions
39
* are met:
40
* 1. Redistributions of source code must retain the above copyright
41
* notice, this list of conditions and the following disclaimer.
42
* 2. Redistributions in binary form must reproduce the above copyright
43
* notice, this list of conditions and the following disclaimer in the
44
* documentation and/or other materials provided with the distribution.
45
* 3. Neither the name of the University nor the names of its contributors
46
* may be used to endorse or promote products derived from this software
47
* without specific prior written permission.
48
*
49
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
50
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
51
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
53
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59
* SUCH DAMAGE.
60
*/
61
62
#ifndef _FSCK_H_
63
#define _FSCK_H_
64
65
#include <unistd.h>
66
#include <stdlib.h>
67
#include <stdio.h>
68
#include <libufs.h>
69
70
#include <sys/queue.h>
71
72
#define MAXDUP 10 /* limit on dup blks (per inode) */
73
#define MAXBAD 10 /* limit on bad blks (per inode) */
74
#define MINBUFS 100 /* minimum number of buffers required */
75
#define INOBUFSIZE 64*1024 /* size of buffer to read inodes in pass1 */
76
#define ZEROBUFSIZE (dev_bsize * 128) /* size of zero buffer used by -Z */
77
78
#define DIP(dp, field) \
79
((sblock.fs_magic == FS_UFS1_MAGIC) ? \
80
(dp)->dp1.field : (dp)->dp2.field)
81
82
#define DIP_SET(dp, field, val) do { \
83
if (sblock.fs_magic == FS_UFS1_MAGIC) \
84
(dp)->dp1.field = (val); \
85
else \
86
(dp)->dp2.field = (val); \
87
} while (0)
88
89
/*
90
* Each inode on the file system is described by the following structure.
91
* The linkcnt is initially set to the value in the inode. Each time it
92
* is found during the descent in passes 2, 3, and 4 the count is
93
* decremented. Any inodes whose count is non-zero after pass 4 needs to
94
* have its link count adjusted by the value remaining in ino_linkcnt.
95
*/
96
struct inostat {
97
u_char ino_state; /* state of inode, see below */
98
u_char ino_type:4; /* type of inode */
99
u_char ino_idtype:4; /* idesc id_type, SNAP or ADDR */
100
u_short ino_linkcnt; /* number of links not found */
101
};
102
/*
103
* Inode states.
104
*/
105
#define USTATE 0x1 /* inode not allocated */
106
#define FSTATE 0x2 /* inode is file */
107
#define FZLINK 0x3 /* inode is file with a link count of zero */
108
#define DSTATE 0x4 /* inode is directory */
109
#define DZLINK 0x5 /* inode is directory with a zero link count */
110
#define DFOUND 0x6 /* directory found during descent */
111
/* 0x7 UNUSED - see S_IS_DVALID() definition */
112
#define DCLEAR 0x8 /* directory is to be cleared */
113
#define FCLEAR 0x9 /* file is to be cleared */
114
/* DUNFOUND === (state == DSTATE || state == DZLINK) */
115
#define S_IS_DUNFOUND(state) (((state) & ~0x1) == DSTATE)
116
/* DVALID === (state == DSTATE || state == DZLINK || state == DFOUND) */
117
#define S_IS_DVALID(state) (((state) & ~0x3) == DSTATE)
118
#define INO_IS_DUNFOUND(ino) S_IS_DUNFOUND(inoinfo(ino)->ino_state)
119
#define INO_IS_DVALID(ino) S_IS_DVALID(inoinfo(ino)->ino_state)
120
/*
121
* Inode state information is contained on per cylinder group lists
122
* which are described by the following structure.
123
*/
124
extern struct inostatlist {
125
long il_numalloced; /* number of inodes allocated in this cg */
126
struct inostat *il_stat;/* inostat info for this cylinder group */
127
} *inostathead;
128
129
/*
130
* Structure to reference a dinode.
131
*/
132
struct inode {
133
struct bufarea *i_bp; /* buffer containing the dinode */
134
union dinode *i_dp; /* pointer to dinode in buffer */
135
ino_t i_number; /* inode number */
136
};
137
138
/*
139
* Size of hash tables
140
*/
141
#define HASHSIZE 2048
142
#define HASH(x) ((x * 2654435761) & (HASHSIZE - 1))
143
144
/*
145
* buffer cache structure.
146
*/
147
struct bufarea {
148
TAILQ_ENTRY(bufarea) b_list; /* LRU buffer queue */
149
LIST_ENTRY(bufarea) b_hash; /* hash list */
150
ufs2_daddr_t b_bno; /* disk block number */
151
int b_size; /* size of I/O */
152
int b_errs; /* I/O error */
153
int b_flags; /* B_ flags below */
154
int b_type; /* BT_ type below */
155
int b_refcnt; /* ref count of users */
156
uint64_t b_index; /* for BT_LEVEL, ptr index */
157
/* for BT_INODES, first inum */
158
union {
159
char *b_buf; /* buffer space */
160
ufs1_daddr_t *b_indir1; /* UFS1 indirect block */
161
ufs2_daddr_t *b_indir2; /* UFS2 indirect block */
162
struct fs *b_fs; /* super block */
163
struct cg *b_cg; /* cylinder group */
164
struct ufs1_dinode *b_dinode1; /* UFS1 inode block */
165
struct ufs2_dinode *b_dinode2; /* UFS2 inode block */
166
} b_un;
167
};
168
169
#define IBLK(bp, i) \
170
((sblock.fs_magic == FS_UFS1_MAGIC) ? \
171
(bp)->b_un.b_indir1[i] : (bp)->b_un.b_indir2[i])
172
173
#define IBLK_SET(bp, i, val) do { \
174
if (sblock.fs_magic == FS_UFS1_MAGIC) \
175
(bp)->b_un.b_indir1[i] = (val); \
176
else \
177
(bp)->b_un.b_indir2[i] = (val); \
178
} while (0)
179
180
/*
181
* Buffer flags
182
*/
183
#define B_DIRTY 0x00000001 /* Buffer is dirty */
184
/*
185
* Type of data in buffer
186
*/
187
#define BT_UNKNOWN 0 /* Buffer type is unknown */
188
#define BT_SUPERBLK 1 /* Buffer holds a superblock */
189
#define BT_CYLGRP 2 /* Buffer holds a cylinder group map */
190
#define BT_LEVEL1 3 /* Buffer holds single level indirect */
191
#define BT_LEVEL2 4 /* Buffer holds double level indirect */
192
#define BT_LEVEL3 5 /* Buffer holds triple level indirect */
193
#define BT_EXTATTR 6 /* Buffer holds external attribute data */
194
#define BT_INODES 7 /* Buffer holds inodes */
195
#define BT_DIRDATA 8 /* Buffer holds directory data */
196
#define BT_DATA 9 /* Buffer holds user data */
197
#define BT_NUMBUFTYPES 10
198
#define BT_NAMES { \
199
"unknown", \
200
"Superblock", \
201
"Cylinder Group", \
202
"Single Level Indirect", \
203
"Double Level Indirect", \
204
"Triple Level Indirect", \
205
"External Attribute", \
206
"Inode Block", \
207
"Directory Contents", \
208
"User Data" }
209
extern char *buftype[];
210
#define BT_BUFTYPE(type) \
211
type < BT_NUMBUFTYPES ? buftype[type] : buftype[BT_UNKNOWN]
212
extern long readcnt[BT_NUMBUFTYPES];
213
extern long totalreadcnt[BT_NUMBUFTYPES];
214
extern struct timespec readtime[BT_NUMBUFTYPES];
215
extern struct timespec totalreadtime[BT_NUMBUFTYPES];
216
extern struct timespec startprog;
217
218
extern struct bufarea *icachebp; /* inode cache buffer */
219
extern struct bufarea sblk; /* file system superblock */
220
extern struct bufarea *pdirbp; /* current directory contents */
221
222
#define dirty(bp) do { \
223
if (fswritefd < 0) \
224
pfatal("SETTING DIRTY FLAG IN READ_ONLY MODE\n"); \
225
else \
226
(bp)->b_flags |= B_DIRTY; \
227
} while (0)
228
#define initbarea(bp, type) do { \
229
(bp)->b_bno = (ufs2_daddr_t)-4; \
230
(bp)->b_size = 0; \
231
(bp)->b_errs = 0; \
232
(bp)->b_flags = 0; \
233
(bp)->b_type = type; \
234
(bp)->b_refcnt = 0; \
235
(bp)->b_index = 0; \
236
} while (0)
237
238
#define sbdirty() dirty(&sblk)
239
#define sblock (*sblk.b_un.b_fs)
240
241
enum fixstate {DONTKNOW, NOFIX, FIX, IGNORE};
242
extern ino_t cursnapshot;
243
244
struct inodesc {
245
enum fixstate id_fix; /* policy on fixing errors */
246
int (*id_func)(struct inodesc *);
247
/* function to be applied to blocks of inode */
248
struct bufarea *id_bp; /* ckinode: buffer with indirect pointers */
249
union dinode *id_dp; /* ckinode: dinode being traversed */
250
ino_t id_number; /* inode number described */
251
ino_t id_parent; /* for DATA nodes, their parent */
252
ufs_lbn_t id_lbn; /* logical block number of current block */
253
ufs2_daddr_t id_blkno; /* current block number being examined */
254
int id_level; /* level of indirection of this block */
255
int id_numfrags; /* number of frags contained in block */
256
ufs_lbn_t id_lballoc; /* pass1: last LBN that is allocated */
257
off_t id_filesize; /* for DATA nodes, the size of the directory */
258
ufs2_daddr_t id_entryno;/* for DATA nodes, current entry number */
259
int id_loc; /* for DATA nodes, current location in dir */
260
struct direct *id_dirp; /* for DATA nodes, ptr to current entry */
261
char *id_name; /* for DATA nodes, name to find or enter */
262
char id_type; /* type of descriptor, DATA, ADDR, or SNAP */
263
};
264
/* file types */
265
#define DATA 1 /* a directory */
266
#define SNAP 2 /* a snapshot */
267
#define ADDR 3 /* anything but a directory or a snapshot */
268
269
/*
270
* Linked list of duplicate blocks.
271
*
272
* The list is composed of two parts. The first part of the
273
* list (from duplist through the node pointed to by muldup)
274
* contains a single copy of each duplicate block that has been
275
* found. The second part of the list (from muldup to the end)
276
* contains duplicate blocks that have been found more than once.
277
* To check if a block has been found as a duplicate it is only
278
* necessary to search from duplist through muldup. To find the
279
* total number of times that a block has been found as a duplicate
280
* the entire list must be searched for occurrences of the block
281
* in question. The following diagram shows a sample list where
282
* w (found twice), x (found once), y (found three times), and z
283
* (found once) are duplicate block numbers:
284
*
285
* w -> y -> x -> z -> y -> w -> y
286
* ^ ^
287
* | |
288
* duplist muldup
289
*/
290
struct dups {
291
struct dups *next;
292
ufs2_daddr_t dup;
293
};
294
extern struct dups *duplist; /* head of dup list */
295
extern struct dups *muldup; /* end of unique duplicate dup block numbers */
296
297
/*
298
* Inode cache data structures.
299
*/
300
struct inoinfo {
301
SLIST_ENTRY(inoinfo) i_hash; /* hash list */
302
ino_t i_number; /* inode number of this entry */
303
ino_t i_parent; /* inode number of parent */
304
ino_t i_dotdot; /* inode number of `..' */
305
size_t i_isize; /* size of inode */
306
u_int i_depth; /* depth of directory from root */
307
u_int i_flags; /* flags, see below */
308
u_int i_numblks; /* size of block array in bytes */
309
ufs2_daddr_t i_blks[1]; /* actually longer */
310
};
311
extern SLIST_HEAD(inohash, inoinfo) *inphash;
312
extern struct inoinfo **inpsort;
313
/*
314
* flags for struct inoinfo
315
*/
316
#define INFO_NEW 0x0000001 /* replaced broken directory */
317
318
extern long dirhash, inplast;
319
extern unsigned long numdirs, listmax;
320
extern long countdirs; /* number of directories we actually found */
321
322
#define MIBSIZE 3 /* size of fsck sysctl MIBs */
323
extern int adjblkcnt[MIBSIZE]; /* MIB cmd to adjust inode block count */
324
extern int adjrefcnt[MIBSIZE]; /* MIB cmd to adjust inode reference count */
325
extern int adjndir[MIBSIZE]; /* MIB cmd to adjust number of directories */
326
extern int adjnbfree[MIBSIZE]; /* MIB cmd to adjust number of free blocks */
327
extern int adjnifree[MIBSIZE]; /* MIB cmd to adjust number of free inodes */
328
extern int adjnffree[MIBSIZE]; /* MIB cmd to adjust number of free frags */
329
extern int adjnumclusters[MIBSIZE]; /* MIB cmd adjust number of free clusters */
330
extern int adjdepth[MIBSIZE]; /* MIB cmd to adjust directory depth count */
331
extern int freefiles[MIBSIZE]; /* MIB cmd to free a set of files */
332
extern int freedirs[MIBSIZE]; /* MIB cmd to free a set of directories */
333
extern int freeblks[MIBSIZE]; /* MIB cmd to free a set of data blocks */
334
extern int setsize[MIBSIZE]; /* MIB cmd to set inode size */
335
extern struct fsck_cmd cmd; /* sysctl file system update commands */
336
337
extern int bkgrdcheck; /* determine if background check is possible */
338
extern int bkgrdsumadj; /* whether the kernel has the ability to adjust
339
the superblock summary fields */
340
extern off_t bflag; /* location of alternate super block */
341
extern int bkgrdflag; /* use a snapshot to run on an active system */
342
extern char *blockmap; /* ptr to primary blk allocation map */
343
extern char *cdevname; /* name of device being checked */
344
extern int cgheader_corrupt; /* one or more CG headers are corrupt */
345
extern char ckclean; /* only do work if not cleanly unmounted */
346
extern int ckhashadd; /* check hashes to be added */
347
extern char *copybuf; /* buffer to copy snapshot blocks */
348
extern int cvtlevel; /* convert to newer file system format */
349
extern long dev_bsize; /* computed value of DEV_BSIZE */
350
extern u_int real_dev_bsize; /* actual disk sector size, not overridden */
351
extern int debug; /* output debugging info */
352
extern int Eflag; /* delete empty data blocks */
353
extern int fsmodified; /* 1 => write done to file system */
354
extern int fsreadfd; /* file descriptor for reading file system */
355
extern int fswritefd; /* file descriptor for writing file system */
356
extern char havesb; /* superblock has been read */
357
extern int inoopt; /* trim out unused inodes */
358
extern ino_t lfdir; /* lost & found directory inode number */
359
extern int lfmode; /* lost & found directory creation mode */
360
extern const char *lfname; /* lost & found directory name */
361
extern ufs2_daddr_t maxfsblock; /* number of blocks in the file system */
362
extern ino_t maxino; /* number of inodes in file system */
363
extern ufs2_daddr_t n_blks; /* number of blocks in use */
364
extern ino_t n_files; /* number of files in use */
365
extern char nflag; /* assume a no response */
366
extern char preen; /* just fix normal inconsistencies */
367
extern char rerun; /* rerun fsck. Only used in non-preen mode */
368
extern char resolved; /* cleared if unresolved changes => not clean */
369
extern int returntosingle; /* 1 => return to single user mode on exit */
370
extern long secsize; /* actual disk sector size */
371
extern char skipclean; /* skip clean file systems if preening */
372
extern int snapcnt; /* number of active snapshots */
373
extern struct inode snaplist[FSMAXSNAP + 1]; /* list of active snapshots */
374
extern int sujrecovery; /* 1 => doing check using the journal */
375
extern int surrender; /* Give up if reads fail */
376
extern char usedsoftdep; /* just fix soft dependency inconsistencies */
377
extern int wantrestart; /* Restart fsck on early termination */
378
extern char yflag; /* assume a yes response */
379
extern int zflag; /* zero unused directory space */
380
extern int Zflag; /* zero empty data blocks */
381
382
extern volatile sig_atomic_t got_siginfo; /* received a SIGINFO */
383
extern volatile sig_atomic_t got_sigalarm; /* received a SIGALRM */
384
385
#define clearinode(dp) \
386
if (sblock.fs_magic == FS_UFS1_MAGIC) { \
387
(dp)->dp1 = zino.dp1; \
388
} else { \
389
(dp)->dp2 = zino.dp2; \
390
}
391
extern union dinode zino;
392
393
#define setbmap(blkno) setbit(blockmap, blkno)
394
#define testbmap(blkno) isset(blockmap, blkno)
395
#define clrbmap(blkno) clrbit(blockmap, blkno)
396
397
#define STOP 0x01
398
#define SKIP 0x02
399
#define KEEPON 0x04
400
#define ALTERED 0x08
401
#define FOUND 0x10
402
403
#define EEXIT 8 /* Standard error exit. */
404
#define ERERUN 16 /* fsck needs to be re-run. */
405
#define ERESTART -1
406
407
int flushentry(void);
408
/*
409
* Wrapper for malloc() that flushes the cylinder group cache to try
410
* to get space.
411
*/
412
static inline void*
413
Malloc(size_t size)
414
{
415
void *retval;
416
417
while ((retval = malloc(size)) == NULL)
418
if (flushentry() == 0)
419
break;
420
return (retval);
421
}
422
/*
423
* Allocate a block of memory to be used as an I/O buffer.
424
* Ensure that the buffer is aligned to the I/O subsystem requirements.
425
*/
426
static inline void*
427
Balloc(size_t size)
428
{
429
void *retval;
430
431
while ((retval = aligned_alloc(LIBUFS_BUFALIGN, size)) == NULL)
432
if (flushentry() == 0)
433
break;
434
return (retval);
435
}
436
437
/*
438
* Wrapper for calloc() that flushes the cylinder group cache to try
439
* to get space.
440
*/
441
static inline void*
442
Calloc(size_t cnt, size_t size)
443
{
444
void *retval;
445
446
while ((retval = calloc(cnt, size)) == NULL)
447
if (flushentry() == 0)
448
break;
449
return (retval);
450
}
451
452
struct fstab;
453
454
455
void adjust(struct inodesc *, int lcnt);
456
void alarmhandler(int sig);
457
ufs2_daddr_t allocblk(long cg, long frags, ufs2_daddr_t (*checkblkavail)
458
(ufs2_daddr_t blkno, long frags));
459
ino_t allocdir(ino_t parent, ino_t request, int mode);
460
ino_t allocino(ino_t request, int type);
461
void binval(struct bufarea *);
462
void blkerror(ino_t ino, const char *type, ufs2_daddr_t blk);
463
char *blockcheck(char *name);
464
int blread(int fd, char *buf, ufs2_daddr_t blk, long size);
465
void bufinit(void);
466
void blwrite(int fd, char *buf, ufs2_daddr_t blk, ssize_t size);
467
void blerase(int fd, ufs2_daddr_t blk, long size);
468
void blzero(int fd, ufs2_daddr_t blk, long size);
469
void brelse(struct bufarea *);
470
struct inoinfo *cacheino(union dinode *dp, ino_t inumber);
471
void catch(int);
472
void catchquit(int);
473
void cgdirty(struct bufarea *);
474
struct bufarea *cglookup(int cg);
475
int changeino(ino_t dir, const char *name, ino_t newnum, int depth);
476
void check_blkcnt(struct inode *ip);
477
int check_cgmagic(int cg, struct bufarea *cgbp);
478
void rebuild_cg(int cg, struct bufarea *cgbp);
479
void check_dirdepth(struct inoinfo *inp);
480
int chkfilesize(mode_t mode, u_int64_t filesize);
481
int chkrange(ufs2_daddr_t blk, int cnt);
482
void ckfini(int markclean);
483
int ckinode(union dinode *dp, struct inodesc *);
484
void clri(struct inodesc *, const char *type, int flag);
485
int clearentry(struct inodesc *);
486
void copyonwrite(struct fs *, struct bufarea *,
487
ufs2_daddr_t (*checkblkavail)(ufs2_daddr_t, long));
488
void direrror(ino_t ino, const char *errmesg);
489
int dirscan(struct inodesc *);
490
int dofix(struct inodesc *, const char *msg);
491
int eascan(struct inodesc *, struct ufs2_dinode *dp);
492
void fileerror(ino_t cwd, ino_t ino, const char *errmesg);
493
void finalIOstats(void);
494
int findino(struct inodesc *);
495
int findname(struct inodesc *);
496
void flush(int fd, struct bufarea *bp);
497
int freeblock(struct inodesc *);
498
void freedirino(ino_t ino, ino_t parent);
499
void freeino(ino_t ino);
500
void freeinodebuf(void);
501
void fsckinit(void);
502
void fsutilinit(void);
503
int ftypeok(union dinode *dp);
504
void getblk(struct bufarea *bp, ufs2_daddr_t blk, long size);
505
struct bufarea *getdatablk(ufs2_daddr_t blkno, long size, int type);
506
struct inoinfo *getinoinfo(ino_t inumber);
507
union dinode *getnextinode(ino_t inumber, int rebuiltcg);
508
void getpathname(char *namebuf, ino_t curdir, ino_t ino);
509
void ginode(ino_t, struct inode *);
510
void gjournal_check(const char *filesys);
511
void infohandler(int sig);
512
void irelse(struct inode *);
513
ufs2_daddr_t ino_blkatoff(union dinode *, ino_t, ufs_lbn_t, int *,
514
struct bufarea **);
515
void inocleanup(void);
516
void inodirty(struct inode *);
517
struct inostat *inoinfo(ino_t inum);
518
void IOstats(char *what);
519
int linkup(ino_t orphan, ino_t parentdir, char *name);
520
int makeentry(ino_t parent, ino_t ino, const char *name);
521
int openfilesys(char *dev);
522
void panic(const char *fmt, ...) __printflike(1, 2);
523
void pass1(void);
524
void pass1b(void);
525
int pass1check(struct inodesc *);
526
void pass2(void);
527
void pass3(void);
528
void pass4(void);
529
void pass5(void);
530
void pfatal(const char *fmt, ...) __printflike(1, 2);
531
void propagate(void);
532
void prtbuf(struct bufarea *, const char *, ...) __printflike(2, 3);
533
void prtinode(struct inode *);
534
void pwarn(const char *fmt, ...) __printflike(1, 2);
535
int readsb(void);
536
int removecachedino(ino_t);
537
int reply(const char *question);
538
void rwerror(const char *mesg, ufs2_daddr_t blk);
539
void sblock_init(void);
540
void setinodebuf(int, ino_t);
541
int setup(char *dev);
542
int snapblkfree(struct fs *, ufs2_daddr_t, long, ino_t,
543
ufs2_daddr_t (*)(ufs2_daddr_t, long));
544
void snapremove(ino_t);
545
void snapflush(ufs2_daddr_t (*checkblkavail)(ufs2_daddr_t, long));
546
ufs2_daddr_t std_checkblkavail(ufs2_daddr_t blkno, long frags);
547
ufs2_daddr_t suj_checkblkavail(ufs2_daddr_t, long);
548
int suj_check(const char *filesys);
549
void update_maps(struct cg *, struct cg*, int);
550
551
#endif /* !_FSCK_H_ */
552
553