ref: 095c8ea146b97d57c3a14e71f2b5d7e02595623f
parent: 326343362a401c6288eac841acb9b90044b7f37f
author: 9ferno <gophone2015@gmail.com>
date: Wed Oct 19 20:57:39 EDT 2022
fixed bug in Tind1 blocks
--- a/TODO
+++ b/TODO
@@ -17,3 +17,5 @@
cat /adm/ctl
make docs/mafs.ms more interesting?
test -A announce
+
+prepare tests and merge chktag.c and tests/sizes.c
--- a/chktag.c
+++ b/chktag.c
@@ -6,6 +6,7 @@
/*
write out a single formatted block based on the tag
./6.chktag 23; ./6.chktag 24; ./6.chktag 74
+ ./6.chktag 75; ./6.chktag 3100 '
*/
int debug = 0;
@@ -19,6 +20,14 @@
}
void
+drilldown(u8 tag, u64 reli)
+{
+ print("%s reli %llud is at [%llud]\n", tagnames[tag], reli, reli/nperindunit(tag));
+ if(tag > Tind0)
+ drilldown(tag-1, reli%nperindunit(tag));
+}
+
+void
main(int argc, char *argv[])
{
u64 reli;
@@ -33,12 +42,26 @@
usage();
reli = atoll(argv[0]);
+ print("--- reli %llud ---\n", reli);
if(reli < Ndspanid){
- print("Tdata or Tdentry\n");
+ print("Direct span %llud\n", reli);
}else{
tag = rel2tind(reli);
+ if(tag >= Tmaxind)
+ panic("invalid reli %llud rel2tind(reli) %d > Tmaxind %d\n",
+ reli, rel2tind(reli), Tmaxind);
+
print("%d %s\n", tag, tagnames[tag]);
- }
+ print("nperindunit(%s) %llud\n", tagnames[tag], nperindunit(tag));
+ print("nperiblock(%s) %llud\n", tagnames[tag], nperiblock(tag));
+ print("indirect block %d\n", tag-Tind0);
+ drilldown(tag, reli-tagstartreli(tag));
+ }
+ print("---\n");
+ for(tag=Tind0; tag < Maxtind; tag++){
+ print("%s reli start %llud max %llud\n",
+ tagnames[tag], tagstartreli(tag), maxreli(tag));
+ }
exits(0);
}
--- a/dentry.c
+++ b/dentry.c
@@ -62,7 +62,7 @@
}
tag = rel2tind(reli);
- getindspan(d->iblocks[tag-Tind0], reli-Ndspanid, tag, d->qid.path, s);
+ getindspan(d->iblocks[tag-Tind0], reli-tagstartreli(tag), tag, d->qid.path, s);
}
u64
@@ -100,8 +100,8 @@
if(tag > Tind0){
n = nperindunit(tag);
if(reli/n >= Nindperblock){
- dprint("updateindblock invalid reli: indblkno %llud reli %llud tag %s\n"
- " directblkno %llud len %llud reli/n %llud nperiblock(Tind0) %llud\n",
+ panic("updateindblock invalid reli: indblkno %llud reli %llud tag %s"
+ " directblkno %llud len %llud reli/n %llud nperindunit(tag) %llud\n",
indblkno, reli, tagnames[tag], blkno, len, reli/n, Nindperblock);
dprint("%s",errstring[Ephase]);
return 0;
@@ -111,10 +111,10 @@
blkno, len);
buf->io->bufa[reli/n] = childindblkno;
}else{
- if(reli >= nperiblock(Tind0)){
- dprint("updateindblock invalid reli: indblkno %llud reli %llud tag %s\n"
- " directblkno %llud len %llud nperiblock(Tind0) %llud\n",
- indblkno, reli, tagnames[tag], blkno, len, nperiblock(Tind0));
+ if(reli >= Nspanidperblock){
+ panic("updateindblock invalid reli: indblkno %llud reli %llud tag %s"
+ " directblkno %llud len %llud Nspanidperblock %llud\n",
+ indblkno, reli, tagnames[tag], blkno, len, Nspanidperblock);
dprint("%s",errstring[Ephase]);
return 0;
}
@@ -154,7 +154,7 @@
if(chatty9p > 2)
dprint(" reli %llud tag %s d->iblocks[tag-Tind0] %llud blkno %llud len %llud\n",
reli, tagnames[tag], d->iblocks[tag-Tind0], blkno, len);
- if((nblkno = updateindblock(d->iblocks[tag-Tind0], reli-Ndspanid, tag, path, blkno, len)) == 0){
+ if((nblkno = updateindblock(d->iblocks[tag-Tind0], reli-tagstartreli(tag), tag, path, blkno, len)) == 0){
dprint("%s",errstring[Ephase]);
return 0;
}
--- a/fns.h
+++ b/fns.h
@@ -1,5 +1,10 @@
+u64 nperiblock(u16 tag);
+u64 nperindunit(u16 tag);
u8 rel2tind(u64 reli);
+u64 tagstartreli(u8 tag);
+u64 maxn(u8 tag);
+u64 maxreli(u8 tag);
/* actual device i/o routines */
u64 devinit(char *devfile);
--- a/mkfile
+++ b/mkfile
@@ -33,6 +33,8 @@
</sys/src/cmd/mkmany
+# LDFLAGS=-p
+
$O.used: blk.$O dat.$O dev.$O misc.$O used.$O
$LD $LDFLAGS -o $target $prereq
--- a/tag.c
+++ b/tag.c
@@ -76,3 +76,36 @@
}
return tag;
}
+
+/* blocks above this index have this tag
+ For example,
+ Tind0 starts from a reli >= 24
+ Tind1 starts from a reli >= 74
+ Tind2 starts from a reli >= 3100
+ */
+u64
+tagstartreli(u8 tag)
+{
+ if(tag == Tind0)
+ return Ndspanid;
+ else if(tag == Tind1)
+ return Ndspanid+Nspanidperblock;
+ return nperiblock(tag-1)+tagstartreli(tag-1);
+}
+
+u64
+maxn(u8 tag)
+{
+ if(tag >= Maxtind || tag < Tind0)
+ panic("maxn: invalid tag %d\n", tag);;
+ if(tag == Tind0)
+ return Ndspanid+Nspanidperblock;
+ else
+ return nperiblock(tag) + tagstartreli(tag);
+}
+
+u64
+maxreli(u8 tag)
+{
+ return maxn(tag)-1;
+}
--- a/tests/regress.rc
+++ b/tests/regress.rc
@@ -25,7 +25,7 @@
# start service
if(~ $"debug '')
mount -c <{disk/mafs -s -r mafs_^$service -h 10 $disk <[0=1]} /n/mafs_^$service
- if not
+ if not # TODO below broke, have no idea why. Needs fixing
mount -c <{disk/mafs $"debug -s -r mafs_^$service -h 10 $disk <[0=1]} /n/mafs_^$service
echo service status: $status