From 0c148046ed2d597f9eca97e03c8a0592016c8c10 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 16 Jun 2004 16:43:22 +0000 Subject: fix problem in cache. --- src/libventi/cache.c | 22 ++++++++-------------- src/libventi/file.c | 3 --- src/libventi/root.c | 2 +- src/libventi/send.c | 15 ++++++++++++--- 4 files changed, 21 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/libventi/cache.c b/src/libventi/cache.c index dff32cd6..6ed61a06 100644 --- a/src/libventi/cache.c +++ b/src/libventi/cache.c @@ -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]; @@ -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++; @@ -331,9 +323,6 @@ vtcacheallocblock(VtCache *c, int type) { VtBlock *b; -if(type >= VtMaxType) - abort(); - qlock(&c->lk); b = vtcachebumpblock(c); b->iostate = BioLocal; @@ -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; } @@ -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; @@ -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; @@ -562,6 +555,7 @@ vtglobaltolocal(uchar score[VtScoreSize]) int vtblockdirty(VtBlock *b) { + USED(b); return 0; } diff --git a/src/libventi/file.c b/src/libventi/file.c index 50e99f3c..0b487078 100644 --- a/src/libventi/file.c +++ b/src/libventi/file.c @@ -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; @@ -772,7 +770,6 @@ vtfileblockscore(VtFile *r, u32int bn, uchar score[VtScoreSize]) return 0; Err: -fprint(2, "vtfileblockhash: %r\n"); vtblockput(b); return -1; } diff --git a/src/libventi/root.c b/src/libventi/root.c index c9449af8..5b4ccac6 100644 --- a/src/libventi/root.c +++ b/src/libventi/root.c @@ -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)); diff --git a/src/libventi/send.c b/src/libventi/send.c index 726c4027..3e5f20ea 100644 --- a/src/libventi/send.c +++ b/src/libventi/send.c @@ -1,5 +1,4 @@ #include -#include #include #include #include "queue.h" @@ -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) { @@ -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); @@ -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; -- cgit v1.2.3