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){