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