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