URI:
       tfix problem in cache. - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 0c148046ed2d597f9eca97e03c8a0592016c8c10
   DIR parent 39ef727f465306bad804814e58ee0a94224c9fec
  HTML Author: rsc <devnull@localhost>
       Date:   Wed, 16 Jun 2004 16:43:22 +0000
       
       fix problem in cache.
       
       Diffstat:
         M src/libventi/cache.c                |      22 ++++++++--------------
         M src/libventi/file.c                 |       3 ---
         M src/libventi/root.c                 |       2 +-
         M src/libventi/send.c                 |      15 ++++++++++++---
       
       4 files changed, 21 insertions(+), 21 deletions(-)
       ---
   DIR diff --git a/src/libventi/cache.c b/src/libventi/cache.c
       t@@ -262,7 +262,6 @@ vtcachebumpblock(VtCache *c)
                 */
                if(c->nheap == 0){
                        vtcachedump(c);
       -abort();
                        sysfatal("vtcachebumpblock: no free blocks in vtCache");
                }
                b = c->heap[0];
       t@@ -305,17 +304,10 @@ vtcachelocal(VtCache *c, u32int addr, int type)
        
                b = &c->block[addr];
                if(b->addr == NilBlock || b->iostate != BioLocal)
       -{
       -abort();
                        sysfatal("vtcachelocal: block is not local");
       -}
        
                if(b->type != type)
       -{
       -print("%d != %d\n", b->type, type);
       -abort();
                        sysfatal("vtcachelocal: block has wrong type %d != %d", b->type, type);
       -}
        
                qlock(&c->lk);
                b->ref++;
       t@@ -331,9 +323,6 @@ vtcacheallocblock(VtCache *c, int type)
        {
                VtBlock *b;
        
       -if(type >= VtMaxType)
       -        abort();
       -
                qlock(&c->lk);
                b = vtcachebumpblock(c);
                b->iostate = BioLocal;
       t@@ -379,6 +368,11 @@ vtcacheglobal(VtCache *c, uchar score[VtScoreSize], int type)
                        qunlock(&c->lk);
                        qlock(&b->lk);
                        b->nlock = 1;
       +                if(b->iostate == BioVentiError){
       +                        werrstr("venti i/o error");
       +                        vtblockput(b);
       +                        return nil;
       +                }
                        return b;
                }
        
       t@@ -410,7 +404,6 @@ vtcacheglobal(VtCache *c, uchar score[VtScoreSize], int type)
        
                n = vtread(c->z, score, type, b->data, c->blocksize);
                if(n < 0){
       -fprint(2, "vtread: %r\n");
                        b->iostate = BioVentiError;
                        vtblockput(b);
                        return nil;
       t@@ -494,8 +487,8 @@ vtblockwrite(VtBlock *b)
                int n;
        
                if(b->iostate != BioLocal){
       -                abort();
       -                sysfatal("vtBlockWrite: not a local block");
       +                werrstr("vtblockwrite: not a local block");
       +                return -1;
                }
        
                c = b->c;
       t@@ -562,6 +555,7 @@ vtglobaltolocal(uchar score[VtScoreSize])
        int
        vtblockdirty(VtBlock *b)
        {
       +        USED(b);
                return 0;
        }
        
   DIR diff --git a/src/libventi/file.c b/src/libventi/file.c
       t@@ -661,9 +661,7 @@ static int
        mkindices(VtEntry *e, u32int bn, int *index)
        {
                int i, np;
       -        u32int obn;
        
       -        obn = bn;
                memset(index, 0, VtPointerDepth*sizeof(int));
        
                np = e->psize/VtScoreSize;
       t@@ -772,7 +770,6 @@ vtfileblockscore(VtFile *r, u32int bn, uchar score[VtScoreSize])
                return 0;
        
        Err:
       -fprint(2, "vtfileblockhash: %r\n");
                vtblockput(b);
                return -1;
        }
   DIR diff --git a/src/libventi/root.c b/src/libventi/root.c
       t@@ -44,7 +44,7 @@ vtrootunpack(VtRoot *r, uchar *p)
                vers = U16GET(p);
                if(vers != VtRootVersion) {
                        werrstr("unknown root version");
       -                return 0;
       +                return -1;
                }
                p += 2;
                memmove(r->name, p, sizeof(r->name));
   DIR diff --git a/src/libventi/send.c b/src/libventi/send.c
       t@@ -1,5 +1,4 @@
        #include <u.h>
       -#include <errno.h>
        #include <libc.h>
        #include <venti.h>
        #include "queue.h"
       t@@ -47,6 +46,16 @@ _vtsend(VtConn *z, Packet *p)
                return 1;
        }
        
       +static int
       +interrupted(void)
       +{
       +        char e[ERRMAX];
       +
       +        rerrstr(e, sizeof e);
       +        return strstr(e, "interrupted") != nil;
       +}
       +
       +
        static Packet*
        _vtrecv(VtConn *z)
        {
       t@@ -69,7 +78,7 @@ _vtrecv(VtConn *z)
                        if(0) fprint(2, "%d read hdr\n", getpid());
                        n = read(z->infd, b, MaxFragSize);
                        if(0) fprint(2, "%d got %d (%r)\n", getpid(), n);
       -                if(n==0 || (n<0 && errno!=EINTR))
       +                if(n==0 || (n<0 && !interrupted()))
                                goto Err;
                        size += n;
                        packettrim(p, 0, size);
       t@@ -91,7 +100,7 @@ _vtrecv(VtConn *z)
                        if(n > 0)
                                size += n;
                        packettrim(p, 0, size);
       -                if(n==0 || (n<0 && errno!=EINTR))
       +                if(n==0 || (n<0 && !interrupted()))
                                goto Err;
                }
                ventirecvbytes += len;