1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 * 6 * @(#)fsck.h 5.5 (Berkeley) 04/07/87 7 */ 8 9 #define MAXDUP 10 /* limit on dup blks (per inode) */ 10 #define MAXBAD 10 /* limit on bad blks (per inode) */ 11 12 typedef int (*SIG_TYP)(); 13 14 #ifndef BUFSIZ 15 #define BUFSIZ 1024 16 #endif 17 18 #define USTATE 01 /* inode not allocated */ 19 #define FSTATE 02 /* inode is file */ 20 #define DSTATE 03 /* inode is directory */ 21 #define DFOUND 04 /* directory found during descent */ 22 #define DCLEAR 05 /* directory is to be cleared */ 23 #define FCLEAR 06 /* file is to be cleared */ 24 25 typedef struct dinode DINODE; 26 typedef struct direct DIRECT; 27 28 #define ALLOC(dip) (((dip)->di_mode & IFMT) != 0) 29 #define DIRCT(dip) (((dip)->di_mode & IFMT) == IFDIR) 30 #define SPECIAL(dip) \ 31 (((dip)->di_mode & IFMT) == IFBLK || ((dip)->di_mode & IFMT) == IFCHR) 32 33 #define MAXNINDIR (MAXBSIZE / sizeof (daddr_t)) 34 #define MAXINOPB (MAXBSIZE / sizeof (struct dinode)) 35 #define SPERB (MAXBSIZE / sizeof(short)) 36 37 struct bufarea { 38 struct bufarea *b_next; /* must be first */ 39 daddr_t b_bno; 40 int b_size; 41 int b_errs; 42 union { 43 char b_buf[MAXBSIZE]; /* buffer space */ 44 short b_lnks[SPERB]; /* link counts */ 45 daddr_t b_indir[MAXNINDIR]; /* indirect block */ 46 struct fs b_fs; /* super block */ 47 struct cg b_cg; /* cylinder group */ 48 struct dinode b_dinode[MAXINOPB]; /* inode block */ 49 } b_un; 50 char b_dirty; 51 }; 52 53 typedef struct bufarea BUFAREA; 54 55 BUFAREA inoblk; /* inode blocks */ 56 BUFAREA fileblk; /* other blks in filesys */ 57 BUFAREA sblk; /* file system superblock */ 58 BUFAREA cgblk; /* cylinder group blocks */ 59 60 #define initbarea(x) (x)->b_dirty = 0;(x)->b_bno = (daddr_t)-1 61 #define dirty(x) (x)->b_dirty = 1 62 #define inodirty() inoblk.b_dirty = 1 63 #define sbdirty() sblk.b_dirty = 1 64 #define cgdirty() cgblk.b_dirty = 1 65 66 #define dirblk fileblk.b_un 67 #define sblock sblk.b_un.b_fs 68 #define cgrp cgblk.b_un.b_cg 69 70 struct filecntl { 71 int rfdes; 72 int wfdes; 73 int mod; 74 } dfile; /* file descriptors for filesys */ 75 76 enum fixstate {DONTKNOW, NOFIX, FIX}; 77 78 struct inodesc { 79 enum fixstate id_fix; /* policy on fixing errors */ 80 int (*id_func)(); /* function to be applied to blocks of inode */ 81 ino_t id_number; /* inode number described */ 82 ino_t id_parent; /* for DATA nodes, their parent */ 83 daddr_t id_blkno; /* current block number being examined */ 84 int id_numfrags; /* number of frags contained in block */ 85 long id_filesize; /* for DATA nodes, the size of the directory */ 86 int id_loc; /* for DATA nodes, current location in dir */ 87 int id_entryno; /* for DATA nodes, current entry number */ 88 DIRECT *id_dirp; /* for DATA nodes, ptr to current entry */ 89 char *id_name; /* for DATA nodes, name to find or enter */ 90 char id_type; /* type of descriptor, DATA or ADDR */ 91 }; 92 /* file types */ 93 #define DATA 1 94 #define ADDR 2 95 96 /* 97 * Linked list of duplicate blocks. 98 * 99 * The list is composed of two parts. The first part of the 100 * list (from duplist through the node pointed to by muldup) 101 * contains a single copy of each duplicate block that has been 102 * found. The second part of the list (from muldup to the end) 103 * contains duplicate blocks that have been found more than once. 104 * To check if a block has been found as a duplicate it is only 105 * necessary to search from duplist through muldup. To find the 106 * total number of times that a block has been found as a duplicate 107 * the entire list must be searched for occurences of the block 108 * in question. The following diagram shows a sample list where 109 * w (found twice), x (found once), y (found three times), and z 110 * (found once) are duplicate block numbers: 111 * 112 * w -> y -> x -> z -> y -> w -> y 113 * ^ ^ 114 * | | 115 * duplist muldup 116 */ 117 struct dups { 118 struct dups *next; 119 daddr_t dup; 120 }; 121 struct dups *duplist; /* head of dup list */ 122 struct dups *muldup; /* end of unique duplicate dup block numbers */ 123 124 /* 125 * Linked list of inodes with zero link counts. 126 */ 127 struct zlncnt { 128 struct zlncnt *next; 129 ino_t zlncnt; 130 }; 131 struct zlncnt *zlnhead; /* head of zero link count list */ 132 133 char rawflg; 134 char *devname; 135 long dev_bsize; /* computed value of DEV_BSIZE */ 136 long secsize; /* actual disk sector size */ 137 char nflag; /* assume a no response */ 138 char yflag; /* assume a yes response */ 139 int bflag; /* location of alternate super block */ 140 int debug; /* output debugging info */ 141 char preen; /* just fix normal inconsistencies */ 142 char hotroot; /* checking root device */ 143 char havesb; /* superblock has been read */ 144 145 char *blockmap; /* ptr to primary blk allocation map */ 146 char *statemap; /* ptr to inode state table */ 147 short *lncntp; /* ptr to link count table */ 148 149 char pathname[BUFSIZ]; /* current pathname */ 150 char *pathp; /* pointer to pathname position */ 151 char *endpathname; 152 153 daddr_t fmax; /* number of blocks in the volume */ 154 ino_t imax; /* number of inodes */ 155 ino_t lastino; /* hiwater mark of inodes */ 156 ino_t lfdir; /* lost & found directory inode number */ 157 char *lfname; /* lost & found directory name */ 158 159 off_t maxblk; /* largest logical blk in file */ 160 off_t bmapsz; /* num chars in blockmap */ 161 162 daddr_t n_blks; /* number of blocks used */ 163 daddr_t n_files; /* number of files seen */ 164 165 #define zapino(x) (*(x) = zino) 166 struct dinode zino; 167 168 #define setbmap(x) setbit(blockmap, x) 169 #define getbmap(x) isset(blockmap, x) 170 #define clrbmap(x) clrbit(blockmap, x) 171 172 #define FOUND 020 173 #define ALTERED 010 174 #define KEEPON 04 175 #define SKIP 02 176 #define STOP 01 177 178 time_t time(); 179 DINODE *ginode(); 180 BUFAREA *getblk(); 181 int findino(); 182