/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ /* * fundamental constants */#define NAMELEN 28 /* size of names */#define NDBLOCK 6 /* number of direct blocks in Dentry */#define MAXDAT 8192 /* max allowable data message */#define NTLOCK 200 /* number of active file Tlocks */ typedef struct Fbuf Fbuf;typedef struct Super1 Super1;typedef struct Superb Superb;// typedef struct Qid Qid;typedef struct Dentry Dentry;typedef struct Tag Tag; typedef struct Device Device;typedef struct Qid9p1 Qid9p1;typedef struct File File;typedef struct Filsys Filsys;typedef struct Filta Filta;typedef struct Filter Filter;typedef ulong Float;typedef struct Hiob Hiob;typedef struct Iobuf Iobuf;typedef struct P9call P9call;typedef struct Tlock Tlock;// typedef struct Tm Tm;typedef struct Uid Uid;typedef struct Wpath Wpath;typedef struct AuthRpc AuthRpc; /* * DONT TOUCH -- data structures stored on disk *//* DONT TOUCH, this is the disk structure */struct Qid9p1{ long path; long version;}; /* DONT TOUCH, this is the disk structure */struct Dentry{ char name[NAMELEN]; short uid; short gid; ushort mode; #define DALLOC 0x8000 #define DDIR 0x4000 #define DAPND 0x2000 #define DLOCK 0x1000 #define DREAD 0x4 #define DWRITE 0x2 #define DEXEC 0x1 Qid9p1 qid; long size; long dblock[NDBLOCK]; long iblock; long diblock; long atime; long mtime;}; /* DONT TOUCH, this is the disk structure */struct Tag{ short pad; short tag; long path;}; /* DONT TOUCH, this is the disk structure */struct Super1{ long fstart; long fsize; long tfree; long qidgen; /* generator for unique ids */ long fsok; /* file system ok */ /* * garbage for WWC device */ long roraddr; /* dump root addr */ long last; /* last super block addr */ long next; /* next super block addr */}; /* DONT TOUCH, this is the disk structure */struct Fbuf{ long nfree; long free[1]; /* changes based on BUFSIZE */}; /* DONT TOUCH, this is the disk structure */struct Superb{ Super1; Fbuf fbuf;}; struct Device{ char type; char ctrl; char unit; char part;}; /* * for load stats */struct Filter{ ulong count; /* count and old count kept separate */ ulong oldcount; /* so interrput can read them */ Float filter[3]; /* filters for 1m 10m 100m */ }; struct Filta{ Filter* f; int scale;}; /* * array of qids that are locked */struct Tlock{ Device dev; long time; long qpath; File* file;}; struct File{ QLock; Qid qid; Wpath* wpath; Chan* cp; /* null means a free slot */ Tlock* tlock; /* if file is locked */ File* next; /* in cp->flist */ File* list; /* in list of free files */ Filsys* fs; long addr; long slot; long lastra; /* read ahead address */ short fid; short uid; char open; #define FREAD 1 #define FWRITE 2 #define FREMOV 4 #define FWSTAT 8 long doffset; /* directory reading */ ulong dvers; long dslot; /* for network authentication */ AuthRpc *rpc; short cuid;}; struct Filsys{ char* name; /* name of filesys */ Device dev; /* device that filesys is on */ int flags; #define FREAM (1<<1) /* mkfs */ #define FRECOVER (1<<2) /* install last dump */}; struct Hiob{ Iobuf* link; Lock;}; struct Iobuf{ QLock; Device dev; Iobuf *next; /* for hash */ Iobuf *fore; /* for lru */ Iobuf *back; /* for lru */ char *iobuf; /* only active while locked */ char *xiobuf; /* "real" buffer pointer */ long addr; int flags;}; struct P9call{ uchar calln; uchar rxflag; short msize; void (*func)(Chan*, int);}; // struct Tm// {// /* see ctime(3) */// int sec;// int min;// int hour;// int mday;// int mon;// int year;// int wday;// int yday;// int isdst;// }; struct Uid{ short uid; /* user id */ short lead; /* leader of group */ short offset; /* byte offset in uidspace */}; struct Wpath{ Wpath *up; /* pointer upwards in path */ Wpath *list; /* link in free chain */ long addr; /* directory entry addr of parent */ long slot; /* directory entry slot of parent */ short refs; /* number of files using this structure */}; #define MAXFDATA 8192 /* * error codes generated from the file server */enum{ Ebadspc = 1, Efid, Efidinuse, Echar, Eopen, Ecount, Ealloc, Eqid, Eauth, Eauthmsg, Eaccess, Eentry, Emode, Edir1, Edir2, Ephase, Eexist, Edot, Eempty, Ebadu, Enotu, Enotg, Ename, Ewalk, Eronly, Efull, Eoffset, Elocked, Ebroken, Etoolong, Ersc, Eqidmode, Econvert, Enotm, Enotd, Enotl, Enotw, Esystem, MAXERR}; /* * devnone block numbers */enum{ Cwio1 = 1, Cwio2, Cwxx1, Cwxx2, Cwxx3, Cwxx4, Cwdump1, Cwdump2, Cuidbuf,}; /* * tags on block */enum{ Tnone = 0, Tsuper, /* the super block */ Tdir, /* directory contents */ Tind1, /* points to blocks */ Tind2, /* points to Tind1 */ Tfile, /* file contents */ Tfree, /* in free list */ Tbuck, /* cache fs bucket */ Tvirgo, /* fake worm virgin bits */ Tcache, /* cw cache things */ MAXTAG}; /* * flags to getbuf */enum{ Bread = (1<<0), /* read the block if miss */ Bprobe = (1<<1), /* return null if miss */ Bmod = (1<<2), /* set modified bit in buffer */ Bimm = (1<<3), /* set immediate bit in buffer */ Bres = (1<<4), /* reserved, never renammed */}; /* * open modes passed into P9 open/create */enum{ MREAD = 0, MWRITE, MBOTH, MEXEC, MTRUNC = (1<<4), /* truncate on open */ MCEXEC = (1<<5), /* close on exec (host) */ MRCLOSE = (1<<6), /* remove on close */}; /* * check flags */enum{ Crdall = (1<<0), /* read all files */ Ctag = (1<<1), /* rebuild tags */ Cpfile = (1<<2), /* print files */ Cpdir = (1<<3), /* print directories */ Cfree = (1<<4), /* rebuild free list */ Cream = (1<<6), /* clear all bad tags */ Cbad = (1<<7), /* clear all bad blocks */ Ctouch = (1<<8), /* touch old dir and indir */ Cquiet = (1<<9), /* report just nasty things */}; /* * buffer size variables */extern int RBUFSIZE;extern int BUFSIZE;extern int DIRPERBUF;extern int INDPERBUF;extern int INDPERBUF2;extern int FEPERBUF;
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
/*
* fundamental constants
*/
#define NAMELEN 28 /* size of names */
#define NDBLOCK 6 /* number of direct blocks in Dentry */
#define MAXDAT 8192 /* max allowable data message */
#define NTLOCK 200 /* number of active file Tlocks */
typedef struct Fbuf Fbuf;
typedef struct Super1 Super1;
typedef struct Superb Superb;
// typedef struct Qid Qid;
typedef struct Dentry Dentry;
typedef struct Tag Tag;
typedef struct Device Device;
typedef struct Qid9p1 Qid9p1;
typedef struct File File;
typedef struct Filsys Filsys;
typedef struct Filta Filta;
typedef struct Filter Filter;
typedef ulong Float;
typedef struct Hiob Hiob;
typedef struct Iobuf Iobuf;
typedef struct P9call P9call;
typedef struct Tlock Tlock;
// typedef struct Tm Tm;
typedef struct Uid Uid;
typedef struct Wpath Wpath;
typedef struct AuthRpc AuthRpc;
/*
* DONT TOUCH -- data structures stored on disk
*/
/* DONT TOUCH, this is the disk structure */
struct Qid9p1
{
long path;
long version;
};
/* DONT TOUCH, this is the disk structure */
struct Dentry
{
char name[NAMELEN];
short uid;
short gid;
ushort mode;
#define DALLOC 0x8000
#define DDIR 0x4000
#define DAPND 0x2000
#define DLOCK 0x1000
#define DREAD 0x4
#define DWRITE 0x2
#define DEXEC 0x1
Qid9p1 qid;
long size;
long dblock[NDBLOCK];
long iblock;
long diblock;
long atime;
long mtime;
};
/* DONT TOUCH, this is the disk structure */
struct Tag
{
short pad;
short tag;
long path;
};
/* DONT TOUCH, this is the disk structure */
struct Super1
{
long fstart;
long fsize;
long tfree;
long qidgen; /* generator for unique ids */
long fsok; /* file system ok */
/*
* garbage for WWC device
*/
long roraddr; /* dump root addr */
long last; /* last super block addr */
long next; /* next super block addr */
};
/* DONT TOUCH, this is the disk structure */
struct Fbuf
{
long nfree;
long free[1]; /* changes based on BUFSIZE */
};
/* DONT TOUCH, this is the disk structure */
struct Superb
{
Super1;
Fbuf fbuf;
};
struct Device
{
char type;
char ctrl;
char unit;
char part;
};
/*
* for load stats
*/
struct Filter
{
ulong count; /* count and old count kept separate */
ulong oldcount; /* so interrput can read them */
Float filter[3]; /* filters for 1m 10m 100m */
};
struct Filta
{
Filter* f;
int scale;
};
/*
* array of qids that are locked
*/
struct Tlock
{
Device dev;
long time;
long qpath;
File* file;
};
struct File
{
QLock;
Qid qid;
Wpath* wpath;
Chan* cp; /* null means a free slot */
Tlock* tlock; /* if file is locked */
File* next; /* in cp->flist */
File* list; /* in list of free files */
Filsys* fs;
long addr;
long slot;
long lastra; /* read ahead address */
short fid;
short uid;
char open;
#define FREAD 1
#define FWRITE 2
#define FREMOV 4
#define FWSTAT 8
long doffset; /* directory reading */
ulong dvers;
long dslot;
/* for network authentication */
AuthRpc *rpc;
short cuid;
};
struct Filsys
{
char* name; /* name of filesys */
Device dev; /* device that filesys is on */
int flags;
#define FREAM (1<<1) /* mkfs */
#define FRECOVER (1<<2) /* install last dump */
};
struct Hiob
{
Iobuf* link;
Lock;
};
struct Iobuf
{
QLock;
Device dev;
Iobuf *next; /* for hash */
Iobuf *fore; /* for lru */
Iobuf *back; /* for lru */
char *iobuf; /* only active while locked */
char *xiobuf; /* "real" buffer pointer */
long addr;
int flags;
};
struct P9call
{
uchar calln;
uchar rxflag;
short msize;
void (*func)(Chan*, int);
};
// struct Tm
// {
// /* see ctime(3) */
// int sec;
// int min;
// int hour;
// int mday;
// int mon;
// int year;
// int wday;
// int yday;
// int isdst;
// };
struct Uid
{
short uid; /* user id */
short lead; /* leader of group */
short offset; /* byte offset in uidspace */
};
struct Wpath
{
Wpath *up; /* pointer upwards in path */
Wpath *list; /* link in free chain */
long addr; /* directory entry addr of parent */
long slot; /* directory entry slot of parent */
short refs; /* number of files using this structure */
};
#define MAXFDATA 8192
/*
* error codes generated from the file server
*/
enum
{
Ebadspc = 1,
Efid,
Efidinuse,
Echar,
Eopen,
Ecount,
Ealloc,
Eqid,
Eauth,
Eauthmsg,
Eaccess,
Eentry,
Emode,
Edir1,
Edir2,
Ephase,
Eexist,
Edot,
Eempty,
Ebadu,
Enotu,
Enotg,
Ename,
Ewalk,
Eronly,
Efull,
Eoffset,
Elocked,
Ebroken,
Etoolong,
Ersc,
Eqidmode,
Econvert,
Enotm,
Enotd,
Enotl,
Enotw,
Esystem,
MAXERR
};
/*
* devnone block numbers
*/
enum
{
Cwio1 = 1,
Cwio2,
Cwxx1,
Cwxx2,
Cwxx3,
Cwxx4,
Cwdump1,
Cwdump2,
Cuidbuf,
};
/*
* tags on block
*/
enum
{
Tnone = 0,
Tsuper, /* the super block */
Tdir, /* directory contents */
Tind1, /* points to blocks */
Tind2, /* points to Tind1 */
Tfile, /* file contents */
Tfree, /* in free list */
Tbuck, /* cache fs bucket */
Tvirgo, /* fake worm virgin bits */
Tcache, /* cw cache things */
MAXTAG
};
/*
* flags to getbuf
*/
enum
{
Bread = (1<<0), /* read the block if miss */
Bprobe = (1<<1), /* return null if miss */
Bmod = (1<<2), /* set modified bit in buffer */
Bimm = (1<<3), /* set immediate bit in buffer */
Bres = (1<<4), /* reserved, never renammed */
};
/*
* open modes passed into P9 open/create
*/
enum
{
MREAD = 0,
MWRITE,
MBOTH,
MEXEC,
MTRUNC = (1<<4), /* truncate on open */
MCEXEC = (1<<5), /* close on exec (host) */
MRCLOSE = (1<<6), /* remove on close */
};
/*
* check flags
*/
enum
{
Crdall = (1<<0), /* read all files */
Ctag = (1<<1), /* rebuild tags */
Cpfile = (1<<2), /* print files */
Cpdir = (1<<3), /* print directories */
Cfree = (1<<4), /* rebuild free list */
Cream = (1<<6), /* clear all bad tags */
Cbad = (1<<7), /* clear all bad blocks */
Ctouch = (1<<8), /* touch old dir and indir */
Cquiet = (1<<9), /* report just nasty things */
};
/*
* buffer size variables
*/
extern int RBUFSIZE;
extern int BUFSIZE;
extern int DIRPERBUF;
extern int INDPERBUF;
extern int INDPERBUF2;
extern int FEPERBUF;