code: mafs

Download patch

ref: e82f565015fd0b75085d8d2a4f1aaca53e875f64
parent: 2076600fa398182a04e0500e47abe963f5c66de3
author: 9ferno <gophone2015@gmail.com>
date: Wed Nov 2 10:38:35 EDT 2022

stop removing further blocks from the Dentry after a reli with a 0 block

--- a/dat.h
+++ b/dat.h
@@ -151,7 +151,7 @@
 	u64 pdblkno; 	/* block number of the parent directory entry. Will be 0 for root. */
 	u64 pqpath; 	/* parent qid.path */
 	u64 mtime;		/* modified time in nano seconds from epoch */
-	u32 mode;		/* same bits as defined in lib.h Dir.mode */
+	u32 mode;		/* same bits as defined in /sys/include/libc.h:/Dir\.mode/ */
 	s16 uid;
 	s16 gid;
 	s16 muid;
--- a/dentry.c
+++ b/dentry.c
@@ -173,18 +173,19 @@
 	ibuf = getbufchk(iblkno, Bwritable, tag, qpath);
 	if(ibuf == nil)
 			dprint("%s",errstring[Ephase]);
+
 	if(tag == Tind0)
-		for(i=Nindperblock-1; i >= 0; i--){
+		for(i=0; i < Nindperblock; i++){
 			blkno = ibuf->io->bufa[i];
 			if(blkno == 0)
-				continue;
+				break;
 			freeblock(blkno, directtag, qpath);
 			ibuf->io->bufa[i] = 0;
 		}
 	else
-		for(i=Nindperblock-1; i >= 0; i--){
+		for(i=0; i < Nindperblock; i++){
 			if(ibuf->io->bufa[i] == 0)
-				continue;
+				break;
 			freeindblock(ibuf->io->bufa[i], tag-1, qpath, directtag);
 			ibuf->io->bufa[i] = 0;
 		}
@@ -209,15 +210,15 @@
 	d->muid = uid;
 	putbuf(dbuf);
 
-	for(i=Niblock-1; i >= 0; i--){
-		if(d1.iblocks[i] == 0)
-			continue;
-		freeindblock(d1.iblocks[i], Tind0+i, d1.qid.path, Tdata);
+	for(i=0; i<Ndblock; i++){
+		if(d.dblocks[i] == 0)
+			return;
+		freeblock(d.dblocks[i], Tdata, qpath);
 	}
-	for(i=Ndblock-1; i >= 0; i--){
-		if(d1.dblocks[i] == 0)
-			continue;
-		freeblock(d1.dblocks[i], Tdata, d1.qid.path);
+	for(i=0;i<Niblock; i++){
+		if(d.iblocks[i] == 0)
+			return;
+		freeindblock(d.iblocks[i], Tind0+i, qpath, Tdata);
 	}
 }
 
@@ -274,12 +275,12 @@
 
 	for(i=0; i<Ndblock; i++){
 		if(d.dblocks[i] == 0)
-			continue;
+			return;
 		freeblock(d.dblocks[i], Tdata, qpath);
 	}
 	for(i=0;i<Niblock; i++){
 		if(d.iblocks[i] == 0)
-			continue;
+			return;
 		freeindblock(d.iblocks[i], Tind0+i, qpath, Tdata);
 	}
 }
@@ -339,12 +340,12 @@
 	 */
 	for(i=0; i<Ndblock; i++){
 		if(d.dblocks[i] == 0)
-			continue;
+			return;
 		freeblock(d.dblocks[i], Tdentry, Qpnone);
 	}
 	for(i=0;i<Niblock; i++){
 		if(d.iblocks[i] == 0)
-			continue;
+			return;
 		freeindblock(d.iblocks[i], Tind0+i, qpath, Tdentry);
 	}
 }
--- a/sub.c
+++ b/sub.c
@@ -109,7 +109,7 @@
 	/* cannot do getbufchk() unless we ream the whole disk at start */
 	buf = getbuf(blkno, Bwritable, Bfreshalloc);
 	/* clear the buf to avoid leaks on reuse */
-	memset(buf->io, 0, Rawblocksize);
+	memset(buf->xiobuf, 0, Rawblocksize);
 	settag(buf, tag, qpath);
 	return buf;
 }