tventi: avoid race in mirrorarenas (Michael Kaminsky) - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 6610dac99c6e7370aa0a1d6d0521e301533dc61e
 (DIR) parent 92baf59b693e2f2a624e6f4fc7262c438103664d
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Thu, 23 Aug 2007 11:10:58 -0400
       
       venti: avoid race in mirrorarenas (Michael Kaminsky)
       
       Diffstat:
         M src/cmd/venti/srv/mirrorarenas.c    |       9 +++------
       
       1 file changed, 3 insertions(+), 6 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/venti/srv/mirrorarenas.c b/src/cmd/venti/srv/mirrorarenas.c
       t@@ -93,6 +93,7 @@ ewritepart(Part *p, u64int offset, u8int *buf, u32int count)
         * src with writing dst during copy.  This is an easy factor of two
         * (almost) in performance.
         */
       +static Write wsync;
        static void
        writeproc(void *v)
        {
       t@@ -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;
       t@@ -147,11 +148,7 @@ copy(uvlong start, uvlong end, char *what, DigestState *ds)
                /*
                 * 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;