code: mafs

Download patch

ref: 01d3637ababa684f730a5ab2b60d4a45967ab6e5
parent: 36c0de2b2fc05e45d4cc5e0854e86fb637f1d458
author: 9ferno <gophone2015@gmail.com>
date: Thu Oct 13 03:02:27 EDT 2022

updated usage and renamed test scripts

diff: cannot open b/tests/test.b/blocks//null: file does not exist: 'b/tests/test.b/blocks//null' diff: cannot open b/tests/test.b//null: file does not exist: 'b/tests/test.b//null'
--- a/TODO
+++ b/TODO
@@ -7,7 +7,6 @@
 more consistent use of tree lock.
 not using the tree lock for reads - replace RWlock with a Qlock sl
 	RWlock is better than the Qlock. Just need to enforce it better.
-only for locking during super block operations?
 file system checker
 	fsck will be a different user space program
 EXCL files - maintain a list of locks in the tree
@@ -15,5 +14,4 @@
 correct /adm/ctl operation:
 	echo df >> /adm/ctl
 	cat /adm/ctl
-
 make docs/mafs.ms more interesting?
--- a/block.c
+++ b/block.c
@@ -12,7 +12,7 @@
 usage(void)
 {
 	fprint(2, "usage: block [-D] fsfile blkidx\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- a/chktag.c
+++ b/chktag.c
@@ -15,7 +15,7 @@
 usage(void)
 {
 	fprint(2, "usage: chktag [-D] reli\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- /dev/null
+++ b/decisions
@@ -1,0 +1,8 @@
+make /adm/frees dynamic?
+	what value does it add?
+		debug extents?
+			there are test cases to debug extents already.
+			that code should be bug free(?)
+			and, even then, /adm/frees would be too slow to debug extents.
+			disk/reconcile is good enough for debugging extents.
+	/adm/ctl can show the free blocks and used blocks anyway.
--- a/dentry.c
+++ b/dentry.c
@@ -571,7 +571,8 @@
 	if(readfile(dblkno, Qpfrees, buf, size, 0) != size)
 		panic("loadfrees: could not load frees");
 	n = loadextents(&frees, buf, size);
-	dprint("loaded free blocks %llud\n", n);
+	if(chatty9p > 4)
+	dprint("loadfrees: loaded free extents %llud\n", n);
 	free(buf);
 
 	/* clear out /adm/frees data contents */
--- a/find.c
+++ b/find.c
@@ -26,7 +26,7 @@
 usage(void)
 {
 	fprint(2, "usage: used [-D ] fsfile blkno\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- a/free.c
+++ b/free.c
@@ -20,7 +20,7 @@
 usage(void)
 {
 	fprint(2, "usage: free [-D ] fsfile\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- a/mafs.c
+++ b/mafs.c
@@ -33,7 +33,7 @@
 usage(void)
 {
 	fprint(2, "usage: mafs [-Drs] [-h nbuckets] [-a announce-string]... fsfile service\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- a/reconcile.c
+++ b/reconcile.c
@@ -60,7 +60,7 @@
 {
 	fprint(2, "usage: reconcile [-D ] -u list_of_used_blocks_file"
 				" -F list_of_free_blocks_file nblocks\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- /dev/null
+++ b/tests/check.rc
@@ -1,0 +1,26 @@
+#!/bin/rc
+
+t=$1
+disk=$2
+nblocks=$3
+
+# check the contents
+for(b in `{seq 0 1 `{echo $nblocks ' 1 - p' | dc}}){
+	file=$t/blocks/^$b
+	test -f $file &&
+		@{ # to avoid warning: process exceeds 200 file descriptors
+			> /tmp/^$t^.out >[2]/tmp/^$t^.err \
+			diff <{grep -v '^mtime' $file} \
+				<{disk/block $disk $b | grep -v '^mtime'} ||
+			{
+				echo $file
+				cat /tmp/^$t^.out
+				cat /tmp/^$t^.err
+			}
+		}
+}
+rm /tmp/^$t^*
+
+# reconcile the used and free blocks
+echo reconcile $disk $nblocks
+disk/reconcile -u <{disk/used $disk} -F <{disk/free $disk} $nblocks
--- a/tests/offsets.c
+++ b/tests/offsets.c
@@ -18,7 +18,7 @@
 usage(void)
 {
 	fprint(2, "usage: offsets [-D] -s startfile -o offset -a addfile fsfile\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- a/tests/regress.rc
+++ b/tests/regress.rc
@@ -20,7 +20,7 @@
 	. $service^/params
 
 	# setup the service
-	test -f $service^/script.setup && $service^/script.setup $disk $nblocks
+	test -f $service^/setup.rc && $service^/setup.rc $disk $nblocks
 
 	# start service
 	if(~ $"debug '')
@@ -30,7 +30,7 @@
 	echo service status: $status
 
 	sleep 1
-	test -f $service^/script && $service^/script
+	test -f $service^/action.rc && $service^/action.rc
 
 	# tear it down
 	test -f /n/mafs_^$service^/adm/ctl && {
@@ -40,9 +40,9 @@
 	test -f /srv/mafs_^$service && rm /srv/mafs_^$service
 
 	sleep 1
-	test -f $service^/script.post &&
-		$service^/script.post $test $disk $nblocks ||
-		script.post $test $disk $nblocks
+	test -f $service^/check.rc &&
+		$service^/check.rc $test $disk $nblocks ||
+		check.rc $test $disk $nblocks
 }
 
 fn runmp {
@@ -58,7 +58,7 @@
 	. $service^/params
 
 	# setup the service
-	test -f $service^/script.setup && $service^/script.setup $disk $nblocks
+	test -f $service^/setup.rc && $service^/setup.rc $disk $nblocks
 
 	# start service
 	if(~ $"debug '')
@@ -70,7 +70,7 @@
 	mount -c /srv/mafs_^$service /n/mafs_^$service
 
 	sleep 1
-	test -f $service^/script && $service^/script
+	test -f $service^/action.rc && $service^/action.rc
 
 	# tear it down
 	test -f /n/mafs_^$service^/adm/ctl && {
@@ -80,9 +80,9 @@
 	test -f /srv/mafs_^$service && rm /srv/mafs_^$service
 
 	sleep 1
-	test -f $service^/script.post &&
-		$service^/script.post $test $disk $nblocks ||
-		script.post $test $disk $nblocks
+	test -f $service^/check.rc &&
+		$service^/check.rc $test $disk $nblocks ||
+		check.rc $test $disk $nblocks
 }
 
 if(~ $#* 0){
--- /dev/null
+++ b/tests/test.0/setup.rc
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+dd -if /dev/zero -of $1 -bs 512 -count $2
--- /dev/null
+++ b/tests/test.1/action.rc
@@ -1,0 +1,8 @@
+#!/bin/rc
+
+# du -a /n/mafs_test.1/
+mkdir /n/mafs_test.1/dir1
+touch /n/mafs_test.1/dir1/file1
+echo test >> /n/mafs_test.1/dir1/file1
+
+cat /n/mafs_test.1/adm/ctl
--- /dev/null
+++ b/tests/test.1/setup.rc
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+dd -if /dev/zero -of $1 -bs 512 -count $2
--- /dev/null
+++ b/tests/test.2/action.rc
@@ -1,0 +1,21 @@
+#!/bin/rc
+
+# du -a /n/mafs_test.2/
+
+for(t in 0 1 01 2 3 4 5 7){
+	touch /n/mafs_test.2/file1
+	echo ./6.offsets -s test.2/^$t^.start -o `{cat test.2/^$t^.offset} -a test.2/^$t^.add /n/mafs_test.2/file1
+	./6.offsets -s test.2/^$t^.start -o `{cat test.2/^$t^.offset} -a test.2/^$t^.add /n/mafs_test.2/file1
+	diff /n/mafs_test.2/file1 test.2/^$t^.end
+#	{
+#		cat /n/mafs_test.2/file1
+#		cat test.2/^$t^.end
+#	}
+	rm /n/mafs_test.2/file1
+}
+# 	touch /n/mafs_test.2/file1
+# ./6.offsets -s test.2/6.start -o 1124 -a test.2/6.add /n/mafs_test.2/file1 > test.2/6.end
+# 	ls -l /n/mafs_test.2/file1
+#	xd -c -b /n/mafs_test.2/file1
+# 	cp /n/mafs_test.2/file1 test.2/6.end
+#	rm /n/mafs_test.2/file1
--- /dev/null
+++ b/tests/test.2/setup.rc
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+dd -if /dev/zero -of $1 -bs 512 -count $2
--- /dev/null
+++ b/tests/test.3/action.rc
@@ -1,0 +1,29 @@
+#!/bin/rc
+
+# ls -l /srv/ /n/
+fn dofile {
+	file=$"*
+	echo $file
+	time fcp -x test.3/^$file /n/mafs_test.3/
+	ls -ltr test.3/^$file /n/mafs_test.3/^$file
+	diff test.3/^$file /n/mafs_test.3/^$file # > /mnt/term/tmp/test.out
+	# tail /mnt/term/tmp/test.out
+	rm /n/mafs_test.3/^$file
+}
+
+# to build these files
+# dd -if big.file -of 94_blocks.file -bs 502 -count 94
+
+dofile 32_blocks.file
+dofile 33_blocks.file
+dofile 94_blocks.file
+dofile 95_blocks.file
+dofile 128_blocks.file
+dofile 1024_blocks.file
+dofile 2048_blocks.file
+dofile 4096_blocks.file
+dofile 8192_blocks.file
+dofile 16384_blocks.file
+# dofile big.file # cannot do this, not enough space for this.
+
+cat /n/mafs_test.3/adm/ctl
--- /dev/null
+++ b/tests/test.3/setup.rc
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+echo dd -if /dev/zero -of $1 -bs 512 -count $nblocks
+dd -if /dev/zero -of $1 -bs 512 -count $nblocks
--- /dev/null
+++ b/tests/test.4/action.rc
@@ -1,0 +1,6 @@
+#!/bin/rc
+
+# ls -l /srv/ /n/
+mkdir /n/mafs_test.4/dir.0
+dircp test.4/dir.0 /n/mafs_test.4/dir.0
+# du -a /n/mafs_test.4/dir.0
--- /dev/null
+++ b/tests/test.4/setup.rc
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+echo dd -if /dev/zero -of $1 -bs 512 -count $nblocks
+dd -if /dev/zero -of $1 -bs 512 -count $nblocks
--- /dev/null
+++ b/tests/test.5/action.rc
@@ -1,0 +1,7 @@
+#!/bin/rc
+
+# ls -l /srv/ /n/
+time fcp -x test.5/23.messages.gz /n/mafs_test.5/
+time fcp -x test.5/01.messages.gz /n/mafs_test.5/
+du -a /n/mafs_test.5
+ls -l test.5/23.messages.gz test.5/01.messages.gz /n/mafs_test.5/
--- /dev/null
+++ b/tests/test.5/setup.rc
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+echo dd -if /dev/zero -of $1 -bs 512 -count $nblocks
+dd -if /dev/zero -of $1 -bs 512 -count $nblocks
--- /dev/null
+++ b/tests/test.6/action.rc
@@ -1,0 +1,9 @@
+#!/bin/rc
+
+# du -a /n/mafs_test.6/
+mkdir /n/mafs_test.6/dir1
+touch /n/mafs_test.6/dir1/file1
+echo test >> /n/mafs_test.6/dir1/file1
+
+cat /n/mafs_test.6/adm/ctl
+sleep 1
--- /dev/null
+++ b/tests/test.6/setup.rc
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+dd -if /dev/zero -of $1 -bs 512 -count $2
--- /dev/null
+++ b/tests/test.7/action.rc
@@ -1,0 +1,13 @@
+#!/bin/rc
+
+# ls -l /srv/ /n/
+
+for(i in `{seq 1 1 10}){
+	time fcp -x test.7/16384_blocks.file /n/mafs_test.7/16384_blocks.file.^$i &
+}
+
+wait
+sleep 1
+ls -ltr test.7/16384_blocks.file /n/mafs_test.7/16384_blocks.file.*
+
+cat /n/mafs_test.7/adm/ctl
--- /dev/null
+++ b/tests/test.7/check.rc
@@ -1,0 +1,26 @@
+#!/bin/rc
+
+t=$1
+disk=$2
+nblocks=$3
+
+# check the contents
+for(b in 0){
+	file=$t/blocks/^$b
+	test -f $file &&
+		@{ # to avoid warning: process exceeds 200 file descriptors
+			> /tmp/^$t^.out >[2]/tmp/^$t^.err \
+			diff <{grep -v '^mtime' $file} \
+				<{disk/block $disk $b | grep -v '^mtime'} ||
+			{
+				echo $file
+				cat /tmp/^$t^.out
+				cat /tmp/^$t^.err
+			}
+		}
+}
+rm /tmp/^$t^*
+
+# reconcile the used and free blocks
+echo reconcile $disk $nblocks
+disk/reconcile -u <{disk/used $disk} -F <{disk/free $disk} $nblocks
--- /dev/null
+++ b/tests/test.7/setup.rc
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+echo dd -if /dev/zero -of $1 -bs 512 -count $nblocks
+dd -if /dev/zero -of $1 -bs 512 -count $nblocks
--- /dev/null
+++ b/tests/test.8/setup.rc
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+dd -if /dev/zero -of $1 -bs 512 -count $2
--- /dev/null
+++ b/tests/test.9/action.rc
@@ -1,0 +1,24 @@
+#!/bin/rc
+
+# du -a /n/mafs_test.9/
+
+mkdir /n/mafs_test.9/dir1
+touch /n/mafs_test.9/dir1/file1
+echo test >> /n/mafs_test.9/dir1/file1
+
+mkdir /n/mafs_test.9/dir2
+touch /n/mafs_test.9/dir2/file1
+echo test >> /n/mafs_test.9/dir2/file1
+touch /n/mafs_test.9/dir2/file2
+echo test >> /n/mafs_test.9/dir2/file2
+
+# 4096 blocks = 2MB
+mkdir /n/mafs_test.9/dir3
+time fcp -x test.9/2MB.file /n/mafs_test.9/dir3/
+
+# 25 MB file
+mkdir /n/mafs_test.9/dir4
+time fcp -x test.9/25MB.file /n/mafs_test.9/dir4/
+
+du -a /n/mafs_test.9/
+cat /n/mafs_test.9/adm/ctl
--- /dev/null
+++ b/tests/test.9/setup.rc
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+dd -if /dev/zero -of $1 -bs 512 -count $2
--- /dev/null
+++ b/tests/test.a/action.rc
@@ -1,0 +1,9 @@
+#!/bin/rc
+
+time fcp -x test.a/big.file /n/mafs_test.a/
+ls -ltr test.a/big.file /n/mafs_test.a/big.file
+diff test.a/big.file /n/mafs_test.a/big.file # > /mnt/term/tmp/test.out
+# tail /mnt/term/tmp/test.out
+rm /n/mafs_test.a/big.file
+
+cat /n/mafs_test.a/adm/ctl
--- /dev/null
+++ b/tests/test.a/check.rc
@@ -1,0 +1,26 @@
+#!/bin/rc
+
+t=$1
+disk=$2
+nblocks=$3
+
+# check the contents
+#for(b in `{seq 0 1 `{echo $nblocks ' 1 - p' | dc}}){
+#	file=$t/blocks/^$b
+#	test -f $file &&
+#		@{ # to avoid warning: process exceeds 200 file descriptors
+#			> /tmp/^$t^.out >[2]/tmp/^$t^.err \
+#			diff <{grep -v '^mtime' $file} \
+#				<{disk/block $disk $b | grep -v '^mtime'} ||
+#			{
+#				echo $file
+#				cat /tmp/^$t^.out
+#				cat /tmp/^$t^.err
+#			}
+#		}
+#}
+#rm /tmp/^$t^*
+
+# reconcile the used and free blocks
+# echo reconcile $disk $nblocks
+# disk/reconcile -u <{disk/used $disk} -F <{disk/free $disk} $nblocks
--- /dev/null
+++ b/tests/test.a/setup.rc
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+echo dd -if /dev/zero -of $1 -bs 512 -count $nblocks
+dd -if /dev/zero -of $1 -bs 512 -count $nblocks
--- /dev/null
+++ b/tests/test.b/action.rc
@@ -1,0 +1,8 @@
+#!/bin/rc
+
+# du -a /n/mafs_test.b/
+mkdir /n/mafs_test.b/dir1
+touch /n/mafs_test.b/dir1/file1
+echo test >> /n/mafs_test.b/dir1/file1
+
+cat /n/mafs_test.b/adm/ctl
--- /dev/null
+++ b/tests/test.b/blocks/0
@@ -1,0 +1,4 @@
+Tmagic 1 1
+mafs device
+512
+1048564
--- /dev/null
+++ b/tests/test.b/blocks/1
@@ -1,0 +1,6 @@
+Tdata 1 2
+size 16384
+nblocks 32
+backup config 1 to 31 24
+backup super 2 to 30 23
+backup root 3 to 29 22
--- /dev/null
+++ b/tests/test.b/blocks/10
@@ -1,0 +1,42 @@
+Tdentry 1 8
+qid.version 0
+qid.path 8
+size 500
+pdblkno 9
+pqpath 7
+mtime 1653219675351539603
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 31 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name config.0
--- /dev/null
+++ b/tests/test.b/blocks/11
@@ -1,0 +1,42 @@
+Tdentry 1 9
+qid.version 0
+qid.path 9
+size 500
+pdblkno 9
+pqpath 7
+mtime 1653219675351740745
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 30 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name super.0
--- /dev/null
+++ b/tests/test.b/blocks/12
@@ -1,0 +1,42 @@
+Tdentry 1 10
+qid.version 0
+qid.path 10
+size 500
+pdblkno 9
+pqpath 7
+mtime 1653219675351939374
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 29 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name root.0
--- /dev/null
+++ b/tests/test.b/blocks/13
@@ -1,0 +1,42 @@
+Tdentry 1 11
+qid.version 0
+qid.path 11
+size 500
+pdblkno 9
+pqpath 7
+mtime 1653219675352137164
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 24 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name config.1
--- /dev/null
+++ b/tests/test.b/blocks/14
@@ -1,0 +1,42 @@
+Tdentry 1 12
+qid.version 0
+qid.path 12
+size 500
+pdblkno 9
+pqpath 7
+mtime 1653219675352337469
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 23 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name super.1
--- /dev/null
+++ b/tests/test.b/blocks/15
@@ -1,0 +1,42 @@
+Tdentry 1 13
+qid.version 0
+qid.path 13
+size 500
+pdblkno 9
+pqpath 7
+mtime 1653219675352541126
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 22 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name root.1
--- /dev/null
+++ b/tests/test.b/blocks/16
@@ -1,0 +1,42 @@
+Tdentry 1 14
+qid.version 0
+qid.path 14
+size 0
+pdblkno 4
+pqpath 5
+mtime 1653219675350736707
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 0 0
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name ctl
--- /dev/null
+++ b/tests/test.b/blocks/17
@@ -1,0 +1,42 @@
+Tdentry 1 15
+qid.version 0
+qid.path 15
+size 19
+pdblkno 4
+pqpath 5
+mtime 1665241420136494979
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 21 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name frees
--- /dev/null
+++ b/tests/test.b/blocks/18
@@ -1,0 +1,42 @@
+Tdentry 1 64
+qid.version 0
+qid.path 64
+size 0
+pdblkno 3
+pqpath 63
+mtime 1665241662656879014
+mode 20000000777
+uid 10006
+gid -1
+muid 10006
+direct spans
+	0 19 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name dir1
--- /dev/null
+++ b/tests/test.b/blocks/19
@@ -1,0 +1,42 @@
+Tdentry 1 65
+qid.version 0
+qid.path 65
+size 5
+pdblkno 18
+pqpath 64
+mtime 1665241662667052180
+mode 666
+uid 10006
+gid -1
+muid 10006
+direct spans
+	0 20 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name file1
--- /dev/null
+++ b/tests/test.b/blocks/2
@@ -1,0 +1,6 @@
+Tdata 1 3
+start 0
+tfree 0
+qidgen 66
+frees 0
+fsok 1
--- /dev/null
+++ b/tests/test.b/blocks/20
@@ -1,0 +1,2 @@
+Tdata 1 65
+test
--- /dev/null
+++ b/tests/test.b/blocks/21
@@ -1,0 +1,3 @@
+Tdata 1 15
+21 .. 21
+25 .. 28
--- /dev/null
+++ b/tests/test.b/blocks/22
@@ -1,0 +1,1 @@
+Tdata 1 13
--- /dev/null
+++ b/tests/test.b/blocks/23
@@ -1,0 +1,6 @@
+Tdata 1 12
+start 0
+tfree 0
+qidgen 66
+frees 0
+fsok 1
--- /dev/null
+++ b/tests/test.b/blocks/24
@@ -1,0 +1,6 @@
+Tdata 1 11
+size 16384
+nblocks 32
+backup config 1 to 31 24
+backup super 2 to 30 23
+backup root 3 to 29 22
--- /dev/null
+++ b/tests/test.b/blocks/29
@@ -1,0 +1,1 @@
+Tdata 1 10
--- /dev/null
+++ b/tests/test.b/blocks/3
@@ -1,0 +1,42 @@
+Tdentry 1 63
+qid.version 0
+qid.path 63
+size 0
+pdblkno 0
+pqpath 0
+mtime 1653238116207474527
+mode 20000000777
+uid -1
+gid -1
+muid -1
+direct spans
+	0 4 1
+	1 18 1
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name /
--- /dev/null
+++ b/tests/test.b/blocks/30
@@ -1,0 +1,6 @@
+Tdata 1 9
+start 0
+tfree 0
+qidgen 66
+frees 0
+fsok 1
--- /dev/null
+++ b/tests/test.b/blocks/31
@@ -1,0 +1,6 @@
+Tdata 1 8
+size 16384
+nblocks 32
+backup config 1 to 31 24
+backup super 2 to 30 23
+backup root 3 to 29 22
--- /dev/null
+++ b/tests/test.b/blocks/4
@@ -1,0 +1,42 @@
+Tdentry 1 5
+qid.version 0
+qid.path 5
+size 0
+pdblkno 3
+pqpath 63
+mtime 1653220058258327306
+mode 20000000777
+uid -1
+gid -1
+muid -1
+direct spans
+	0 9 1
+	1 5 1
+	2 16 1
+	3 6 1
+	4 7 1
+	5 17 1
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name adm
--- /dev/null
+++ b/tests/test.b/blocks/5
@@ -1,0 +1,42 @@
+Tdentry 1 2
+qid.version 0
+qid.path 2
+size 0
+pdblkno 4
+pqpath 5
+mtime 1653220058259129363
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 1 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name config
--- /dev/null
+++ b/tests/test.b/blocks/6
@@ -1,0 +1,42 @@
+Tdentry 1 3
+qid.version 0
+qid.path 3
+size 0
+pdblkno 4
+pqpath 5
+mtime 1653220058266642885
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 2 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name super
--- /dev/null
+++ b/tests/test.b/blocks/7
@@ -1,0 +1,42 @@
+Tdentry 1 6
+qid.version 0
+qid.path 6
+size 126
+pdblkno 4
+pqpath 5
+mtime 1653220058266842352
+mode 444
+uid -1
+gid -1
+muid -1
+direct spans
+	0 8 1
+	1 0 0
+	2 0 0
+	3 0 0
+	4 0 0
+	5 0 0
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name users
--- /dev/null
+++ b/tests/test.b/blocks/8
@@ -1,0 +1,9 @@
+Tdata 1 6
+-1:adm:adm:
+0:none:adm:
+9999:noworld::
+10000:sys::
+10001:upas:upas:
+10002:bootes:bootes:
+10006:glenda:glenda:
+10007:manies::
--- /dev/null
+++ b/tests/test.b/blocks/9
@@ -1,0 +1,42 @@
+Tdentry 1 7
+qid.version 0
+qid.path 7
+size 126
+pdblkno 4
+pqpath 5
+mtime 1653220058258873744
+mode 20000000777
+uid -1
+gid -1
+muid -1
+direct spans
+	0 10 1
+	1 11 1
+	2 12 1
+	3 13 1
+	4 14 1
+	5 15 1
+	6 0 0
+	7 0 0
+	8 0 0
+	9 0 0
+	10 0 0
+	11 0 0
+	12 0 0
+	13 0 0
+	14 0 0
+	15 0 0
+	16 0 0
+	17 0 0
+	18 0 0
+	19 0 0
+	20 0 0
+	21 0 0
+	22 0 0
+	23 0 0
+indirect blocks
+	0 0
+	1 0
+	2 0
+	3 0
+name bkp
--- /dev/null
+++ b/tests/test.b/notes
@@ -1,0 +1,44 @@
+Creates a disk of 32 blocks. Unmarked blocks are filled from /dev/random.
+
+Duplicate of test.2 but seeded with random data.
+
+Create a file /dir1/file1 on the disk and do:
+echo test >> /n/mafs_test.b/dir1/file1
+
+block	- description
+0		- magic
+1		- config
+2		- super block
+3		- / direntry
+4		- /adm/ dir entry
+5		- /adm/config dir entry
+6		- /adm/super dir entry
+7		- /adm/users dir entry
+8		- /adm/users contents
+9		- /adm/bkp/ dir entry
+10	- /adm/bkp/config.0 dir entry
+11	- /adm/bkp/super.0 dir entry
+12	- /adm/bkp/root.0 dir entry
+13	- /adm/bkp/config.1 dir entry
+14	- /adm/bkp/super.1 dir entry
+15	- /adm/bkp/root.1 dir entry
+16	- /adm/ctl dir entry -- virtual file, empty contents
+17	- /adm/frees dir entry
+
+18	- /dir1 directory entry
+19	- /dir1/file1 directory entry
+20	- /dir1/file1 contents
+21	- /adm/frees contents
+
+22	- / direntry
+23	- super block
+24	- config
+
+25
+26
+27
+28
+
+29	- / direntry
+30	- super block
+31	- config
--- /dev/null
+++ b/tests/test.b/params
@@ -1,0 +1,1 @@
+nblocks=32
--- /dev/null
+++ b/tests/test.b/setup.rc
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+dd -if /dev/random -of $1 -bs 512 -count $2
--- a/tests/testextents.c
+++ b/tests/testextents.c
@@ -15,7 +15,7 @@
 usage(void)
 {
 	fprint(2, "usage: testextents [-D ]\n");
-	exits(0);
+	exits("usage");
 }
 
 void
--- a/used.c
+++ b/used.c
@@ -19,7 +19,7 @@
 usage(void)
 {
 	fprint(2, "usage: used [-D ] fsfile\n");
-	exits(0);
+	exits("usage");
 }
 
 void