commit 6610dac99c6e7370aa0a1d6d0521e301533dc61e from: Russ Cox date: Thu Aug 23 15:10:58 2007 UTC venti: avoid race in mirrorarenas (Michael Kaminsky) commit - 92baf59b693e2f2a624e6f4fc7262c438103664d commit + 6610dac99c6e7370aa0a1d6d0521e301533dc61e blob - b16472bb587cf7c37a80a122fe2ee210a873a009 blob + 8b72f1a514077e8f07a80485175ab237d1d17e8b --- src/cmd/venti/srv/mirrorarenas.c +++ src/cmd/venti/srv/mirrorarenas.c @@ -93,6 +93,7 @@ ewritepart(Part *p, u64int offset, u8int *buf, u32int * src with writing dst during copy. This is an easy factor of two * (almost) in performance. */ +static Write wsync; static void writeproc(void *v) { @@ -100,7 +101,7 @@ writeproc(void *v) USED(v); while((w = recvp(writechan)) != nil){ - if(w->n == 0) + if(w == &wsync) continue; if(ewritepart(dst, w->o, w->p, w->n) < 0) w->error = 1; @@ -147,11 +148,7 @@ copy(uvlong start, uvlong end, char *what, DigestState /* * wait for queued write to finish */ - w[i].p = nil; - w[i].o = 0; - w[i].n = 0; - w[i].error = 0; - sendp(writechan, &w[i]); + sendp(writechan, &wsync); i = 1-i; if(w[i].error) return -1;