xref: /inferno-os/include/logfs.h (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1 #pragma src "/usr/inferno/liblogfs"
2 
3 typedef struct LogfsLowLevel LogfsLowLevel;
4 typedef struct LogfsBoot LogfsBoot;
5 typedef struct Logfs Logfs;
6 typedef struct LogfsServer LogfsServer;
7 typedef struct LogfsIdentityStore LogfsIdentityStore;
8 
9 #pragma incomplete Logfs
10 #pragma incomplete LogfsServer
11 #pragma incomplete LogfsIdentityStore
12 #pragma incomplete LogfsBoot
13 
14 typedef u64int Pageset;
15 
16 #define	BITSPERSET	(sizeof(Pageset)*8)
17 #define	PAGETOP	((Pageset)1<<(BITSPERSET-1))
18 
19 enum {
20 	LogfsTnone = 0xff,
21 	LogfsTboot = 0x01,
22 	LogfsTlog = 0x06,
23 	LogfsTdata = 0x18,
24 	LogfsTbad = -1,
25 	LogfsTworse = -2,
26 	LogfsMagic = 'V',
27 };
28 
29 enum {
30 	LogfsLogTstart = 's',
31 	LogfsLogTcreate = 'c',
32 	LogfsLogTtrunc = 't',
33 	LogfsLogTremove = 'r',
34 	LogfsLogTwrite = 'w',
35 	LogfsLogTwstat = 'W',
36 	LogfsLogTend = 'e',
37 };
38 
39 enum {
40 	LogfsOpenFlagNoPerm = 1,
41 	LogfsOpenFlagWstatAllow = 2,
42 };
43 
44 typedef enum LogfsLowLevelReadResult {
45 	LogfsLowLevelReadResultOk,
46 	LogfsLowLevelReadResultSoftError,
47 	LogfsLowLevelReadResultHardError,
48 	LogfsLowLevelReadResultBad,
49 	LogfsLowLevelReadResultAllOnes,
50 } LogfsLowLevelReadResult;
51 
52 typedef short LOGFSGETBLOCKTAGFN(LogfsLowLevel*, long);
53 typedef void LOGFSSETBLOCKTAGFN(LogfsLowLevel*, long, short);
54 typedef ulong LOGFSGETBLOCKPATHFN(LogfsLowLevel*, long);
55 typedef void LOGFSSETBLOCKPATHFN(LogfsLowLevel*, long, ulong);
56 typedef long LOGFSFINDFREEBLOCKFN(LogfsLowLevel*, long*);
57 typedef char *LOGFSREADBLOCKFN(LogfsLowLevel*, void*, long, LogfsLowLevelReadResult*);
58 typedef char *LOGFSWRITEBLOCKFN(LogfsLowLevel*, void*, uchar, ulong, int, long*, long);
59 typedef char *LOGFSERASEBLOCKFN(LogfsLowLevel*, long, void **, int*);
60 typedef char *LOGFSFORMATBLOCKFN(LogfsLowLevel*, long, uchar, long, long, long, int, long*, void*, int*);
61 typedef char *LOGFSREFORMATBLOCKFN(LogfsLowLevel*, long, uchar, long, int, long*, void*, int*);
62 typedef void LOGFSMARKBLOCKBADFN(LogfsLowLevel*, long);
63 typedef int LOGFSGETBLOCKSFN(LogfsLowLevel*);
64 typedef long LOGFSGETBASEBLOCKFN(LogfsLowLevel*);
65 typedef int LOGFSGETBLOCKSIZEFN(LogfsLowLevel*);
66 typedef int LOGFSGETBLOCKPARTIALFORMATSTATUSFN(LogfsLowLevel*, long);
67 typedef ulong LOGFSCALCRAWADDRESSFN(LogfsLowLevel*, long, int);
68 typedef char *LOGFSOPENFN(LogfsLowLevel*, long, long, int, int, long*);
69 typedef char *LOGFSGETBLOCKSTATUSFN(LogfsLowLevel*, long, int*, void **, LogfsLowLevelReadResult*);
70 typedef int LOGFSCALCFORMATFN(LogfsLowLevel*, long, long, long, long*, long*, long*);
71 typedef int LOGFSGETOPENSTATUSFN(LogfsLowLevel*);
72 typedef void LOGFSFREEFN(LogfsLowLevel*);
73 typedef char *LOGFSREADPAGERANGEFN(LogfsLowLevel*, uchar*, long, int, int, int, LogfsLowLevelReadResult*);
74 typedef char *LOGFSWRITEPAGEFN(LogfsLowLevel*, uchar*, long, int);
75 typedef char *LOGFSSYNCFN(LogfsLowLevel*);
76 
77 struct LogfsLowLevel {
78 	int l2pagesize;
79 	int l2pagesperblock;
80 	long blocks;
81 	int pathbits;
82 	LOGFSOPENFN *open;
83 	LOGFSGETBLOCKTAGFN *getblocktag;
84 	LOGFSSETBLOCKTAGFN *setblocktag;
85 	LOGFSGETBLOCKPATHFN *getblockpath;
86 	LOGFSSETBLOCKPATHFN *setblockpath;
87 	LOGFSREADPAGERANGEFN *readpagerange;
88 	LOGFSWRITEPAGEFN *writepage;
89 	LOGFSFINDFREEBLOCKFN *findfreeblock;
90 	LOGFSREADBLOCKFN *readblock;
91 	LOGFSWRITEBLOCKFN *writeblock;
92 	LOGFSERASEBLOCKFN *eraseblock;
93 	LOGFSFORMATBLOCKFN *formatblock;
94 	LOGFSREFORMATBLOCKFN *reformatblock;
95 	LOGFSMARKBLOCKBADFN *markblockbad;
96 	LOGFSGETBASEBLOCKFN *getbaseblock;
97 	LOGFSGETBLOCKSIZEFN *getblocksize;
98 	LOGFSGETBLOCKPARTIALFORMATSTATUSFN *getblockpartialformatstatus;
99 	LOGFSCALCRAWADDRESSFN *calcrawaddress;
100 	LOGFSGETBLOCKSTATUSFN *getblockstatus;
101 	LOGFSCALCFORMATFN *calcformat;
102 	LOGFSGETOPENSTATUSFN *getopenstatus;
103 	LOGFSFREEFN *free;
104 	LOGFSSYNCFN *sync;
105 };
106 
107 char *logfstagname(uchar);
108 
109 char *logfsisnew(LogfsIdentityStore **);
110 void logfsisfree(LogfsIdentityStore **);
111 char *logfsisgroupcreate(LogfsIdentityStore*, char*, char*);
112 char *logfsisgrouprename(LogfsIdentityStore*, char*, char*);
113 char *logfsisgroupsetleader(LogfsIdentityStore*, char*, char*);
114 char *logfsisgroupaddmember(LogfsIdentityStore*, char*, char*);
115 char *logfsisgroupremovemember(LogfsIdentityStore*, char*, char*);
116 char *logfsisusersread(LogfsIdentityStore*, void*, long, ulong, long*);
117 
118 char *logfsformat(LogfsLowLevel*, long, long, long, int);
119 char *logfsbootopen(LogfsLowLevel*, long, long, int, int, LogfsBoot**);
120 void logfsbootfree(LogfsBoot*);
121 char *logfsbootread(LogfsBoot*, void*, long, ulong);
122 char *logfsbootwrite(LogfsBoot*, void*, long, ulong);
123 char *logfsbootio(LogfsBoot*, void*, long, ulong, int);
124 char *logfsbootmap(LogfsBoot*, ulong, ulong*, int*, int*, int*, ulong*, ulong*);
125 long logfsbootgetiosize(LogfsBoot*);
126 long logfsbootgetsize(LogfsBoot*);
127 void logfsboottrace(LogfsBoot*, int);
128 
129 char *logfsserverattach(LogfsServer*, u32int, char*, Qid*);
130 char *logfsserverclunk(LogfsServer*, u32int);
131 char *logfsservercreate(LogfsServer*, u32int, char*, u32int, uchar, Qid*);
132 char *logfsserverflush(LogfsServer*);
133 char *logfsservernew(LogfsBoot*, LogfsLowLevel*, LogfsIdentityStore*, ulong, int, LogfsServer**);
134 char *logfsserveropen(LogfsServer*, u32int, uchar mode, Qid*);
135 char *logfsserverread(LogfsServer*, u32int, u32int, u32int, uchar*, u32int, u32int*);
136 char *logfsserverremove(LogfsServer*, u32int);
137 char *logfsserverstat(LogfsServer*, u32int, uchar*, u32int, ushort*);
138 char *logfsserverwalk(LogfsServer*, u32int, u32int, ushort, char **, ushort*, Qid*);
139 char *logfsserverwrite(LogfsServer*, u32int, u32int, u32int, uchar*, u32int*);
140 char *logfsserverwstat(LogfsServer*, u32int, uchar*, ushort nstat);
141 void logfsserverfree(LogfsServer **);
142 char *logfsserverlogsweep(LogfsServer*, int, int*);
143 char *logfsserverreadpathextent(LogfsServer*, u32int, int, u32int*, u32int*, long*, int*, int*);
144 
145 char *logfsservertestcmd(LogfsServer*, int, char **);
146 void logfsservertrace(LogfsServer*, int);
147 
148 /*
149  * implemented by the environment
150  */
151 ulong logfsnow(void);
152 void *logfsrealloc(void*, ulong);
153 void logfsfreemem(void*);
154 int	nrand(int);
155 
156 extern char Eio[];
157 extern char Ebadarg[];
158 extern char Eperm[];
159