ref: 307645129bd818a9b9b731ef9c5c0c43a3fdaeb3
parent: 9e59da5b58cd2a31589ca738cb301ef7fad89937
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Apr 18 19:42:59 EDT 2023
fs: correct large writes with large iounit
--- a/fs.c
+++ b/fs.c
@@ -174,7 +174,7 @@
respond(Fmsg *m, Fcall *r)
{
Fcall rf;
- uchar buf[Max9p];
+ uchar buf[Max9p+IOHDRSZ];
int w, n;
r->tag = m->tag;
@@ -654,7 +654,7 @@
if(p != nil)
*p = '\0';
r.type = Rversion;
- r.msize = Max9p;
+ r.msize = Max9p + IOHDRSZ;
if(strcmp(m->version, "9P2000") == 0){
if(m->msize < r.msize)
r.msize = m->msize;
@@ -1869,12 +1869,12 @@
static void
fswrite(Fmsg *m)
{
- char sbuf[Wstatmax], kbuf[4][Offksz], vbuf[4][Ptrsz];
+ char sbuf[Wstatmax], kbuf[Max9p/Blksz+2][Offksz], vbuf[Max9p/Blksz+2][Ptrsz];
+ Bptr bp[Max9p/Blksz + 2];
+ Msg kv[Max9p/Blksz + 2];
+ vlong n, o, c, w;
char *p, *e;
- vlong n, o, c;
int i, j;
- Bptr bp[4];
- Msg kv[4];
Fcall r;
Fid *f;
@@ -1898,10 +1898,12 @@
}
wlock(f->dent);
+ w = 0;
p = m->data;
o = m->offset;
c = m->count;
for(i = 0; i < nelem(kv)-1 && c != 0; i++){
+ assert(i == 0 || o%Blksz == 0);
kv[i].op = Oinsert;
kv[i].k = kbuf[i];
kv[i].nk = sizeof(kbuf[i]);
@@ -1917,6 +1919,7 @@
abort();
return;
}
+ w += n;
p += n;
o += n;
c -= n;
@@ -1926,7 +1929,7 @@
kv[i].op = Owstat;
kv[i].k = f->dent->k;
kv[i].nk = f->dent->nk;
- n = m->offset+m->count;
+ n = m->offset+w;
*p++ = 0;
if(n > f->dent->length){
sbuf[0] |= Owsize;
@@ -1953,7 +1956,7 @@
wunlock(f->dent);
r.type = Rwrite;
- r.count = m->count;
+ r.count = w;
respond(m, &r);
putfid(f);
}