xref: /dragonfly/sbin/fsck/fsck.h (revision 7319acd8bfde65d43d79eda128836e175df0177c)
1 /*
2  * Copyright (c) 1980, 1986, 1993
3  *        The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *        @(#)fsck.h          8.4 (Berkeley) 5/9/95
30  * $FreeBSD: src/sbin/fsck/fsck.h,v 1.12.2.1 2001/01/23 23:11:07 iedowse Exp $
31  */
32 
33 #include <unistd.h>
34 #include <stdlib.h>
35 #include <stdio.h>
36 
37 #define   MAXDUP              10        /* limit on dup blks (per inode) */
38 #define   MAXBAD              10        /* limit on bad blks (per inode) */
39 #define   MAXBUFSPACE         40*1024   /* maximum space to allocate to buffers */
40 #define   INOBUFSIZE          56*1024   /* size of buffer to read inodes in pass1 */
41 
42 /*
43  * Each inode on the filesystem is described by the following structure.
44  * The linkcnt is initially set to the value in the inode. Each time it
45  * is found during the descent in passes 2, 3, and 4 the count is
46  * decremented. Any inodes whose count is non-zero after pass 4 needs to
47  * have its link count adjusted by the value remaining in ino_linkcnt.
48  */
49 struct inostat {
50           char      ino_state;          /* state of inode, see below */
51           char      ino_type; /* type of inode */
52           short     ino_linkcnt;        /* number of links not found */
53 };
54 /*
55  * Inode states.
56  */
57 #define   USTATE    01                  /* inode not allocated */
58 #define   FSTATE    02                  /* inode is file */
59 #define   DSTATE    03                  /* inode is directory */
60 #define   DFOUND    04                  /* directory found during descent */
61 #define   DCLEAR    05                  /* directory is to be cleared */
62 #define   FCLEAR    06                  /* file is to be cleared */
63 /*
64  * Inode state information is contained on per cylinder group lists
65  * which are described by the following structure.
66  */
67 extern struct inostatlist {
68           long      il_numalloced;      /* number of inodes allocated in this cg */
69           struct inostat *il_stat;/* inostat info for this cylinder group */
70 } *inostathead;
71 
72 /*
73  * buffer cache structure.
74  */
75 struct bufarea {
76           struct bufarea *b_next;                 /* free list queue */
77           struct bufarea *b_prev;                 /* free list queue */
78           ufs_daddr_t b_bno;
79           int b_size;
80           int b_errs;
81           int b_flags;
82           union {
83                     char *b_buf;                            /* buffer space */
84                     ufs_daddr_t *b_indir;                   /* indirect block */
85                     struct fs *b_fs;              /* super block */
86                     struct cg *b_cg;              /* cylinder group */
87                     struct ufs1_dinode *b_dinode; /* inode block */
88           } b_un;
89           char b_dirty;
90 };
91 
92 #define   B_INUSE 1
93 
94 #define   MINBUFS             5         /* minimum number of buffers required */
95 extern struct bufarea bufhead;                    /* head of list of other blks in filesys */
96 extern struct bufarea sblk;             /* file system superblock */
97 extern struct bufarea cgblk;            /* cylinder group blocks */
98 extern struct bufarea *pdirbp;                    /* current directory contents */
99 extern struct bufarea *pbp;             /* current inode block */
100 
101 #define   dirty(bp) (bp)->b_dirty = 1
102 #define   initbarea(bp) \
103           (bp)->b_dirty = 0; \
104           (bp)->b_bno = (ufs_daddr_t)-1; \
105           (bp)->b_flags = 0;
106 
107 #define   sbdirty() sblk.b_dirty = 1
108 #define   cgdirty() cgblk.b_dirty = 1
109 #define   sblock              (*sblk.b_un.b_fs)
110 #define   cgrp                (*cgblk.b_un.b_cg)
111 
112 enum fixstate {DONTKNOW, NOFIX, FIX, IGNORE};
113 
114 struct inodesc {
115           enum fixstate id_fix;         /* policy on fixing errors */
116           int (*id_func)(struct inodesc *);       /* function to be applied to blocks of inode */
117           ufs1_ino_t id_number;         /* inode number described */
118           ufs1_ino_t id_parent;         /* for DATA nodes, their parent */
119           ufs_daddr_t id_blkno;         /* current block number being examined */
120           int id_numfrags;    /* number of frags contained in block */
121           quad_t id_filesize; /* for DATA nodes, the size of the directory */
122           int id_loc;                   /* for DATA nodes, current location in dir */
123           int id_entryno;               /* for DATA nodes, current entry number */
124           struct direct *id_dirp;       /* for DATA nodes, ptr to current entry */
125           char *id_name;                /* for DATA nodes, name to find or enter */
126           char id_type;                 /* type of descriptor, DATA or ADDR */
127 };
128 /* file types */
129 #define   DATA      1
130 #define   ADDR      2
131 
132 /*
133  * Linked list of duplicate blocks.
134  *
135  * The list is composed of two parts. The first part of the
136  * list (from duplist through the node pointed to by muldup)
137  * contains a single copy of each duplicate block that has been
138  * found. The second part of the list (from muldup to the end)
139  * contains duplicate blocks that have been found more than once.
140  * To check if a block has been found as a duplicate it is only
141  * necessary to search from duplist through muldup. To find the
142  * total number of times that a block has been found as a duplicate
143  * the entire list must be searched for occurences of the block
144  * in question. The following diagram shows a sample list where
145  * w (found twice), x (found once), y (found three times), and z
146  * (found once) are duplicate block numbers:
147  *
148  *    w -> y -> x -> z -> y -> w -> y
149  *    ^                  ^
150  *    |                  |
151  * duplist            muldup
152  */
153 struct dups {
154           struct dups *next;
155           ufs_daddr_t dup;
156 };
157 extern struct dups *duplist;            /* head of dup list */
158 extern struct dups *muldup;             /* end of unique duplicate dup block numbers */
159 
160 /*
161  * Linked list of inodes with zero link counts.
162  */
163 struct zlncnt {
164           struct zlncnt *next;
165           ufs1_ino_t zlncnt;
166 };
167 extern struct zlncnt *zlnhead;                    /* head of zero link count list */
168 
169 /*
170  * Inode cache data structures.
171  */
172 struct inoinfo {
173           struct    inoinfo *i_nexthash;          /* next entry in hash chain */
174           ufs1_ino_t          i_number;           /* inode number of this entry */
175           ufs1_ino_t          i_parent;           /* inode number of parent */
176           ufs1_ino_t          i_dotdot;           /* inode number of `..' */
177           size_t    i_isize;            /* size of inode */
178           u_int     i_numblks;                    /* size of block array in bytes */
179           ufs_daddr_t i_blks[1];                  /* actually longer */
180 };
181 extern struct inoinfo **inphead, **inpsort;
182 extern long numdirs, dirhash, listmax, inplast, dirhashmask;
183 extern long countdirs;                            /* number of directories we actually found */
184 
185 /*
186  * Be careful about cache locality of reference, large filesystems may
187  * have tens of millions of directories in them and if fsck has to swap
188  * we want it to swap efficiently.  For this reason we try to group
189  * adjacent inodes together by a reasonable factor.
190  */
191 #define DIRHASH(ino)          ((ino >> 3) & dirhashmask)
192 
193 extern char         *cdevname;                    /* name of device being checked */
194 extern long         dev_bsize;                    /* computed value of DEV_BSIZE */
195 extern long         secsize;            /* actual disk sector size */
196 extern char         fflag;                        /* force check, ignore clean flag */
197 extern char         nflag;                        /* assume a no response */
198 extern char         yflag;                        /* assume a yes response */
199 extern int          bflag;                        /* location of alternate super block */
200 extern int          debug;                        /* output debugging info */
201 extern int          cvtlevel;           /* convert to newer file system format */
202 extern int          doinglevel1;                  /* converting to new cylinder group format */
203 extern int          doinglevel2;                  /* converting to new inode format */
204 extern int          newinofmt;                    /* filesystem has new inode format */
205 extern char         usedsoftdep;                  /* just fix soft dependency inconsistencies */
206 extern char         preen;                        /* just fix normal inconsistencies */
207 extern char         rerun;                        /* rerun fsck. Only used in non-preen mode */
208 extern int          returntosingle;               /* 1 => return to single user mode on exit */
209 extern char         resolved;           /* cleared if unresolved changes => not clean */
210 extern char         havesb;                       /* superblock has been read */
211 extern int          fsmodified;                   /* 1 => write done to file system */
212 extern int          fsreadfd;           /* file descriptor for reading file system */
213 extern int          fswritefd;                    /* file descriptor for writing file system */
214 extern int          lastmntonly;                  /* Output the last mounted on only */
215 
216 extern ufs_daddr_t maxfsblock;                    /* number of blocks in the file system */
217 extern char         *blockmap;                    /* ptr to primary blk allocation map */
218 extern ufs1_ino_t   maxino;                       /* number of inodes in file system */
219 
220 extern ufs1_ino_t   lfdir;                        /* lost & found directory inode number */
221 extern char         *lfname;            /* lost & found directory name */
222 extern int          lfmode;                       /* lost & found directory creation mode */
223 
224 extern ufs_daddr_t n_blks;              /* number of blocks in use */
225 extern ufs_daddr_t n_files;             /* number of files in use */
226 
227 extern int          got_siginfo;                  /* received a SIGINFO */
228 
229 #define   clearinode(dp)      (*(dp) = zino)
230 extern struct       ufs1_dinode zino;
231 
232 #define   setbmap(blkno)      setbit(blockmap, blkno)
233 #define   testbmap(blkno)     isset(blockmap, blkno)
234 #define   clrbmap(blkno)      clrbit(blockmap, blkno)
235 
236 #define   STOP      0x01
237 #define   SKIP      0x02
238 #define   KEEPON    0x04
239 #define   ALTERED   0x08
240 #define   FOUND     0x10
241 
242 #define   EEXIT     8                   /* Standard error exit. */
243 
244 struct fstab;
245 
246 
247 extern void                   adjust(struct inodesc *, int);
248 extern ufs_daddr_t  allocblk(long);
249 extern ufs1_ino_t             allocdir(ufs1_ino_t, ufs1_ino_t, int);
250 extern ufs1_ino_t             allocino(ufs1_ino_t, int);
251 extern void                   blkerror(ufs1_ino_t, char *, ufs_daddr_t);
252 extern char                *blockcheck(char *);
253 extern int                    bread(int, char *, ufs_daddr_t, long);
254 extern void                   bufinit(void);
255 extern void                   bwrite(int, char *, ufs_daddr_t, long);
256 extern void                   cacheino(struct ufs1_dinode *, ufs1_ino_t);
257 extern void                   catch(int) __dead2;
258 extern void                   catchquit(int);
259 extern int                    changeino(ufs1_ino_t, char *, ufs1_ino_t);
260 extern int                    checkfstab(int, int,
261                               int (*)(struct fstab *),
262                               int (*)(char *, char *, long, int));
263 extern int                    chkrange(ufs_daddr_t, int);
264 extern void                   ckfini(int);
265 extern int                    ckinode(struct ufs1_dinode *, struct inodesc *);
266 extern void                   clri(struct inodesc *, char *, int);
267 extern int                    clearentry(struct inodesc *);
268 extern void                   direrror(ufs1_ino_t, char *);
269 extern int                    dirscan(struct inodesc *);
270 extern int                    dofix(struct inodesc *, char *);
271 extern void                   ffs_clrblock(struct fs *, u_char *, ufs_daddr_t);
272 extern void                   ffs_fragacct(struct fs *, int, int32_t [], int);
273 extern int                    ffs_isblock(struct fs *, u_char *, ufs_daddr_t);
274 extern void                   ffs_setblock(struct fs *, u_char *, ufs_daddr_t);
275 extern void                   fileerror(ufs1_ino_t, ufs1_ino_t, char *);
276 extern int                    findino(struct inodesc *);
277 extern int                    findname(struct inodesc *);
278 extern void                   flush(int, struct bufarea *);
279 extern void                   freeblk(ufs_daddr_t, long);
280 extern void                   freeino(ufs1_ino_t);
281 extern void                   freeinodebuf(void);
282 extern int                    ftypeok(struct ufs1_dinode *);
283 extern void                   getblk(struct bufarea *, ufs_daddr_t, long);
284 extern struct bufarea *getdatablk(ufs_daddr_t, long);
285 extern struct inoinfo *getinoinfo(ufs1_ino_t);
286 extern struct ufs1_dinode  *getnextinode(ufs1_ino_t);
287 extern void                   getpathname(char *, ufs1_ino_t, ufs1_ino_t);
288 extern struct ufs1_dinode  *ginode(ufs1_ino_t);
289 extern void                   infohandler(int);
290 extern void                   inocleanup(void);
291 extern void                   inodirty(void);
292 extern struct inostat *inoinfo(ufs1_ino_t);
293 extern int                    linkup(ufs1_ino_t, ufs1_ino_t, char *);
294 extern int                    makeentry(ufs1_ino_t, ufs1_ino_t, char *);
295 extern void                   panic(const char *, ...) __dead2 __printflike(1, 2);
296 extern void                   pass1(void);
297 extern void                   pass1b(void);
298 extern int                    pass1check(struct inodesc *);
299 extern void                   pass2(void);
300 extern void                   pass3(void);
301 extern void                   pass4(void);
302 extern int                    pass4check(struct inodesc *);
303 extern void                   pass5(void);
304 extern void                   pfatal(const char *, ...) __printflike(1, 2);
305 extern void                   pinode(ufs1_ino_t);
306 extern void                   propagate(void);
307 extern void                   pwarn(const char *, ...) __printflike(1, 2);
308 extern int                    reply(char *);
309 extern void                   setinodebuf(ufs1_ino_t);
310 extern int                    setup(char *);
311 extern void                   voidquit(int);
312