summaryrefslogtreecommitdiff
path: root/include/logfs.h
blob: 7c95c27d65a2b68bed2fb88d9ebb1d6be3002d37 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#pragma src "/usr/inferno/liblogfs"

enum {
	LogfsTnone = 0xff,
	LogfsTboot = 0x01,
	LogfsTlog = 0x06,
	LogfsTdata = 0x18,
	LogfsTbad = -1,
	LogfsTworse = -2,
	LogfsMagic = 'V',
};

enum {
	LogfsLogTstart = 's',
	LogfsLogTcreate = 'c',
	LogfsLogTtrunc = 't',
	LogfsLogTremove = 'r',
	LogfsLogTwrite = 'w',
	LogfsLogTwstat = 'W',
	LogfsLogTend = 'e',
};

enum {
	LogfsOpenFlagNoPerm = 1,
	LogfsOpenFlagWstatAllow = 2,
};

typedef struct LogfsLowLevel LogfsLowLevel;

typedef enum LogfsLowLevelFettleAction {
	LogfsLowLevelFettleActionMarkBad,
	LogfsLowLevelFettleActionErase,
	LogfsLowLevelFettleActionFormat,
	LogfsLowLevelFettleActionEraseAndFormat,
} LogfsLowLevelFettleAction;

typedef enum LogfsLowLevelReadResult {
	LogfsLowLevelReadResultOk,
	LogfsLowLevelReadResultSoftError,
	LogfsLowLevelReadResultHardError,
	LogfsLowLevelReadResultBad,
	LogfsLowLevelReadResultAllOnes,
} LogfsLowLevelReadResult;

typedef short LOGFSGETBLOCKTAGFN(LogfsLowLevel *ll, long block);
typedef void LOGFSSETBLOCKTAGFN(LogfsLowLevel *ll, long block, short tag);
typedef ulong LOGFSGETBLOCKPATHFN(LogfsLowLevel *ll, long block);
typedef void LOGFSSETBLOCKPATHFN(LogfsLowLevel *ll, long block, ulong path);
typedef long LOGFSFINDFREEBLOCKFN(LogfsLowLevel *ll, long *freeblocks);
typedef char *LOGFSREADBLOCKFN(LogfsLowLevel *ll, void *buf, long block, LogfsLowLevelReadResult *blocke);
typedef char *LOGFSWRITEBLOCKFN(LogfsLowLevel *ll, void *buf, uchar tag, ulong path, int xcount, long *xdata, long block);
typedef char *LOGFSERASEBLOCKFN(LogfsLowLevel *ll, long block, void **llsave, int *markedbad);
typedef char *LOGFSFORMATBLOCKFN(LogfsLowLevel *ll, long block, uchar tag, long path, long baseblock, long sizeinblocks, int xcount, long *xdata, void *llsave, int *markedbad);
typedef char *LOGFSREFORMATBLOCKFN(LogfsLowLevel *ll, long block, uchar tag, long path, int xcount, long *xdata, void *llsave, int *markedbad);
typedef void LOGFSMARKBLOCKBADFN(LogfsLowLevel *ll, long block);
typedef int LOGFSGETBLOCKSFN(LogfsLowLevel *ll);
typedef long LOGFSGETBASEBLOCKFN(LogfsLowLevel *ll);
typedef int LOGFSGETBLOCKSIZEFN(LogfsLowLevel *ll);
typedef int LOGFSGETBLOCKPARTIALFORMATSTATUSFN(LogfsLowLevel *ll, long block);
typedef ulong LOGFSCALCRAWADDRESSFN(LogfsLowLevel *ll, long pblock, int dataoffset);
typedef char *LOGFSOPENFN(LogfsLowLevel *ll, long base, long limit, int trace, int xcount, long *xdata);
typedef char *LOGFSGETBLOCKSTATUSFN(LogfsLowLevel *ll, long block, int *magicfound, void **llsave, LogfsLowLevelReadResult *result);
typedef int LOGFSCALCFORMATFN(LogfsLowLevel *ll, long base, long limit, long bootsize, long *baseblock, long *limitblock, long *bootblocks);
typedef int LOGFSGETOPENSTATUSFN(LogfsLowLevel *ll);
typedef void LOGFSFREEFN(LogfsLowLevel *ll);
typedef char *LOGFSREADPAGERANGEFN(LogfsLowLevel *ll, uchar *data, long block, int page, int offset, int count, LogfsLowLevelReadResult *result);
typedef char *LOGFSWRITEPAGEFN(LogfsLowLevel *ll, uchar *data, long block, int page);
typedef char *LOGFSSYNCFN(LogfsLowLevel *ll);

struct LogfsLowLevel {
	int l2pagesize;
	int l2pagesperblock;
	long blocks;
	int pathbits;
	LOGFSOPENFN *open;
	LOGFSGETBLOCKTAGFN *getblocktag;
	LOGFSSETBLOCKTAGFN *setblocktag;
	LOGFSGETBLOCKPATHFN *getblockpath;
	LOGFSSETBLOCKPATHFN *setblockpath;
	LOGFSREADPAGERANGEFN *readpagerange;
	LOGFSWRITEPAGEFN *writepage;
	LOGFSFINDFREEBLOCKFN *findfreeblock;
	LOGFSREADBLOCKFN *readblock;
	LOGFSWRITEBLOCKFN *writeblock;
	LOGFSERASEBLOCKFN *eraseblock;
	LOGFSFORMATBLOCKFN *formatblock;
	LOGFSREFORMATBLOCKFN *reformatblock;
	LOGFSMARKBLOCKBADFN *markblockbad;
	LOGFSGETBASEBLOCKFN *getbaseblock;
	LOGFSGETBLOCKSIZEFN *getblocksize;
	LOGFSGETBLOCKPARTIALFORMATSTATUSFN *getblockpartialformatstatus;
	LOGFSCALCRAWADDRESSFN *calcrawaddress;
	LOGFSGETBLOCKSTATUSFN *getblockstatus;
	LOGFSCALCFORMATFN *calcformat;
	LOGFSGETOPENSTATUSFN *getopenstatus;
	LOGFSFREEFN *free;
	LOGFSSYNCFN *sync;
};

extern char Eio[];
extern char Ebadarg[];
extern char Eperm[];

char *logfstagname(uchar tag);

typedef struct LogfsIdentityStore LogfsIdentityStore;
char *logfsisnew(LogfsIdentityStore **isp);
void logfsisfree(LogfsIdentityStore **isp);
char *logfsisgroupcreate(LogfsIdentityStore *is, char *groupname, char *groupid);
char *logfsisgrouprename(LogfsIdentityStore *is, char *oldgroupname, char *newgroupname);
char *logfsisgroupsetleader(LogfsIdentityStore *is, char *groupname, char *leadername);
char *logfsisgroupaddmember(LogfsIdentityStore *is, char *groupname, char *membername);
char *logfsisgroupremovemember(LogfsIdentityStore *is, char *groupname, char *nonmembername);
char *logfsisusersread(LogfsIdentityStore *is, void *buf, long n, ulong offset, long *nr);

typedef struct LogfsBoot LogfsBoot;
typedef struct Logfs Logfs;
typedef struct LogfsServer LogfsServer;

char *logfsformat(LogfsLowLevel *ll, long base, long limit, long bootsize, int trace);
char *logfsbootopen(LogfsLowLevel *ll, long base, long limit, int trace, int printbad, LogfsBoot **lbp);
void logfsbootfree(LogfsBoot *lb);
char *logfsbootread(LogfsBoot *lb, void *buf, long n, ulong offset);
char *logfsbootwrite(LogfsBoot *lb, void *buf, long n, ulong offset);
char *logfsbootio(LogfsBoot *lb, void *buf, long n, ulong offset, int write);
char *logfsbootmap(LogfsBoot *lb, ulong laddress, ulong *lblockp, int *lboffsetp, int *lpagep, int *lpageoffsetp, ulong *pblockp, ulong *paddressp);
long logfsbootgetiosize(LogfsBoot *lb);
long logfsbootgetsize(LogfsBoot *lb);
void logfsboottrace(LogfsBoot *lb, int level);

char *logfsserverattach(LogfsServer *s, u32int fid, char *uname, Qid *qid);
char *logfsserverclunk(LogfsServer *s, u32int fid);
char *logfsservercreate(LogfsServer *server, u32int fid, char *name, u32int perm, uchar mode, Qid *qid);
char *logfsserverflush(LogfsServer *server);
char *logfsservernew(LogfsBoot *lb, LogfsLowLevel *ll, LogfsIdentityStore *is, ulong openflags, int trace, LogfsServer **sp);
char *logfsserveropen(LogfsServer *s, u32int fid, uchar mode, Qid *qid);
char *logfsserverread(LogfsServer *s, u32int fid, u32int offset, u32int count, uchar *buf, u32int buflen, u32int *rcount);
char *logfsserverremove(LogfsServer *server, u32int fid);
char *logfsserverstat(LogfsServer *s, u32int fid, uchar *buf, u32int bufsize, ushort *count);
char *logfsserverwalk(LogfsServer *s, u32int fid, u32int newfid, ushort nwname, char **wname, ushort *nwqid, Qid *wqid);
char *logfsserverwrite(LogfsServer *server, u32int fid, u32int offset, u32int count, uchar *buf, u32int *rcount);
char *logfsserverwstat(LogfsServer *server, u32int fid, uchar *stat, ushort nstat);
void logfsserverfree(LogfsServer **sp);
char *logfsserverlogsweep(LogfsServer *server, int justone, int *didsomething);
char *logfsserverreadpathextent(LogfsServer *server, u32int path, int nth, u32int *flashaddrp, u32int *lengthp,
	long *blockp, int *pagep, int *offsetp);

char *logfsservertestcmd(LogfsServer *s, int argc, char **argv);
void logfsservertrace(LogfsServer *s, int level);

/*
 * implemented by the environment
 */
ulong logfsnow(void);
void *logfsrealloc(void *p, ulong size);
void logfsfreemem(void *p);