/*
*  format of cache on disk
*/
typedef struct Dptr     Dptr;
typedef struct Dahdr    Dahdr;
typedef struct Dalloc   Dalloc;
typedef struct Fphdr    Fphdr;
typedef struct Fptr     Fptr;
typedef struct Inode    Inode;
typedef struct Dihdr    Dihdr;
typedef struct Dinode   Dinode;

enum
{
       Amagic=         0xbebeefed,     /* allocation block magic */
       Imagic=         0xbadc00ce,     /* inode block magic */
       BtoUL=          8*sizeof(ulong),/* bits in a ulong */
       CACHENAMELEN=   128
};
#define Indbno          0x80000000      /* indirect block */
#define Notabno         0xFFFFFFFF      /* not a block number */

/*
*  Allocation blocks at the begining of the disk.  There are
*  enough of these blocks to supply 1 bit for each block on the
*  disk;
*/
struct Dahdr
{
       ulong   magic;
       ulong   bsize;          /* logical block size */
       char    name[CACHENAMELEN];
       short   nab;            /* number of allocation blocks */
};
struct Dalloc
{
       Dahdr;
       ulong   bits[1];
};

/*
*  A pointer to disk data
*/
struct Dptr
{
       ulong   fbno;           /* file block number */
       ulong   bno;            /* disk block number */
       ushort  start;          /* offset into block of valid data */
       ushort  end;            /* offset into block after valid data */
};

/*
*  A file descriptor.
*/
struct Inode
{
       Qid     qid;
       vlong   length;
       Dptr    ptr;            /* pointer page */
       char    inuse;
};

/*
*  inode blocks (after allocation blocks)
*/
struct Dihdr
{
       ulong   magic;
       ulong   nino;           /* number of inodes */
};
struct Dinode
{
       Dihdr;
       Inode   inode[1];
};