shithub: gefs

Download patch

ref: 681429107c5f459c7bb9e4cd3f4c5405ac3fb70a
parent: 31d7c618756cbef356b68828795d9042cd614507
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Dec 6 01:39:11 EST 2021

cache: work towards deletion

--- a/cache.c
+++ b/cache.c
@@ -6,6 +6,40 @@
 #include "dat.h"
 #include "fns.h"
 
+static void
+cachedel(vlong del)
+{
+	Bucket *bkt;
+	Blk *b, **p;
+	u32int h;
+
+	/* FIXME: better hash. */
+	h = ihash(del);
+	bkt = &fs->cache[h % fs->cmax];
+	lock(bkt);
+	p = &bkt->b;
+	for(b = bkt->b; b != nil; b = b->hnext){
+		if(b->bp.addr == del){
+			*p = b->hnext;
+			break;
+		}
+		p = &b->hnext;
+	}
+	unlock(bkt);
+	assert(b != nil);
+
+	if(b->cnext != nil)
+		b->cnext->cprev = b->cprev;
+	if(b->cprev != nil)
+		b->cprev->cnext = b->cnext;
+	if(fs->ctail == b)
+		fs->ctail = b->cprev;
+	if(fs->chead == b)
+		fs->chead = b->cnext;
+	b->cnext = nil;
+	b->cprev = nil;
+}
+
 Blk*
 cacheblk(Blk *b)
 {
@@ -26,6 +60,7 @@
 			goto Found;
 		assert(b->bp.addr != e->bp.addr);
 	}
+	b->hnext = bkt->b;
 	bkt->b = b;
 Found:
 	unlock(bkt);
@@ -58,52 +93,15 @@
 	}
 	c=0;
 	USED(c);
-/*
+#ifdef NOTYET
 	for(c = fs->ctail; c != nil && fs->ccount >= fs->cmax; c = fs->ctail){
-		fs->ctail = c->cprev;
-		fs->ccount--; 
+		cachedel(c->bp.addr);
 		putblk(c);
 	}
-*/
+#endif
 Cached:
 	unlock(&fs->lrulk);
 	return b;
-}
-
-static void
-cachedel(vlong del)
-{
-	Bucket *bkt;
-	Blk *b, **p;
-	u32int h;
-
-	/* FIXME: better hash. */
-	h = ihash(del);
-
-	bkt = &fs->cache[h % fs->cmax];
-	lock(bkt);
-	p = &bkt->b;
-	for(b = bkt->b; b != nil; b = b->hnext){
-		if(b->bp.addr == del){
-			*p = b->hnext;
-			break;
-		}
-		p = &b->hnext;
-	}
-	unlock(bkt);
-	if(b == nil)
-		return;
-
-	lock(&fs->lrulk);
-	if(b->cnext != nil)
-		b->cnext->cprev = b->cprev;
-	if(b->cprev != nil)
-		b->cprev->cnext = b->cnext;
-	if(fs->ctail == b)
-		fs->ctail = b->cprev;
-	if(fs->chead == nil)
-		fs->chead = b;
-	unlock(&fs->lrulk);
 }
 
 Blk*