Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 *      Journal Based Flash Entrysystem.
 */

enum
{
// sector header
        MAGSIZE         = 4,
        MAXHDR          = MAGSIZE+3+3,

        MAGIC0          = 'R',
        MAGIC1          = 'O',
        MAGIC2          = 'O',
        FFSVERS         = '0',

// transactions
        FT_create       = 'G',
        FT_FCREATE0     = 'C',
        FT_FCREATE1     = 'E',
        FT_DCREATE0     = 'D',
        FT_DCREATE1     = 'F',
        FT_chmod        = 'H',
        FT_CHMOD0       = 'M',
        FT_CHMOD1       = 'O',
        FT_REMOVE       = 'R',
        FT_WRITE        = 'W',
        FT_AWRITE       = 'A',
        FT_trunc        = 'I',
        FT_TRUNC0       = 'T',
        FT_TRUNC1       = 'V',
        FT_SUMMARY      = 'S',
        FT_SUMBEG       = 'B',
        FT_SUMEND       = 'Z',

        MAXFSIZE        = 1 << 21,
        MAXNSIZE        = 28,

        Ncreate         = 1+1+3*3+MAXNSIZE+1,
        Nchmod          = 1+1+2*3,
        Nremove         = 1+3,
        Nwrite          = 1+4*3,
        Ntrunc          = 1+1+4*3+MAXNSIZE+1,
        Nsumbeg         = 1+3,
        Nmax            = Ncreate,

        Nsum            = 2*(1+3),
        Nfree           = 3,

        HBITS           = 5,
        HSIZE           = 1 << HBITS,
        HMASK           = HSIZE - 1,
        NOTIME          = 0xFFFFFFFF,

        WRSIZE          = 4*1024,
};

typedef struct  Extent  Extent;
typedef struct  Exts    Exts;
typedef struct  Entry   Entry;
typedef struct  Dirr    Dirr;
typedef struct  Jrec    Jrec;
typedef struct  Renum   Renum;

struct Extent
{
        int     sect;
        ulong   addr;
        ulong   off;
        ulong   size;
        Extent* next;
        Extent* prev;
};

struct Exts
{
        Extent* head;
        Extent* tail;
};

struct Entry
{
        int     ref;
        char*   name;
        ulong   fnum;
        ulong   mode;
        ulong   mnum;
        ulong   mtime;
        ulong   size;

        union
        {
                struct
                {
                        Entry** htab;
                        Entry*  files;
                        Dirr*   readers;
                };
                struct
                {
                        Exts    gen[2];
                };
        };

        Entry*  parent;
        Entry*  hnext;
        Entry*  hprev;
        Entry*  fnext;
        Entry*  fprev;
};

struct Dirr
{
        Entry*  dir;
        Entry*  cur;
        Dirr*   next;
        Dirr*   prev;
        ulong   offset;
};

struct Jrec
{
        int     type;
        ulong   mode;
        ulong   fnum;
        ulong   mnum;
        ulong   tnum;
        ulong   mtime;
        ulong   parent;
        ulong   size;
        ulong   offset;
        ulong   seq;
        char    name[MAXNSIZE+2];
};

struct Renum
{
        int     old;
        int     new;
};

extern  void    initdata(char*, int);
extern  void    clearsect(int);
extern  void    readdata(int, void*, ulong, ulong);
extern  int     writedata(int, int, void*, ulong, ulong);
extern  int     getc3(uchar*, ulong*);
extern  int     putc3(uchar*, ulong);
extern  ulong   get4(uchar*);
extern  void    put4(uchar*, ulong);
extern  int     convM2J(Jrec*, uchar*);
extern  int     convJ2M(Jrec*, uchar*);
extern  void    loadfs(int);
extern  char*   need(int bytes);
extern  void    put(Jrec*, int);
extern  void    putw(Jrec*, int, Extent *x, void*);
extern  int     Jconv(Fmt*);
extern  ulong   now(void);
extern  void    serve(char*);

#pragma varargck        type    "J"     Jrec*

extern  void    einit(void);
extern  void    edump(void);
extern  Entry*  elookup(ulong);
extern  Extent* esum(Entry*, int, ulong, int*);
extern  void    edestroy(Entry*);
extern  Entry*  ecreate(Entry*, char*, ulong, ulong, ulong, char**);
extern  char*   eremove(Entry*);
extern  Entry*  ewalk(Entry*, char*, char**);
extern  void    etrunc(Entry*, ulong, ulong);
extern  ulong   echmod(Entry*, ulong, ulong);
extern  ulong   eread(Entry*, int, void*, ulong, ulong);
extern  void    ewrite(Entry*, Extent *, int, ulong);
extern  Qid     eqid(Entry*);
extern  void    estat(Entry*, Dir*, int);
extern  Dirr*   ediropen(Entry*);
extern  int     edirread(Dirr*, char*, long);
extern  void    edirclose(Dirr*);
extern  void    erenum(Renum*);

extern  char    Edirnotempty[];
extern  char    Eexists[];
extern  char    Eisdir[];
extern  char    Enonexist[];
extern  char    Enotdir[];
extern  char    Eperm[];
extern  char    Erofs[];

extern  ulong   sectsize;
extern  ulong   nsects;
extern  uchar*  sectbuff;
extern  Entry   *root;
extern  int     readonly;
extern  ulong   delta;
extern  int     eparity;
extern  uchar   magic[];
extern  ulong   used;
extern  ulong   limit;
extern  ulong   maxwrite;