xref: /inferno-os/liblogfs/fidmap.c (revision 28942ead413418b56c5be78e8c4c400881fba72e)
1 #include "logfsos.h"
2 #include "logfs.h"
3 #include "local.h"
4 
5 enum {
6 	FIDMOD = 127
7 };
8 
9 int
logfshashulong(void * v,int size)10 logfshashulong(void *v, int size)
11 {
12 	return (ulong)v % size;
13 }
14 
15 /*
16  * TO DO: assumes map.c always passes sought key value as b, and value in map as a
17  */
18 static int
compare(void * a,void * b)19 compare(void *a, void *b)
20 {
21 	Fid *f = a;
22 	ulong fid = (ulong)b;	/* sic */
23 //print("fidcompare(%ld, %ld)\n", f->fid, fid);
24 	return f->fid == fid;
25 }
26 
27 static int
allocsize(void * key)28 allocsize(void *key)
29 {
30 	USED(key);
31 	return sizeof(Fid);
32 }
33 
34 static void
fidfree(void * a)35 fidfree(void *a)
36 {
37 	Fid *f = a;
38 	logfsdrsfree(&f->drs);
39 }
40 
41 char *
logfsfidmapnew(FidMap ** fidmapp)42 logfsfidmapnew(FidMap **fidmapp)
43 {
44 	return logfsmapnew(FIDMOD, logfshashulong, compare, allocsize, fidfree, fidmapp);
45 }
46 
47 int
logfsfidmapclunk(FidMap * m,ulong fid)48 logfsfidmapclunk(FidMap *m, ulong fid)
49 {
50 	Fid *f = logfsfidmapfindentry(m, fid);
51 	if(f != nil){
52 		logfsentryclunk(f->entry);
53 		logfsmapdeleteentry(m, (void *)fid);
54 		return 1;
55 	}
56 	return 0;
57 }
58 
59 char *
logfsfidmapnewentry(FidMap * m,ulong fid,Fid ** fidmapp)60 logfsfidmapnewentry(FidMap *m, ulong fid, Fid **fidmapp)
61 {
62 	char *errmsg;
63 	errmsg = logfsmapnewentry(m, (void*)fid, fidmapp);
64 	if(errmsg)
65 		return errmsg;
66 	if(*fidmapp == nil)
67 		return nil;
68 	(*fidmapp)->fid = fid;
69 	(*fidmapp)->openmode = -1;
70 	return nil;
71 }
72