ref: 2d28717d80571e9469a59098150996b28404709f
parent: 7390f4361bedc24705094838ca6facd5d5b12b52
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Aug 4 14:05:34 EDT 2025
gefs: track nulldir more accurately
--- a/sys/src/cmd/gefs/fs.c
+++ b/sys/src/cmd/gefs/fs.c
@@ -1513,7 +1513,7 @@
{
char rnbuf[Kvmax], opbuf[Kvmax], upbuf[Upksz];
char *p, *e, strs[65535];
- int op, nm, rename;
+ int op, nm, rename, nulldir;
vlong oldlen;
Qid old;
Fcall r;
@@ -1552,10 +1552,12 @@
n = de->Xdir;
n.qid.vers++;
p = opbuf+1;
+ nulldir = 1;
op = 0;
/* check validity of updated fields and construct Owstat message */
if(d.qid.path != ~0 || d.qid.vers != ~0){
+ nulldir = 0;
if(d.qid.path != de->qid.path)
error(Ewstatp);
if(d.qid.vers != de->qid.vers)
@@ -1562,6 +1564,7 @@
error(Ewstatv);
}
if(*d.name != '\0'){
+ nulldir = 0;
if(strlen(d.name) > Maxname)
error(Elength);
if(strcmp(d.name, de->name) != 0){
@@ -1574,6 +1577,7 @@
}
}
if(d.length != ~0){
+ nulldir = 0;
if(d.length < 0)
error(Ewstatl);
if(d.length != de->length){
@@ -1604,6 +1608,7 @@
}
}
if(d.mode != ~0){
+ nulldir = 0;
if((d.mode^de->mode) & DMDIR)
error(Ewstatd);
if(d.mode & ~(DMDIR|DMAPPEND|DMEXCL|DMTMP|0777))
@@ -1617,6 +1622,7 @@
}
}
if(d.mtime != ~0){
+ nulldir = 0;
n.mtime = d.mtime*Nsec;
if(n.mtime != de->mtime){
op |= Owmtime;
@@ -1625,6 +1631,7 @@
}
}
if(*d.uid != '\0'){
+ nulldir = 0;
if(strlen(d.uid) > Maxuname)
error(Elength);
rlock(&fs->userlk);
@@ -1642,6 +1649,7 @@
}
}
if(*d.gid != '\0'){
+ nulldir = 0;
if(strlen(d.gid) > Maxuname)
error(Elength);
rlock(&fs->userlk);
@@ -1658,7 +1666,7 @@
p += 4;
}
}
- if(op == 0 && rename == 0){
+ if(nulldir && rename == 0){
*ao = emalloc(sizeof(Amsg), 1);
(*ao)->op = AOsync;
(*ao)->m = m;
--
⑨