1 1.17 joerg /* $NetBSD: fsck.h,v 1.17 2020/04/05 15:25:39 joerg Exp $ */ 2 1.1 bouyer 3 1.1 bouyer /* 4 1.1 bouyer * Copyright (c) 1980, 1986, 1993 5 1.1 bouyer * The Regents of the University of California. All rights reserved. 6 1.8 agc * 7 1.8 agc * Redistribution and use in source and binary forms, with or without 8 1.8 agc * modification, are permitted provided that the following conditions 9 1.8 agc * are met: 10 1.8 agc * 1. Redistributions of source code must retain the above copyright 11 1.8 agc * notice, this list of conditions and the following disclaimer. 12 1.8 agc * 2. Redistributions in binary form must reproduce the above copyright 13 1.8 agc * notice, this list of conditions and the following disclaimer in the 14 1.8 agc * documentation and/or other materials provided with the distribution. 15 1.8 agc * 3. Neither the name of the University nor the names of its contributors 16 1.8 agc * may be used to endorse or promote products derived from this software 17 1.8 agc * without specific prior written permission. 18 1.8 agc * 19 1.8 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.8 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.8 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.8 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.8 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.8 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.8 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.8 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.8 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.8 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.8 agc * SUCH DAMAGE. 30 1.8 agc * 31 1.8 agc * @(#)fsck.h 8.1 (Berkeley) 6/5/93 32 1.8 agc */ 33 1.8 agc 34 1.8 agc /* 35 1.8 agc * Copyright (c) 1997 Manuel Bouyer. 36 1.1 bouyer * 37 1.1 bouyer * Redistribution and use in source and binary forms, with or without 38 1.1 bouyer * modification, are permitted provided that the following conditions 39 1.1 bouyer * are met: 40 1.1 bouyer * 1. Redistributions of source code must retain the above copyright 41 1.1 bouyer * notice, this list of conditions and the following disclaimer. 42 1.1 bouyer * 2. Redistributions in binary form must reproduce the above copyright 43 1.1 bouyer * notice, this list of conditions and the following disclaimer in the 44 1.1 bouyer * documentation and/or other materials provided with the distribution. 45 1.1 bouyer * 46 1.10 bouyer * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 47 1.10 bouyer * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 48 1.10 bouyer * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 49 1.10 bouyer * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 50 1.10 bouyer * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 51 1.10 bouyer * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 52 1.10 bouyer * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 53 1.10 bouyer * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 54 1.10 bouyer * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 55 1.10 bouyer * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56 1.1 bouyer * 57 1.1 bouyer * @(#)fsck.h 8.1 (Berkeley) 6/5/93 58 1.1 bouyer */ 59 1.1 bouyer 60 1.1 bouyer #define MAXDUP 10 /* limit on dup blks (per inode) */ 61 1.1 bouyer #define MAXBAD 10 /* limit on bad blks (per inode) */ 62 1.1 bouyer #define MAXBUFSPACE 80*1024 /* maximum space to allocate to buffers */ 63 1.1 bouyer #define INOBUFSIZE 128*1024 /* size of buffer to read inodes in pass1 */ 64 1.1 bouyer 65 1.1 bouyer #ifndef BUFSIZ 66 1.1 bouyer #define BUFSIZ 1024 67 1.1 bouyer #endif 68 1.1 bouyer 69 1.1 bouyer #define USTATE 01 /* inode not allocated */ 70 1.1 bouyer #define FSTATE 02 /* inode is file */ 71 1.1 bouyer #define DSTATE 03 /* inode is directory */ 72 1.1 bouyer #define DFOUND 04 /* directory found during descent */ 73 1.1 bouyer #define DCLEAR 05 /* directory is to be cleared */ 74 1.1 bouyer #define FCLEAR 06 /* file is to be cleared */ 75 1.1 bouyer 76 1.1 bouyer /* 77 1.1 bouyer * buffer cache structure. 78 1.1 bouyer */ 79 1.1 bouyer struct bufarea { 80 1.1 bouyer struct bufarea *b_next; /* free list queue */ 81 1.1 bouyer struct bufarea *b_prev; /* free list queue */ 82 1.1 bouyer daddr_t b_bno; 83 1.1 bouyer int b_size; 84 1.1 bouyer int b_errs; 85 1.1 bouyer int b_flags; 86 1.1 bouyer union { 87 1.1 bouyer char *b_buf; /* buffer space */ 88 1.6 fvdl /* XXX ondisk32 */ 89 1.6 fvdl int32_t *b_indir; /* indirect block */ 90 1.2 bouyer struct ext2fs *b_fs; /* super block */ 91 1.1 bouyer struct ext2_gd *b_cgd; /* cylinder group descriptor */ 92 1.1 bouyer struct ext2fs_dinode *b_dinode; /* inode block */ 93 1.1 bouyer } b_un; 94 1.1 bouyer char b_dirty; 95 1.1 bouyer }; 96 1.1 bouyer 97 1.1 bouyer #define B_INUSE 1 98 1.1 bouyer 99 1.1 bouyer #define MINBUFS 5 /* minimum number of buffers required */ 100 1.17 joerg extern struct bufarea bufhead; /* head of list of other blks in filesys */ 101 1.17 joerg extern struct bufarea sblk; /* file system superblock */ 102 1.17 joerg extern struct bufarea asblk; /* first alternate superblock */ 103 1.17 joerg extern struct bufarea *pdirbp; /* current directory contents */ 104 1.17 joerg extern struct bufarea *pbp; /* current inode block */ 105 1.17 joerg extern struct bufarea *getdatablk(daddr_t, long); 106 1.17 joerg extern struct m_ext2fs sblock; 107 1.1 bouyer 108 1.1 bouyer #define dirty(bp) (bp)->b_dirty = 1 109 1.1 bouyer #define initbarea(bp) \ 110 1.1 bouyer (bp)->b_dirty = 0; \ 111 1.1 bouyer (bp)->b_bno = (daddr_t)-1; \ 112 1.1 bouyer (bp)->b_flags = 0; 113 1.1 bouyer 114 1.2 bouyer #define sbdirty() copyback_sb(&sblk); sblk.b_dirty = 1 115 1.1 bouyer 116 1.1 bouyer enum fixstate {DONTKNOW, NOFIX, FIX, IGNORE}; 117 1.1 bouyer 118 1.1 bouyer struct inodesc { 119 1.1 bouyer enum fixstate id_fix; /* policy on fixing errors */ 120 1.1 bouyer int (*id_func) /* function to be applied to blocks of inode */ 121 1.11 xtraeme (struct inodesc *); 122 1.1 bouyer ino_t id_number; /* inode number described */ 123 1.1 bouyer ino_t id_parent; /* for DATA nodes, their parent */ 124 1.1 bouyer daddr_t id_blkno; /* current block number being examined */ 125 1.1 bouyer int id_numfrags; /* number of frags contained in block */ 126 1.1 bouyer quad_t id_filesize; /* for DATA nodes, the size of the directory */ 127 1.1 bouyer int id_loc; /* for DATA nodes, current location in dir */ 128 1.1 bouyer int id_entryno; /* for DATA nodes, current entry number */ 129 1.1 bouyer struct ext2fs_direct *id_dirp; /* for DATA nodes, ptr to current entry */ 130 1.13 christos const char *id_name; /* for DATA nodes, name to find or enter */ 131 1.1 bouyer char id_type; /* type of descriptor, DATA or ADDR */ 132 1.1 bouyer }; 133 1.1 bouyer /* file types */ 134 1.1 bouyer #define DATA 1 135 1.1 bouyer #define ADDR 2 136 1.1 bouyer 137 1.1 bouyer /* 138 1.1 bouyer * Linked list of duplicate blocks. 139 1.1 bouyer * 140 1.1 bouyer * The list is composed of two parts. The first part of the 141 1.1 bouyer * list (from duplist through the node pointed to by muldup) 142 1.1 bouyer * contains a single copy of each duplicate block that has been 143 1.1 bouyer * found. The second part of the list (from muldup to the end) 144 1.1 bouyer * contains duplicate blocks that have been found more than once. 145 1.1 bouyer * To check if a block has been found as a duplicate it is only 146 1.1 bouyer * necessary to search from duplist through muldup. To find the 147 1.1 bouyer * total number of times that a block has been found as a duplicate 148 1.7 wiz * the entire list must be searched for occurrences of the block 149 1.1 bouyer * in question. The following diagram shows a sample list where 150 1.1 bouyer * w (found twice), x (found once), y (found three times), and z 151 1.1 bouyer * (found once) are duplicate block numbers: 152 1.1 bouyer * 153 1.1 bouyer * w -> y -> x -> z -> y -> w -> y 154 1.1 bouyer * ^ ^ 155 1.1 bouyer * | | 156 1.1 bouyer * duplist muldup 157 1.1 bouyer */ 158 1.1 bouyer struct dups { 159 1.1 bouyer struct dups *next; 160 1.1 bouyer daddr_t dup; 161 1.1 bouyer }; 162 1.17 joerg extern struct dups *duplist; /* head of dup list */ 163 1.17 joerg extern struct dups *muldup; /* end of unique duplicate dup block numbers */ 164 1.1 bouyer 165 1.1 bouyer /* 166 1.1 bouyer * Linked list of inodes with zero link counts. 167 1.1 bouyer */ 168 1.1 bouyer struct zlncnt { 169 1.1 bouyer struct zlncnt *next; 170 1.1 bouyer ino_t zlncnt; 171 1.1 bouyer }; 172 1.17 joerg extern struct zlncnt *zlnhead; /* head of zero link count list */ 173 1.1 bouyer 174 1.1 bouyer /* 175 1.1 bouyer * Inode cache data structures. 176 1.1 bouyer */ 177 1.17 joerg extern struct inoinfo { 178 1.1 bouyer struct inoinfo *i_nexthash; /* next entry in hash chain */ 179 1.1 bouyer struct inoinfo *i_child, *i_sibling, *i_parentp; 180 1.1 bouyer ino_t i_number; /* inode number of this entry */ 181 1.1 bouyer ino_t i_parent; /* inode number of parent */ 182 1.1 bouyer ino_t i_dotdot; /* inode number of `..' */ 183 1.12 ws u_int64_t i_isize; /* size of inode */ 184 1.1 bouyer u_int i_numblks; /* size of block array in bytes */ 185 1.6 fvdl /* XXX ondisk32 */ 186 1.6 fvdl int32_t i_blks[1]; /* actually longer */ 187 1.1 bouyer } **inphead, **inpsort; 188 1.17 joerg extern long numdirs, listmax, inplast; 189 1.1 bouyer 190 1.17 joerg extern long dev_bsize; /* computed value of DEV_BSIZE */ 191 1.17 joerg extern long secsize; /* actual disk sector size */ 192 1.17 joerg extern char nflag; /* assume a no response */ 193 1.17 joerg extern char yflag; /* assume a yes response */ 194 1.17 joerg extern int bflag; /* location of alternate super block */ 195 1.17 joerg extern int Uflag; /* resolve user names */ 196 1.17 joerg extern int debug; /* output debugging info */ 197 1.17 joerg extern int preen; /* just fix normal inconsistencies */ 198 1.17 joerg extern char havesb; /* superblock has been read */ 199 1.17 joerg extern char skipclean; /* skip clean file systems if preening */ 200 1.17 joerg extern int fsmodified; /* 1 => write done to file system */ 201 1.17 joerg extern int fsreadfd; /* file descriptor for reading file system */ 202 1.17 joerg extern int fswritefd; /* file descriptor for writing file system */ 203 1.17 joerg extern int rerun; /* rerun fsck. Only used in non-preen mode */ 204 1.17 joerg 205 1.17 joerg extern daddr_t maxfsblock; /* number of blocks in the file system */ 206 1.17 joerg extern char *blockmap; /* ptr to primary blk allocation map */ 207 1.17 joerg extern ino_t maxino; /* number of inodes in file system */ 208 1.17 joerg extern ino_t lastino; /* last inode in use */ 209 1.17 joerg extern char *statemap; /* ptr to inode state table */ 210 1.17 joerg extern u_char *typemap; /* ptr to inode type table */ 211 1.17 joerg extern int16_t *lncntp; /* ptr to link count table */ 212 1.1 bouyer 213 1.17 joerg extern ino_t lfdir; /* lost & found directory inode number */ 214 1.13 christos extern const char *lfname; /* lost & found directory name */ 215 1.5 christos extern int lfmode; /* lost & found directory creation mode */ 216 1.1 bouyer 217 1.17 joerg extern daddr_t n_blks; /* number of blocks in use */ 218 1.17 joerg extern daddr_t n_files; /* number of files in use */ 219 1.1 bouyer 220 1.1 bouyer #define clearinode(dp) (*(dp) = zino) 221 1.17 joerg extern struct ext2fs_dinode zino; 222 1.1 bouyer 223 1.1 bouyer #define setbmap(blkno) setbit(blockmap, blkno) 224 1.1 bouyer #define testbmap(blkno) isset(blockmap, blkno) 225 1.1 bouyer #define clrbmap(blkno) clrbit(blockmap, blkno) 226 1.1 bouyer 227 1.1 bouyer #define STOP 0x01 228 1.1 bouyer #define SKIP 0x02 229 1.1 bouyer #define KEEPON 0x04 230 1.1 bouyer #define ALTERED 0x08 231 1.1 bouyer #define FOUND 0x10 232 1.1 bouyer 233 1.16 jdolecek /* 234 1.16 jdolecek * Kernel support for features doesn't imply fsck support 235 1.16 jdolecek */ 236 1.16 jdolecek #define EXT2F_COMPAT_SUPP_FSCK 0x00 237 1.16 jdolecek #define EXT2F_ROCOMPAT_SUPP_FSCK (EXT2F_ROCOMPAT_SPARSESUPER \ 238 1.16 jdolecek | EXT2F_ROCOMPAT_LARGEFILE \ 239 1.16 jdolecek | EXT2F_ROCOMPAT_HUGE_FILE \ 240 1.16 jdolecek ) 241 1.16 jdolecek #define EXT2F_INCOMPAT_SUPP_FSCK (EXT2F_INCOMPAT_FTYPE \ 242 1.16 jdolecek ) 243 1.16 jdolecek 244 1.11 xtraeme struct ext2fs_dinode *ginode(ino_t); 245 1.11 xtraeme struct inoinfo *getinoinfo(ino_t); 246 1.11 xtraeme void getblk(struct bufarea *, daddr_t, long); 247 1.11 xtraeme ino_t allocino(ino_t, int); 248 1.11 xtraeme void copyback_sb(struct bufarea*); 249 1.11 xtraeme daddr_t cgoverhead(int); /* overhead per cg */ 250