code: mafs

Download patch

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