]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/hjfs/dat.h
renamed statw to df
[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         OFFPERBLK = RBLOCK / 12,
83         REFPERBLK = RBLOCK / 3,
84 };
85
86 struct BufReq {
87         Dev *d;
88         uvlong off;
89         int nodata;
90         Channel *resp;
91         BufReq *next;
92 };
93
94 enum {
95         BWRITE = 1, /* used only for the worker */
96         BWRIM = 2, /* write immediately after putbuf */
97         BDELWRI = 4, /* write delayed */
98 };
99
100 struct Buf {
101         uchar op, type;
102         union {
103                 uchar data[RBLOCK];
104                 Superblock sb;
105                 Dentry de[DEPERBLK];
106                 uvlong offs[OFFPERBLK];
107                 ulong refs[REFPERBLK];
108         };
109
110         /* do not use anything below (for the bufproc only) */
111         uchar busy;
112         char *error;
113         Buf *dnext, *dprev;
114         Buf *fnext, *fprev;
115         BufReq;
116         BufReq *last;
117         ulong callerpc; /* debugging */
118         
119         Buf *wnext, *wprev;
120 };
121
122 struct ThrData {
123         Channel *resp;
124 };
125
126 struct Dev {
127         char *name;
128         int size;
129         Buf buf[BUFHASH+1]; /* doubly-linked list */
130         Dev *next;
131         int fd;
132         Rendez workr;
133         QLock workl;
134         Buf work;
135 };
136
137 extern Dev *devs;
138
139 struct FLoc {
140         uvlong blk;
141         int deind;
142         Qid;
143 };
144
145 enum {
146         LGONE = 1,
147         LDUMPED = 2,
148 };
149
150 struct Loc {
151         FLoc;
152         int ref, flags;
153         Loc *next, *child;
154         Loc *cnext, *cprev;
155         Loc *gnext, *gprev;
156         
157         QLock ex;
158         Chan *exlock;
159         ulong lwrite;
160 };
161
162 enum {
163         FSNOAUTH = 1,
164         FSNOPERM = 2,
165         FSCHOWN = 4,
166 };
167
168 struct Fs {
169         RWLock;
170         Dev *d;
171         int flags;
172         uvlong root, fstart;
173         
174         Channel *freelist;
175         Loc *rootloc, *dumprootloc;
176         QLock loctree;
177
178         User *udata;
179         int nudata;
180         RWLock udatal;
181 };
182
183 enum {
184         CHREAD = 1,
185         CHWRITE = 2,
186         CHRCLOSE = 4,
187         CHFDUMP = 1,
188         CHFNOLOCK = 2,
189         CHFRO = 4,
190         
191         CHWBUSY = 1,
192         CHWCLUNK = 2,
193 };
194
195
196 struct Chan {
197         Fs *fs;
198         Loc *loc;
199         uchar open;
200         uchar flags;
201         ushort uid;
202
203         /* dir walk */
204         uvlong dwloff;
205         uvlong dwblk;
206         int dwind;
207         
208         /* workers */
209         void *freq, *lreq;
210         Chan *qnext, *qprev;
211         int wflags;
212 };
213
214 extern QLock chanqu;
215 extern Rendez chanre;
216 extern Chan readych;
217
218 extern char Eio[];
219 extern char Enotadir[];
220 extern char Enoent[];
221 extern char Einval[];
222 extern char Eperm[];
223 extern char Eexists[];
224 extern char Elocked[];
225
226 enum { /* getblk modes */
227         GBREAD = 0,
228         GBWRITE = 1,
229         GBCREATE = 2,
230         GBOVERWR = 3,
231 };
232
233 #define HOWMANY(a, b) (((a)+((b)-1))/(b))
234 #define ROUNDUP(a, b) (HOWMANY(a,b)*(b))