summaryrefslogtreecommitdiffstats
path: root/src/cmd/venti/srv/icachewrite.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-07-18 15:26:33 +0000
committerrsc <devnull@localhost>2006-07-18 15:26:33 +0000
commit28b49df3542a635cca788f3de213385f3fcb6334 (patch)
treea3a30774249929e66988bf77e76df9459acb50bc /src/cmd/venti/srv/icachewrite.c
parent686bd37d9d8db5e3b969a3aa2d5b455e0976b262 (diff)
downloadplan9port-28b49df3542a635cca788f3de213385f3fcb6334.tar.gz
plan9port-28b49df3542a635cca788f3de213385f3fcb6334.zip
assorted changes from Plan 9
Diffstat (limited to 'src/cmd/venti/srv/icachewrite.c')
-rw-r--r--src/cmd/venti/srv/icachewrite.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/cmd/venti/srv/icachewrite.c b/src/cmd/venti/srv/icachewrite.c
index 9c36ba2c..003abb18 100644
--- a/src/cmd/venti/srv/icachewrite.c
+++ b/src/cmd/venti/srv/icachewrite.c
@@ -12,6 +12,7 @@ static void icachewritecoord(void*);
static IEntry *iesort(IEntry*);
int icachesleeptime = 1000; /* milliseconds */
+int minicachesleeptime = 50;
enum
{
@@ -74,7 +75,7 @@ nextchunk(Index *ix, ISect *is, IEntry **pie, u64int *paddr, uint *pnbuf)
static int
icachewritesect(Index *ix, ISect *is, u8int *buf)
{
- int err, h, bsize;
+ int err, h, bsize, t;
u32int lo, hi;
u64int addr, naddr;
uint nbuf, off;
@@ -96,7 +97,14 @@ icachewritesect(Index *ix, ISect *is, u8int *buf)
err = 0;
while(iedirty){
- sleep(icachesleeptime);
+ disksched();
+ while((t=icachesleeptime) == SleepForever){
+ sleep(1000);
+ disksched();
+ }
+ if(t < minicachesleeptime)
+ t = minicachesleeptime;
+ sleep(t);
trace(TraceProc, "icachewritesect nextchunk");
chunk = nextchunk(ix, is, &iedirty, &addr, &nbuf);
@@ -146,12 +154,15 @@ icachewritesect(Index *ix, ISect *is, u8int *buf)
break;
}
packibucket(&ib, buf+off, is->bucketmagic);
+ /* XXX not right - must update cache after writepart */
if((b = _getdblock(is->part, naddr, ORDWR, 0)) != nil){
memmove(b->data, buf+off, bsize);
putdblock(b);
}
}
+ diskaccess(1);
+
trace(TraceProc, "icachewritesect writepart", addr, nbuf);
if(writepart(is->part, addr, buf, nbuf) < 0){
/* XXX */
@@ -171,6 +182,7 @@ icachewritesect(Index *ix, ISect *is, u8int *buf)
static void
icachewriteproc(void *v)
{
+ int ret;
uint bsize;
ISect *is;
Index *ix;
@@ -188,17 +200,17 @@ icachewriteproc(void *v)
trace(TraceProc, "icachewriteproc recv");
recv(is->writechan, 0);
trace(TraceWork, "start");
- icachewritesect(ix, is, buf);
+ ret = icachewritesect(ix, is, buf);
trace(TraceProc, "icachewriteproc send");
trace(TraceWork, "finish");
- send(is->writedonechan, 0);
+ sendul(is->writedonechan, ret);
}
}
static void
icachewritecoord(void *v)
{
- int i;
+ int i, err;
Index *ix;
AState as;
@@ -216,9 +228,9 @@ icachewritecoord(void *v)
as = diskstate();
if(as.arena==iwrite.as.arena && as.aa==iwrite.as.aa){
/* will not be able to do anything more than last flush - kick disk */
- trace(TraceProc, "icachewritecoord flush dcache");
+ trace(TraceProc, "icachewritecoord kick dcache");
kickdcache();
- trace(TraceProc, "icachewritecoord flushed dcache");
+ trace(TraceProc, "icachewritecoord kicked dcache");
}
iwrite.as = as;
@@ -229,13 +241,15 @@ icachewritecoord(void *v)
if(ix->bloom)
send(ix->bloom->writechan, 0);
+ err = 0;
for(i=0; i<ix->nsects; i++)
- recv(ix->sects[i]->writedonechan, 0);
+ err |= recvul(ix->sects[i]->writedonechan);
if(ix->bloom)
- recv(ix->bloom->writedonechan, 0);
+ err |= recvul(ix->bloom->writedonechan);
- trace(TraceProc, "icachewritecoord donewrite");
- setatailstate(&iwrite.as);
+ trace(TraceProc, "icachewritecoord donewrite err=%d", err);
+ if(err == 0)
+ setatailstate(&iwrite.as);
}
icacheclean(nil); /* wake up anyone waiting */
trace(TraceWork, "finish");