code: mafs

ref: c6de8987b03f34189e5c63489c699b6b134c5806
dir: /all.h/

View raw version
#include <u.h>
#include <libc.h>

#include <fcall.h>
#include <auth.h>
#include <authsrv.h>
#include <thread.h>
#include <9p.h>

#include "dat.h"
#include "extents.h"

typedef	struct	Buffer	Buffer;
typedef	struct	Hiob	Hiob;
typedef	struct	Iobuf	Iobuf;
typedef	struct	Work	Work;

struct Work
{
	void (*f)(Req *r);
	Req *r;
};

struct Buffer
{
	QLock lck;
	Work works[Nworks];
	u16 hd, tl, nworks;
	Rendez isfull, isempty;
};

struct Hiob		/* Hash bucket */
{
	Iobuf*	link;	/* least recently used of the circular list */
	QLock;
};

/*
	using Ref to avoid locking up the hash bucket when a process
	is waiting for a lock on an Iobuf in that hash bucket.
	for locking a buffer:
		qlock(hash bucket); incref(buffer); qunlock(hash bucket); wlock(buffer)
	for stealing an unused buffer:
		qlock(hash bucket);
		find a buffer with ref == 0 and wlock'able.
		incref(buffer);
		qunlock(hash bucket);
		wlock(buffer);
	for unlocking a buffer:
		decref(buffer);
		wunlock(buffer);
 */
struct Iobuf
{
	Ref;
	RWLock;
	u64	blkno;		/* block number on the disk, primary key */
	u16 len;		/* number of blocks of data xiobuf points to */
	Iobuf	*fore;	/* for lru */
	Iobuf	*back;	/* for lru */
	u8	*xiobuf;	/* "real" buffer pointer */
	Content *io;	/* buffer pointer that is only active while locked. */
	int	flags;
};

extern	u32	nbuckets;		/* n hash buckets for i/o */
extern	Extents frees;		/* free extents */

#include "fns.h"

/* Iobuf routines - contents of the blocks in memory */
int		checktag(Iobuf *p, u16 tag, u64 qpath);
Iobuf*	getbuf(u64 blkno, u16 len, int flags);
Iobuf*	getbufchk(u64 blkno, u16 len, int flags, int tag, u64 qpath);
void	iobufinit(void);
void	putbuf(Iobuf *p);
void	settag(Iobuf *p, int tag, u64 qpath);
void	showbuf(Iobuf *p);

/* routines to manipulate the contents */
Iobuf*	allocblocks(u16 len, int flags, int tag, u64 qpath);
void	freeblockbuf(Iobuf *buf);
void	freeblocks(u64 blkno, u16 len, u16 tag, u64 qpath);
void	fsok(int ok);
void	init(int doream);
u64		newqpath();
u64		nperiblock(u16 tag);
void	ream(u64 size);
void	rel2abs(Dentry *d, u64 reli, Spanid *s);
void	rmfile(u64 qpath, u64 dblkno);
void	rmdirectory(u64 qpath, u64 dblkno);
void	rootream(void);
Dentry	*searchdir(u64 dblkno, u64 qpath, u16 uid, char *searchname, u64 searchidx, Iobuf **dbuf, Iobuf **buf);
void	shutdown(void);
void	start9p(char *service, char **nets, int stdio);
void	superream(u64 size, u64 nblocks);
Tlock*	tlocked(Iobuf*, Dentry*);

/* dentry routines */
u64 	addrelative(Dentry *d, u64 dblkno, u64 reli, u64 blkno, u16 len);
Iobuf*	getdataspanat(Dentry *d, u64 reli, int flags);
void	loadfrees(u64 dblkno);
s32		readfile(u64 dblkno, u64 qpath, char *rbuf, s32 rbufsize, u64 offset);
s32		readfilesize(u64 dblkno, u64 qpath);
void	savefrees(u64 dblkno);
void	truncatefile(u64 qpath, u64 dblkno, s16 uid);
s32		writefile(u64 dblkno, u64 qpath, s16 uid, char *wbuf, s32 wbufsize, u64 offset);

/* user access routines */
int	byname(void*, void*);
int	byuid(void*, void*);
int canaccess(s16 uid, Dentry *d, u32 mode);
int	checkname(char*);
int	checkname9p2(char*);
void	chkqunlock(QLock *q);
void	chkrunlock(RWLock *q);
void	chkwunlock(RWLock *q);
void 	cmd_user(void);
char*	cname(char*);
void	consproc(void);
void	cprint(char*, ...);
void	ctlread(Req *req);
void	ctlwrite(Req *req);
void	datestr(char*, long);
Qid	dentryqid(Dentry*);
void	dofilter(Filter*);
int		dprint(char *fmt, ...);
void	exit(void);
/*Float	famd(Float, int, int, int);*/
int	fchar(void);
/*ulong	fdf(Float, int);*/
void	sublockinit(void);
int	fname(char*);
void	formatinit(void);
void	freeaux(Aux *a);
void   freesearchstate(Iobuf **dbuf, Iobuf **buf);
Dentry*	getdir(Iobuf*, int);
long	getraddr(Device);
Wpath*	getwp(Wpath*);
void	hexdump(void*, int);
int	iaccess(short uid, Dentry *d, int m);
int	ingroup(s16 uid, s16 gid, int locked);
void	initconfig(u64 bno);
int	leadgroup(s16 uid, s16 gid);
s16	lookupid(char *name, int locked);
u64	min(u64 a, u64 b);
int	mkqidcmp(Qid*, Dentry*);
void	mkqid9p1(Qid9p1*, Qid*);
void	mkqid9p2(Qid*, Qid9p1*, int);
int	netserve(char*);
Aux	*newaux(u64 addr, u16 uid);
u64	newqpath(void);
void	newstart(void);
u64	nperindunit(u16 tag);
int	oconvD2M(Dentry*, void*);
int	oconvM2D(void*, Dentry*);
int	ofcallfmt(Fmt*);
u64	power( u64 base, int n);
int	prime(long);
void	putsuper(int locked);
void	strrand(void*, int);
int	strtouid(char*);
int	strtouid1(char*);
void	sync(void);
int	syncblock(void);
int	Tfmt(Fmt*);
char	*username(s16 uid, int locked, char *username);
void	usersinit(void);
void	writeconfig(u64 bno);

#pragma varargck	argpos	cprint	1
#pragma varargck	argpos	panic	1

#pragma varargck	type 	"A"	Filta
#pragma varargck	type	"G"	int
#pragma varargck	type	"T"	long
#pragma varargck	type	"F"	Fcall*

long	belong(char *);
int 	cmd_exec(char*);
void	consserve(void);
void	confinit(void);
int	fsinit(int, int);
int	nextelem(void);
long	number(int, int);
int	skipbl(int);