]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/hjfs/dat.h
hjfs: disable hjfs check until more functionality is complete
[plan9front.git] / sys / src / cmd / hjfs / dat.h
1 enum {
2         /* affects on-disk structure */
3         BLOCK = 4096,
4         RBLOCK = BLOCK - 1,
5         SUPERMAGIC = 0x6E0DE51C,
6         SUPERBLK = 0,
7         
8         NAMELEN = 256,
9         NDIRECT = 15,
10         NINDIRECT = 4,
11         
12         ROOTQID = 1,
13         DUMPROOTQID = 2,
14         
15         /* affects just run-time behaviour */
16         SYNCINTERVAL = 10000,
17         FREELISTLEN = 256,
18         BUFHASHBITS = 8,
19         BUFHASH = (1<<BUFHASHBITS)-1,
20         NWORKERS = 5,
21         EXCLDUR = 300,
22
23         NOUID = (short)0x8000,
24         USERLEN = 64,
25 };
26
27 typedef struct Fs Fs;
28 typedef struct Buf Buf;
29 typedef struct Dev Dev;
30 typedef struct BufReq BufReq;
31 typedef struct ThrData ThrData;
32 typedef struct Superblock Superblock;
33 typedef struct Dentry Dentry;
34 typedef struct Chan Chan;
35 typedef struct FLoc FLoc;
36 typedef struct Loc Loc;
37 typedef struct User User;
38
39 #pragma incomplete struct User
40 #pragma varargck type "T" int
41 #pragma varargck type "T" uint
42 enum {
43         TRAW,
44         TSUPERBLOCK,
45         TDENTRY,
46         TINDIR,
47         TREF,
48         TDONTCARE = -1,
49 };
50
51 struct Superblock {
52         ulong magic;
53         uvlong size;
54         uvlong fstart;
55         uvlong fend;
56         uvlong root;
57         uvlong qidpath;
58 };
59
60 enum {
61         DALLOC = 1<<15,
62         DGONE = 1<<14,
63 };
64
65 struct Dentry {
66         char name[NAMELEN];
67         short uid;
68         short muid;
69         short gid;
70         ushort mode;
71         Qid;
72         uvlong size; /* bytes for files and blocks for dirs */
73         uvlong db[NDIRECT];
74         uvlong ib[NINDIRECT];
75         vlong atime;
76         vlong mtime;
77 };
78
79 enum {
80         DENTRYSIZ = NAMELEN + 4 * sizeof(ushort) + 13 + (3 + NDIRECT + NINDIRECT) * sizeof(uvlong),
81         DEPERBLK = RBLOCK / DENTRYSIZ,
82         /* Given any opportunity to make a breaking change to hjfs,
83          * make this 12 an 8. Indirect offsets to blocks used to
84          * hold an incrementing  4 byte generation number. That
85          * design has changed.
86          */
87         OFFPERBLK = RBLOCK / 12,
88         REFSIZ = 3,
89         REFPERBLK = RBLOCK / REFSIZ,
90         REFSENTINEL = (1 << 8*REFSIZ) - 1,
91 };
92
93 struct BufReq {
94         Dev *d;
95         uvlong off;
96         int nodata;
97         Channel *resp;
98         BufReq *next;
99 };
100
101 enum {
102         BWRITE = 1, /* used only for the worker */
103         BWRIM = 2, /* write immediately after putbuf */
104         BDELWRI = 4, /* write delayed */
105 };
106
107 struct Buf {
108         uchar op, type;
109         union {
110                 uchar data[RBLOCK];
111                 Superblock sb;
112                 Dentry de[DEPERBLK];
113                 uvlong offs[OFFPERBLK];
114                 ulong refs[REFPERBLK];
115         };
116
117         /* do not use anything below (for the bufproc only) */
118         uchar busy;
119         char *error;
120         Buf *dnext, *dprev;
121         Buf *fnext, *fprev;
122         BufReq;
123         BufReq *last;
124         ulong callerpc; /* debugging */
125         
126         Buf *wnext, *wprev;
127 };
128
129 struct ThrData {
130         Channel *resp;
131 };
132
133 struct Dev {
134         char *name;
135         int size;
136         Buf buf[BUFHASH+1]; /* doubly-linked list */
137         Dev *next;
138         int fd;
139         Rendez workr;
140         QLock workl;
141         Buf work;
142 };
143
144 extern Dev *devs;
145
146 struct FLoc {
147         uvlong blk;
148         int deind;
149         Qid;
150 };
151
152 enum {
153         LGONE = 1,
154         LDUMPED = 2,
155 };
156
157 struct Loc {
158         FLoc;
159         int ref, flags;
160         Loc *next, *child;
161         Loc *cnext, *cprev;
162         Loc *gnext, *gprev;
163         
164         QLock ex;
165         Chan *exlock;
166         ulong lwrite;
167 };
168
169 enum {
170         FSNOAUTH = 1,
171         FSNOPERM = 2,
172         FSCHOWN = 4,
173 };
174
175 struct Fs {
176         RWLock;
177         Dev *d;
178         int flags;
179         uvlong root, fstart;
180         
181         Channel *freelist;
182         Loc *rootloc, *dumprootloc;
183         QLock loctree;
184
185         User *udata;
186         int nudata;
187         RWLock udatal;
188 };
189
190 enum {
191         CHREAD = 1,
192         CHWRITE = 2,
193         CHRCLOSE = 4,
194
195         CHFDUMP = 1,
196         CHFNOLOCK = 2,
197         CHFRO = 4,
198         CHFNOPERM = 8,
199         
200         CHWBUSY = 1,
201         CHWCLUNK = 2,
202 };
203
204
205 struct Chan {
206         Fs *fs;
207         Loc *loc;
208         uchar open;
209         uchar flags;
210         ushort uid;
211
212         /* dir walk */
213         uvlong dwloff;
214         uvlong dwblk;
215         int dwind;
216         
217         /* workers */
218         void *freq, *lreq;
219         Chan *qnext, *qprev;
220         int wflags;
221 };
222
223 extern QLock chanqu;
224 extern Rendez chanre;
225 extern Chan readych;
226
227 extern char Eio[];
228 extern char Enotadir[];
229 extern char Enoent[];
230 extern char Einval[];
231 extern char Eperm[];
232 extern char Eexists[];
233 extern char Elocked[];
234
235 enum { /* getblk modes */
236         GBREAD = 0,
237         GBWRITE = 1,
238         GBCREATE = 2,
239         GBOVERWR = 3,
240 };
241
242 #define HOWMANY(a) (((a)+(RBLOCK-1))/RBLOCK)