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;
}