96 lines · 2.4 KB · C
RawDownload
#pragma lib "libblockalloc.a" #define BPTRSIZE 9  // this is bytes#define SYNCSLEEP 300 // in seconds enum {	DISKCACHE = 1,	DISKAUTOSYNC = 2,	DISKCONSTSYNC = 4,	DISKDEBUG = 8,	DISKMAN = 3,}; typedef struct Blockptr Blockptr;typedef struct BlockptrODF BlockptrODF;typedef struct Metablock Metablock;typedef struct Disk Disk;typedef struct Fn Fn; struct Fn {	char *name;	Lock l;	uint active;}; struct Blockptr {	uchar used; // is the block in use?	uchar notcurrent; // is the block current?	u64int offset; // where is it from the start of the bitmap?	u64int next; // if the block is not current, this points to the next possible current block	void *buffer; // buffer for sync if blocks are cached}; struct BlockptrODF {  // on-disk format of a block pointer. contains currently unused fields.	uchar used;	uchar notcurrent;	u64int offset;	u64int next;}; struct Metablock { // information about the managed disk	u64int blocksize; // how big is a block in the bitmap	u64int ptrmapstart; // where are the pointers?	u64int totalblocks; // how many blocks are there?	u64int bitmapstart; // where are the blocks?};	struct Disk {	int fd; // rw channel	u64int size; // size of the disk	Metablock *meta; // the metadata block	uint blocks_cached; // are the blocks cached?	int syncpid;	int debug;	QLock syncing;	QLock synclock;	QLock writelock;	Blockptr *ptrs; // blockpointers if they're cached}; /* pointers.c */u64int preadn(int,void*,u64int,u64int); // pread + readnu64int pwriten(int, void*,u64int,u64int); // wrapper around pwrite to make it match preadnint loadbptrs(Disk*);int syncbptrs(Disk*);u64int readbptr(Disk*, Blockptr*, u64int);u64int writebptr(Disk*, Blockptr*);u64int allocblock(Disk*,Blockptr*);int freeblock(Disk*,Blockptr*);u64int readblock(Disk*,Blockptr*,void*);u64int writeblock(Disk*,Blockptr*,void*); /* disks.c */int opendisk(char*,Disk*,uchar);int closedisk(Disk*);int fd2disk(int,Disk*,uchar);int disksyncer(Disk*); /* instru.c */void initinstru(void);Fn* infn(char*);void action(Fn*,char*);void shit(Fn*,char*);void upanic(Fn*,char*);void outfn(Fn*);void iqlock(Fn*,QLock*);void iqunlock(Fn*,QLock*); /* io.c */// device, buffer, length, offsetu64int dread(Disk*,void*,u64int,u64int);u64int dwrite(Disk*,void*,u64int,u64int); /* ream.c */int ream(int,u64int,int);int ream1(int,u64int,u64int,u64int,u64int,int);