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