shithub: gefs

Download patch

ref: d7be09a034257bf26b5b8d5faaa6da05f92f805a
parent: 7206583bcc46899563934ec3e931da6310f56c85
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Oct 17 18:36:02 EDT 2023

snap: add a special-case snap deadlist for the snap tree

we need to log the snap tree blocks somewhere, so that we
can avoid them getting clobbered. Put this into the superblock,
and reclaim it on snap sync.

--- a/blk.c
+++ b/blk.c
@@ -944,7 +944,7 @@
 	Bfree *f;
 	ulong ge;
 
-	if(t != nil && t != &fs->snap && bp.gen <= t->prev){
+	if(t == &fs->snap || (t != nil && bp.gen <= t->prev)){
 		killblk(t, bp);
 		return;
 	}
@@ -1246,5 +1246,10 @@
 			sysfatal("sync arena: %r");
 		unlock(a);
 	}
+	freedl(&fs->snapdl, 1);
+	fs->snapdl.hd.addr = -1;
+	fs->snapdl.hd.hash = -1;
+	fs->snapdl.tl.addr = -1;
+	fs->snapdl.tl.hash = -1;
 	qunlock(&fs->synclk);
 }
--- a/dat.h
+++ b/dat.h
@@ -458,6 +458,7 @@
 	int	blksz;
 	int	bufspc;
 	Tree	snap;
+	Dlist	snapdl;
 	int	narena;
 	vlong	arenasz;
 	vlong	nextqid;
--- a/fns.h
+++ b/fns.h
@@ -66,6 +66,7 @@
 char*	updatesnap(Tree**, Tree*, char*);
 char*	labelsnap(Tree*, char*);
 char*	delsnap(Tree*, vlong, char*);
+char*	freedl(Dlist*, int);
 Tree*	opensnap(char*);
 vlong	successor(vlong);
 
--- a/pack.c
+++ b/pack.c
@@ -561,12 +561,16 @@
 	int i;
 
 	assert(sz == Blksz);
-	memcpy(p, "gefs0006", 8);	p += 8;
+	memcpy(p, "gefs0007", 8);	p += 8;
 	PACK32(p, Blksz);		p += 4;
 	PACK32(p, Bufspc);		p += 4;
 	PACK32(p, fi->snap.ht);		p += 4;
 	PACK64(p, fi->snap.bp.addr);	p += 8;
 	PACK64(p, fi->snap.bp.hash);	p += 8;
+	PACK64(p, fi->snapdl.hd.addr);	p += 8;
+	PACK64(p, fi->snapdl.hd.hash);	p += 8;
+	PACK64(p, fi->snapdl.tl.addr);	p += 8;
+	PACK64(p, fi->snapdl.tl.hash);	p += 8;
 	PACK32(p, fi->narena);		p += 4;
 	PACK64(p, fi->arenasz);		p += 8;
 	PACK64(p, fi->nextqid);		p += 8;
@@ -585,21 +589,28 @@
 	int i;
 
 	assert(sz == Blksz);
-	if(memcmp(p, "gefs0006", 8) != 0){
+	if(memcmp(p, "gefs0007", 8) != 0){
 		werrstr("wrong block header %.8s\n", p);
 		return nil;
 	}
 	p += 8;
-	fi->blksz = UNPACK32(p);	p += 4;
-	fi->bufspc = UNPACK32(p);	p += 4;
-	fi->snap.ht = UNPACK32(p);	p += 4;
-	fi->snap.bp.addr = UNPACK64(p);	p += 8;
-	fi->snap.bp.hash = UNPACK64(p);	p += 8;
-	fi->snap.bp.gen = -1;		p += 0;
-	fi->narena = UNPACK32(p);	p += 4;
-	fi->arenasz = UNPACK64(p);	p += 8;
-	fi->nextqid = UNPACK64(p);	p += 8;
-	fi->nextgen = UNPACK64(p);	p += 8;
+	fi->blksz = UNPACK32(p);		p += 4;
+	fi->bufspc = UNPACK32(p);		p += 4;
+	fi->snap.ht = UNPACK32(p);		p += 4;
+	fi->snap.bp.addr = UNPACK64(p);		p += 8;
+	fi->snap.bp.hash = UNPACK64(p);		p += 8;
+	fi->snap.bp.gen = -1;			p += 0;
+	fi->snapdl.hd.addr = UNPACK64(p);	p += 8;
+	fi->snapdl.hd.hash = UNPACK64(p);	p += 8;
+	fi->snapdl.gen = -1;			p += 0;
+	fi->snapdl.tl.addr = UNPACK64(p);	p += 8;
+	fi->snapdl.tl.hash = UNPACK64(p);	p += 8;
+	fi->snapdl.gen = -1;			p += 0;
+	fi->snapdl.gen = 
+	fi->narena = UNPACK32(p);		p += 4;
+	fi->arenasz = UNPACK64(p);		p += 8;
+	fi->nextqid = UNPACK64(p);		p += 8;
+	fi->nextgen = UNPACK64(p);		p += 8;
 	fi->qgen = UNPACK64(p);	p += 8;
 	fi->arenabp = malloc(fi->narena * sizeof(Bptr));
 	for(i = 0; i < fi->narena; i++){
--- a/ream.c
+++ b/ream.c
@@ -351,6 +351,10 @@
 
 	fs->snap.bp = tb->bp;
 	fs->snap.ht = 1;
+	fs->snapdl.hd.addr = -1;
+	fs->snapdl.hd.hash = -1;
+	fs->snapdl.tl.addr = -1;
+	fs->snapdl.tl.hash = -1;
 	fs->nextqid = Nreamqid;
 
 	dropblk(mb);
--- a/snap.c
+++ b/snap.c
@@ -140,7 +140,7 @@
 	}
 }
 
-static char*
+char*
 freedl(Dlist *dl, int docontents)
 {
 	Bptr bp;
@@ -532,7 +532,9 @@
 	Blk *b;
 	char *p;
 
-	if((dl = getdl(t->gen, bp.gen)) == nil)
+	if(t == &fs->snap)
+		dl = &fs->snapdl;
+	else if((dl = getdl(t->gen, bp.gen)) == nil)
 		return -1;
 	if(dl->ins == nil || dl->ins->deadsz == Dlspc){
 		if((b = newblk(&fs->snap, Tdlist)) == nil){