#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);
#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);