dat.h (7941B)
1 typedef struct Arch Arch; 2 typedef struct BList BList; 3 typedef struct Block Block; 4 typedef struct Cache Cache; 5 typedef struct Disk Disk; 6 typedef struct Entry Entry; 7 typedef struct Fsck Fsck; 8 typedef struct Header Header; 9 typedef struct Label Label; 10 typedef struct Periodic Periodic; 11 typedef struct Snap Snap; 12 typedef struct Source Source; 13 typedef struct Super Super; 14 typedef struct WalkPtr WalkPtr; 15 16 #pragma incomplete Arch 17 #pragma incomplete BList 18 #pragma incomplete Cache 19 #pragma incomplete Disk 20 #pragma incomplete Periodic 21 #pragma incomplete Snap 22 23 /* tunable parameters - probably should not be constants */ 24 enum { 25 /* 26 * estimate of bytes per dir entries - determines number 27 * of index entries in the block 28 */ 29 BytesPerEntry = 100, 30 /* don't allocate in block if more than this percentage full */ 31 FullPercentage = 80, 32 FlushSize = 200, /* number of blocks to flush */ 33 DirtyPercentage = 50, /* maximum percentage of dirty blocks */ 34 }; 35 36 enum { 37 Nowaitlock, 38 Waitlock, 39 40 MaxBlock = (1UL<<31), 41 }; 42 43 enum { 44 HeaderMagic = 0x3776ae89, 45 HeaderVersion = 1, 46 HeaderOffset = 128*1024, 47 HeaderSize = 512, 48 SuperMagic = 0x2340a3b1, 49 SuperSize = 512, 50 SuperVersion = 1, 51 LabelSize = 14, 52 }; 53 54 /* well known tags */ 55 enum { 56 BadTag = 0, /* this tag should not be used */ 57 RootTag = 1, /* root of fs */ 58 EnumTag, /* root of a dir listing */ 59 UserTag = 32, /* all other tags should be >= UserTag */ 60 }; 61 62 struct Super { 63 u16int version; 64 u32int epochLow; 65 u32int epochHigh; 66 u64int qid; /* next qid */ 67 u32int active; /* root of active file system */ 68 u32int next; /* root of next snapshot to archive */ 69 u32int current; /* root of snapshot currently archiving */ 70 uchar last[VtScoreSize]; /* last snapshot successfully archived */ 71 char name[128]; /* label */ 72 }; 73 74 75 struct Fs { 76 Arch *arch; /* immutable */ 77 Cache *cache; /* immutable */ 78 int mode; /* immutable */ 79 int noatimeupd; /* immutable */ 80 int blockSize; /* immutable */ 81 VtConn *z; /* immutable */ 82 Snap *snap; /* immutable */ 83 /* immutable; copy here & Fsys to ease error reporting */ 84 char *name; 85 86 Periodic *metaFlush; /* periodically flushes metadata cached in files */ 87 88 /* 89 * epoch lock. 90 * Most operations on the fs require a read lock of elk, ensuring that 91 * the current high and low epochs do not change under foot. 92 * This lock is mostly acquired via a call to fileLock or fileRlock. 93 * Deletion and creation of snapshots occurs under a write lock of elk, 94 * ensuring no file operations are occurring concurrently. 95 */ 96 RWLock elk; /* epoch lock */ 97 u32int ehi; /* epoch high */ 98 u32int elo; /* epoch low */ 99 100 int halted; /* epoch lock is held to halt (console initiated) */ 101 102 Source *source; /* immutable: root of sources */ 103 File *file; /* immutable: root of files */ 104 }; 105 106 /* 107 * variant on VtEntry 108 * there are extra fields when stored locally 109 */ 110 struct Entry { 111 u32int gen; /* generation number */ 112 ushort psize; /* pointer block size */ 113 ushort dsize; /* data block size */ 114 uchar depth; /* unpacked from flags */ 115 uchar flags; 116 uvlong size; 117 uchar score[VtScoreSize]; 118 u32int tag; /* tag for local blocks: zero if stored on Venti */ 119 u32int snap; /* non-zero -> entering snapshot of given epoch */ 120 uchar archive; /* archive this snapshot: only valid for snap != 0 */ 121 }; 122 123 /* 124 * This is called a `stream' in the fossil paper. There used to be Sinks too. 125 * We believe that Sources and Files are one-to-one. 126 */ 127 struct Source { 128 Fs *fs; /* immutable */ 129 int mode; /* immutable */ 130 int issnapshot; /* immutable */ 131 u32int gen; /* immutable */ 132 int dsize; /* immutable */ 133 int dir; /* immutable */ 134 135 Source *parent; /* immutable */ 136 File *file; /* immutable; point back */ 137 138 QLock lk; 139 int ref; 140 /* 141 * epoch for the source 142 * for ReadWrite sources, epoch is used to lazily notice 143 * sources that must be split from the snapshots. 144 * for ReadOnly sources, the epoch represents the minimum epoch 145 * along the chain from the root, and is used to lazily notice 146 * sources that have become invalid because they belong to an old 147 * snapshot. 148 */ 149 u32int epoch; 150 Block *b; /* block containing this source */ 151 uchar score[VtScoreSize]; /* score of block containing this source */ 152 u32int scoreEpoch; /* epoch of block containing this source */ 153 int epb; /* immutable: entries per block in parent */ 154 u32int tag; /* immutable: tag of parent */ 155 u32int offset; /* immutable: entry offset in parent */ 156 }; 157 158 159 struct Header { 160 ushort version; 161 ushort blockSize; 162 ulong super; /* super blocks */ 163 ulong label; /* start of labels */ 164 ulong data; /* end of labels - start of data blocks */ 165 ulong end; /* end of data blocks */ 166 }; 167 168 /* 169 * contains a one block buffer 170 * to avoid problems of the block changing underfoot 171 * and to enable an interface that supports unget. 172 */ 173 struct DirEntryEnum { 174 File *file; 175 176 u32int boff; /* block offset */ 177 178 int i, n; 179 DirEntry *buf; 180 }; 181 182 /* Block states */ 183 enum { 184 BsFree = 0, /* available for allocation */ 185 BsBad = 0xFF, /* something is wrong with this block */ 186 187 /* bit fields */ 188 BsAlloc = 1<<0, /* block is in use */ 189 BsCopied = 1<<1,/* block has been copied (usually in preparation for unlink) */ 190 BsVenti = 1<<2, /* block has been stored on Venti */ 191 BsClosed = 1<<3,/* block has been unlinked on disk from active file system */ 192 BsMask = BsAlloc|BsCopied|BsVenti|BsClosed, 193 }; 194 195 /* 196 * block types 197 * more regular than Venti block types 198 * bit 3 -> block or data block 199 * bits 2-0 -> level of block 200 */ 201 enum { 202 BtData, 203 BtDir = 1<<3, 204 BtLevelMask = 7, 205 BtMax = 1<<4, 206 }; 207 208 /* io states */ 209 enum { 210 BioEmpty, /* label & data are not valid */ 211 BioLabel, /* label is good */ 212 BioClean, /* data is on the disk */ 213 BioDirty, /* data is not yet on the disk */ 214 BioReading, /* in process of reading data */ 215 BioWriting, /* in process of writing data */ 216 BioReadError, /* error reading: assume disk always handles write errors */ 217 BioVentiError, /* error reading from venti (probably disconnected) */ 218 BioMax 219 }; 220 221 struct Label { 222 uchar type; 223 uchar state; 224 u32int tag; 225 u32int epoch; 226 u32int epochClose; 227 }; 228 229 struct Block { 230 Cache *c; 231 int ref; 232 int nlock; 233 uintptr pc; /* pc that fetched this block from the cache */ 234 235 QLock lk; 236 237 int part; 238 u32int addr; 239 uchar score[VtScoreSize]; /* score */ 240 Label l; 241 242 uchar *dmap; 243 244 uchar *data; 245 246 /* the following is private; used by cache */ 247 248 Block *next; /* doubly linked hash chains */ 249 Block **prev; 250 u32int heap; /* index in heap table */ 251 u32int used; /* last reference times */ 252 253 u32int vers; /* version of dirty flag */ 254 255 BList *uhead; /* blocks to unlink when this block is written */ 256 BList *utail; 257 258 /* block ordering for cache -> disk */ 259 BList *prior; /* list of blocks before this one */ 260 261 Block *ionext; 262 int iostate; 263 Rendez ioready; 264 }; 265 266 /* tree walker, for gc and archiver */ 267 struct WalkPtr 268 { 269 uchar *data; 270 int isEntry; 271 int n; 272 int m; 273 Entry e; 274 uchar type; 275 u32int tag; 276 }; 277 278 enum 279 { 280 DoClose = 1<<0, 281 DoClre = 1<<1, 282 DoClri = 1<<2, 283 DoClrp = 1<<3, 284 }; 285 286 struct Fsck 287 { 288 /* filled in by caller */ 289 int printblocks; 290 int useventi; 291 int flags; 292 int printdirs; 293 int printfiles; 294 int walksnapshots; 295 int walkfs; 296 Fs *fs; 297 int (*print)(char*, ...); 298 void (*clre)(Fsck*, Block*, int); 299 void (*clrp)(Fsck*, Block*, int); 300 void (*close)(Fsck*, Block*, u32int); 301 void (*clri)(Fsck*, char*, MetaBlock*, int, Block*); 302 303 /* used internally */ 304 Cache *cache; 305 uchar *amap; /* all blocks seen so far */ 306 uchar *emap; /* all blocks seen in this epoch */ 307 uchar *xmap; /* all blocks in this epoch with parents in this epoch */ 308 uchar *errmap; /* blocks with errors */ 309 uchar *smap; /* walked sources */ 310 int nblocks; 311 int bsize; 312 int walkdepth; 313 u32int hint; /* where the next root probably is */ 314 int nseen; 315 int quantum; 316 int nclre; 317 int nclrp; 318 int nclose; 319 int nclri; 320 }; 321 322 /* disk partitions; keep in sync with partname[] in disk.c */ 323 enum { 324 PartError, 325 PartSuper, 326 PartLabel, 327 PartData, 328 PartVenti, /* fake partition */ 329 }; 330 331 extern int vtType[BtMax];