shithub: unionfs

Download patch

ref: 44ce503a9ecea0e1793ee1c7917e65c0ae498f2c
parent: 449e753e691dd25706a8d46db41a84e27071320f
author: kvik <kvik@a-b.xyz>
date: Tue May 25 17:20:07 EDT 2021

Improve Qid mapping strategy and implementation

--- a/mkfile
+++ b/mkfile
@@ -8,6 +8,7 @@
 	unionfs.h
 OFILES=\
 	util.$O\
+	qmap.$O\
 	unionfs.$O
 
 </sys/src/cmd/mkone
--- a/unionfs.c
+++ b/unionfs.c
@@ -7,74 +7,9 @@
 
 Union u0 = {.next = &u0, .prev = &u0};
 Union *unionlist = &u0;
-QLock qidtablock;
-Qtab *qidtab[Nqtab];
 F *root;
 Srv thefs;
 
-int
-qthash(uvlong path)
-{
-	int h, n;
-	
-	h = 0;
-	for(n = 0; n < 64; n += Nqbit){
-		h ^= path;
-		path >>= Nqbit;
-	}
-	return h & (Nqtab-1);
-}
-
-uvlong
-uniqpath(uvlong path)
-{
-	static u16int salt;
-	int h, have;
-	Qtab *q;
-
-	for(;;){
-		have = 0;
-		h = qthash(path);
-		for(q = qidtab[h]; q != nil; q = q->next)
-			if(q->uniqpath == path){
-				have = 1;
-				break;
-			}
-		if(have == 0)
-			return path;
-		path = ((uvlong)salt<<48) | (path&((uvlong)1<<48)-1);
-		++salt;
-	}
-}
-
-Qtab*
-qtadd(Dir *d)
-{
-	int h;
-	Qtab *q;
-
-	qlock(&qidtablock);
-	h = qthash(d->qid.path);
-	for(q = qidtab[h]; q != nil; q = q->next)
-		if(q->type == d->type
-		&& q->dev == d->dev
-		&& q->path == d->qid.path)
-			goto done;
-
-	q = emalloc(sizeof(*q));
-	q->type = d->type;
-	q->dev = d->dev;
-	q->path = d->qid.path;
-	q->uniqpath = uniqpath(q->path);
-
-	h = qthash(q->path);
-	q->next = qidtab[h];
-	qidtab[h] = q;
-done:
-	qunlock(&qidtablock);
-	return q;
-}
-
 void
 unionlink(Union *p, Union *n)
 {
@@ -92,9 +27,8 @@
 	
 	f = emalloc(sizeof(*f));
 	f->ref = 1;
-	f->qtab = qtadd(d);
 	f->Dir = *d;
-	f->qid.path = f->qtab->uniqpath;
+	f->qid = qencode(d);
 	f->name = estrdup(d->name);
 	f->uid = estrdup(d->uid);
 	f->gid = estrdup(d->gid);
@@ -305,7 +239,7 @@
 clone(Fid *old, Fid *new, void*)
 {
 	Fstate *fs;
-	
+
 	fs = old->aux;
 	new->aux = fstatenew(fs->file);
 	return nil;
--- a/unionfs.h
+++ b/unionfs.h
@@ -1,6 +1,4 @@
 enum {
-	Nqbit = 5,
-	Nqtab = 1<<Nqbit,
 	Nftab = 32,
 	Nftlist = 32,
 };
@@ -9,7 +7,6 @@
 typedef struct F F;
 typedef struct Ftab Ftab;
 typedef struct Fstate Fstate;
-typedef struct Qtab Qtab;
 
 struct Union {
 	char *root;
@@ -17,17 +14,9 @@
 	Union *prev, *next;
 };
 
-struct Qtab {
-	ushort type;
-	uint dev;
-	uvlong path, uniqpath;
-	Qtab *next;
-};
-
 struct F {
 	Ref;
 	Dir;
-	Qtab *qtab;
 	char *path;   /* real path */
 	char *fspath; /* internal path */
 };
@@ -44,6 +33,7 @@
 };
 
 void usage(void);
+Qid qencode(Dir*);
 char *mkpath(char*, ...);
 Ref *copyref(Ref*);
 void *emalloc(ulong);