xref: /inferno-os/liblogfs/fidmap.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1*28942eadSforsyth #include "logfsos.h"
237da2899SCharles.Forsyth #include "logfs.h"
337da2899SCharles.Forsyth #include "local.h"
437da2899SCharles.Forsyth 
537da2899SCharles.Forsyth enum {
637da2899SCharles.Forsyth 	FIDMOD = 127
737da2899SCharles.Forsyth };
837da2899SCharles.Forsyth 
937da2899SCharles.Forsyth int
logfshashulong(void * v,int size)1037da2899SCharles.Forsyth logfshashulong(void *v, int size)
1137da2899SCharles.Forsyth {
1237da2899SCharles.Forsyth 	return (ulong)v % size;
1337da2899SCharles.Forsyth }
1437da2899SCharles.Forsyth 
15*28942eadSforsyth /*
16*28942eadSforsyth  * TO DO: assumes map.c always passes sought key value as b, and value in map as a
17*28942eadSforsyth  */
1837da2899SCharles.Forsyth static int
compare(void * a,void * b)19*28942eadSforsyth compare(void *a, void *b)
2037da2899SCharles.Forsyth {
21*28942eadSforsyth 	Fid *f = a;
22*28942eadSforsyth 	ulong fid = (ulong)b;	/* sic */
2337da2899SCharles.Forsyth //print("fidcompare(%ld, %ld)\n", f->fid, fid);
2437da2899SCharles.Forsyth 	return f->fid == fid;
2537da2899SCharles.Forsyth }
2637da2899SCharles.Forsyth 
2737da2899SCharles.Forsyth static int
allocsize(void * key)2837da2899SCharles.Forsyth allocsize(void *key)
2937da2899SCharles.Forsyth {
3037da2899SCharles.Forsyth 	USED(key);
3137da2899SCharles.Forsyth 	return sizeof(Fid);
3237da2899SCharles.Forsyth }
3337da2899SCharles.Forsyth 
34*28942eadSforsyth static void
fidfree(void * a)35*28942eadSforsyth fidfree(void *a)
3637da2899SCharles.Forsyth {
37*28942eadSforsyth 	Fid *f = a;
3837da2899SCharles.Forsyth 	logfsdrsfree(&f->drs);
3937da2899SCharles.Forsyth }
4037da2899SCharles.Forsyth 
4137da2899SCharles.Forsyth char *
logfsfidmapnew(FidMap ** fidmapp)4237da2899SCharles.Forsyth logfsfidmapnew(FidMap **fidmapp)
4337da2899SCharles.Forsyth {
44*28942eadSforsyth 	return logfsmapnew(FIDMOD, logfshashulong, compare, allocsize, fidfree, fidmapp);
4537da2899SCharles.Forsyth }
4637da2899SCharles.Forsyth 
4737da2899SCharles.Forsyth int
logfsfidmapclunk(FidMap * m,ulong fid)4837da2899SCharles.Forsyth logfsfidmapclunk(FidMap *m, ulong fid)
4937da2899SCharles.Forsyth {
5037da2899SCharles.Forsyth 	Fid *f = logfsfidmapfindentry(m, fid);
51*28942eadSforsyth 	if(f != nil){
5237da2899SCharles.Forsyth 		logfsentryclunk(f->entry);
5337da2899SCharles.Forsyth 		logfsmapdeleteentry(m, (void *)fid);
5437da2899SCharles.Forsyth 		return 1;
5537da2899SCharles.Forsyth 	}
5637da2899SCharles.Forsyth 	return 0;
5737da2899SCharles.Forsyth }
5837da2899SCharles.Forsyth 
5937da2899SCharles.Forsyth char *
logfsfidmapnewentry(FidMap * m,ulong fid,Fid ** fidmapp)6037da2899SCharles.Forsyth logfsfidmapnewentry(FidMap *m, ulong fid, Fid **fidmapp)
6137da2899SCharles.Forsyth {
6237da2899SCharles.Forsyth 	char *errmsg;
6337da2899SCharles.Forsyth 	errmsg = logfsmapnewentry(m, (void*)fid, fidmapp);
6437da2899SCharles.Forsyth 	if(errmsg)
6537da2899SCharles.Forsyth 		return errmsg;
6637da2899SCharles.Forsyth 	if(*fidmapp == nil)
6737da2899SCharles.Forsyth 		return nil;
6837da2899SCharles.Forsyth 	(*fidmapp)->fid = fid;
6937da2899SCharles.Forsyth 	(*fidmapp)->openmode = -1;
7037da2899SCharles.Forsyth 	return nil;
7137da2899SCharles.Forsyth }
72