Blame


1 7763a61a 2003-11-23 devnull typedef struct Source Source;
2 7763a61a 2003-11-23 devnull typedef struct VacFile VacFile;
3 7763a61a 2003-11-23 devnull typedef struct MetaBlock MetaBlock;
4 7763a61a 2003-11-23 devnull typedef struct MetaEntry MetaEntry;
5 7763a61a 2003-11-23 devnull typedef struct Lump Lump;
6 7763a61a 2003-11-23 devnull typedef struct Cache Cache;
7 7763a61a 2003-11-23 devnull typedef struct Super Super;
8 7763a61a 2003-11-23 devnull
9 7763a61a 2003-11-23 devnull enum {
10 7763a61a 2003-11-23 devnull NilBlock = (~0UL),
11 7763a61a 2003-11-23 devnull MaxBlock = (1UL<<31),
12 7763a61a 2003-11-23 devnull };
13 7763a61a 2003-11-23 devnull
14 7763a61a 2003-11-23 devnull
15 7763a61a 2003-11-23 devnull struct VacFS {
16 7763a61a 2003-11-23 devnull int ref;
17 7763a61a 2003-11-23 devnull
18 7763a61a 2003-11-23 devnull /* need a read write lock? */
19 7763a61a 2003-11-23 devnull
20 7763a61a 2003-11-23 devnull uchar score[VtScoreSize];
21 7763a61a 2003-11-23 devnull VacFile *root;
22 7763a61a 2003-11-23 devnull
23 7763a61a 2003-11-23 devnull VtSession *z;
24 7763a61a 2003-11-23 devnull int readOnly;
25 7763a61a 2003-11-23 devnull int bsize; /* maximum block size */
26 7763a61a 2003-11-23 devnull uvlong qid; /* next qid */
27 7763a61a 2003-11-23 devnull Cache *cache;
28 7763a61a 2003-11-23 devnull };
29 7763a61a 2003-11-23 devnull
30 7763a61a 2003-11-23 devnull
31 7763a61a 2003-11-23 devnull struct Source {
32 7763a61a 2003-11-23 devnull VtLock *lk;
33 7763a61a 2003-11-23 devnull
34 7763a61a 2003-11-23 devnull Cache *cache; /* immutable */
35 7763a61a 2003-11-23 devnull int readOnly; /* immutable */
36 7763a61a 2003-11-23 devnull
37 7763a61a 2003-11-23 devnull Lump *lump; /* lump containing venti dir entry */
38 7763a61a 2003-11-23 devnull ulong block; /* block number within parent: immutable */
39 7763a61a 2003-11-23 devnull int entry; /* which entry in the block: immutable */
40 7763a61a 2003-11-23 devnull
41 7763a61a 2003-11-23 devnull /* most of a VtEntry, except the score */
42 7763a61a 2003-11-23 devnull ulong gen; /* generation: immutable */
43 7763a61a 2003-11-23 devnull int dir; /* dir flags: immutable */
44 7763a61a 2003-11-23 devnull int depth; /* number of levels of pointer blocks */
45 7763a61a 2003-11-23 devnull int psize; /* pointer block size: immutable */
46 7763a61a 2003-11-23 devnull int dsize; /* data block size: immutable */
47 7763a61a 2003-11-23 devnull uvlong size; /* size in bytes of file */
48 7763a61a 2003-11-23 devnull
49 7763a61a 2003-11-23 devnull int epb; /* dir entries per block = dize/VtEntrySize: immutable */
50 7763a61a 2003-11-23 devnull };
51 7763a61a 2003-11-23 devnull
52 7763a61a 2003-11-23 devnull struct MetaEntry {
53 7763a61a 2003-11-23 devnull uchar *p;
54 7763a61a 2003-11-23 devnull ushort size;
55 7763a61a 2003-11-23 devnull };
56 7763a61a 2003-11-23 devnull
57 7763a61a 2003-11-23 devnull struct MetaBlock {
58 7763a61a 2003-11-23 devnull int maxsize; /* size of block */
59 7763a61a 2003-11-23 devnull int size; /* size used */
60 7763a61a 2003-11-23 devnull int free; /* free space within used size */
61 7763a61a 2003-11-23 devnull int maxindex; /* entries allocated for table */
62 7763a61a 2003-11-23 devnull int nindex; /* amount of table used */
63 7763a61a 2003-11-23 devnull int unbotch;
64 7763a61a 2003-11-23 devnull uchar *buf;
65 7763a61a 2003-11-23 devnull };
66 7763a61a 2003-11-23 devnull
67 7763a61a 2003-11-23 devnull /*
68 7763a61a 2003-11-23 devnull * contains a one block buffer
69 7763a61a 2003-11-23 devnull * to avoid problems of the block changing underfoot
70 7763a61a 2003-11-23 devnull * and to enable an interface that supports unget.
71 7763a61a 2003-11-23 devnull */
72 7763a61a 2003-11-23 devnull struct VacDirEnum {
73 7763a61a 2003-11-23 devnull VacFile *file;
74 7763a61a 2003-11-23 devnull
75 7763a61a 2003-11-23 devnull ulong block; /* current block */
76 7763a61a 2003-11-23 devnull MetaBlock mb; /* parsed version of block */
77 7763a61a 2003-11-23 devnull int index; /* index in block */
78 7763a61a 2003-11-23 devnull };
79 7763a61a 2003-11-23 devnull
80 7763a61a 2003-11-23 devnull /* Lump states */
81 7763a61a 2003-11-23 devnull enum {
82 7763a61a 2003-11-23 devnull LumpFree,
83 7763a61a 2003-11-23 devnull LumpVenti, /* on venti server: score > 2^32: just a cached copy */
84 7763a61a 2003-11-23 devnull LumpActive, /* active */
85 7763a61a 2003-11-23 devnull LumpActiveRO, /* active: read only block */
86 7763a61a 2003-11-23 devnull LumpActiveA, /* active: achrived */
87 7763a61a 2003-11-23 devnull LumpSnap, /* snapshot: */
88 7763a61a 2003-11-23 devnull LumpSnapRO, /* snapshot: read only */
89 7763a61a 2003-11-23 devnull LumpSnapA, /* snapshot: achived */
90 7763a61a 2003-11-23 devnull LumpZombie, /* block with no pointer to it: waiting to be freed */
91 7763a61a 2003-11-23 devnull
92 7763a61a 2003-11-23 devnull LumpMax
93 7763a61a 2003-11-23 devnull };
94 7763a61a 2003-11-23 devnull
95 7763a61a 2003-11-23 devnull /*
96 7763a61a 2003-11-23 devnull * Each lump has a state and generation
97 7763a61a 2003-11-23 devnull * The following invariants are maintained
98 7763a61a 2003-11-23 devnull * Each lump has no more than than one parent per generation
99 7763a61a 2003-11-23 devnull * For Active*, no child has a parent of a greater generation
100 7763a61a 2003-11-23 devnull * For Snap*, there is a snap parent of given generation and there are
101 7763a61a 2003-11-23 devnull * no parents of greater gen - implies no children of a greater gen
102 7763a61a 2003-11-23 devnull * For *RO, the lump is fixed - no change ca be made - all pointers
103 7763a61a 2003-11-23 devnull * are valid venti addresses
104 7763a61a 2003-11-23 devnull * For *A, the lump is on the venti server
105 7763a61a 2003-11-23 devnull * There are no pointers to Zombie lumps
106 7763a61a 2003-11-23 devnull *
107 7763a61a 2003-11-23 devnull * Transitions
108 7763a61a 2003-11-23 devnull * Archiver at generation g
109 7763a61a 2003-11-23 devnull * Mutator at generation h
110 7763a61a 2003-11-23 devnull *
111 7763a61a 2003-11-23 devnull * Want to modify a lump
112 7763a61a 2003-11-23 devnull * Venti: create new Active(h)
113 7763a61a 2003-11-23 devnull * Active(x): x == h: do nothing
114 7763a61a 2003-11-23 devnull * Acitve(x): x < h: change to Snap(h-1) + add Active(h)
115 7763a61a 2003-11-23 devnull * ActiveRO(x): change to SnapRO(h-1) + add Active(h)
116 7763a61a 2003-11-23 devnull * ActiveA(x): add Active(h)
117 7763a61a 2003-11-23 devnull * Snap*(x): should not occur
118 7763a61a 2003-11-23 devnull * Zombie(x): should not occur
119 7763a61a 2003-11-23 devnull * Want to archive
120 7763a61a 2003-11-23 devnull * Active(x): x != g: should never happen
121 7763a61a 2003-11-23 devnull * Active(x): x == g fix children and free them: move to ActoveRO(g);
122 7763a61a 2003-11-23 devnull * ActiveRO(x): x != g: should never happen
123 7763a61a 2003-11-23 devnull * ActiveRO(x): x == g: wait until it hits ActiveA or SnapA
124 7763a61a 2003-11-23 devnull * ActiveA(x): done
125 7763a61a 2003-11-23 devnull * Active(x): x < g: should never happen
126 7763a61a 2003-11-23 devnull * Snap(x): x >= g: fix children, freeing all SnapA(y) x == y;
127 7763a61a 2003-11-23 devnull * SnapRO(x): wait until it hits SnapA
128 7763a61a 2003-11-23 devnull *
129 7763a61a 2003-11-23 devnull */
130 7763a61a 2003-11-23 devnull
131 7763a61a 2003-11-23 devnull
132 7763a61a 2003-11-23 devnull struct Lump {
133 7763a61a 2003-11-23 devnull int ref;
134 7763a61a 2003-11-23 devnull
135 7763a61a 2003-11-23 devnull Cache *c;
136 7763a61a 2003-11-23 devnull
137 7763a61a 2003-11-23 devnull VtLock *lk;
138 7763a61a 2003-11-23 devnull
139 7763a61a 2003-11-23 devnull int state;
140 7763a61a 2003-11-23 devnull ulong gen;
141 7763a61a 2003-11-23 devnull
142 7763a61a 2003-11-23 devnull uchar *data;
143 7763a61a 2003-11-23 devnull uchar score[VtScoreSize]; /* score of packet */
144 7763a61a 2003-11-23 devnull uchar vscore[VtScoreSize]; /* venti score - when archived */
145 7763a61a 2003-11-23 devnull u8int type; /* type of packet */
146 7763a61a 2003-11-23 devnull int dir; /* part of a directory - extension of type */
147 7763a61a 2003-11-23 devnull u16int asize; /* allocated size of block */
148 7763a61a 2003-11-23 devnull Lump *next; /* doubly linked hash chains */
149 7763a61a 2003-11-23 devnull Lump *prev;
150 7763a61a 2003-11-23 devnull u32int heap; /* index in heap table */
151 7763a61a 2003-11-23 devnull u32int used; /* last reference times */
152 7763a61a 2003-11-23 devnull u32int used2;
153 7763a61a 2003-11-23 devnull
154 7763a61a 2003-11-23 devnull u32int addr; /* mutable block address */
155 7763a61a 2003-11-23 devnull };
156 7763a61a 2003-11-23 devnull