aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-06-16 16:43:22 +0000
committerrsc <devnull@localhost>2004-06-16 16:43:22 +0000
commit0c148046ed2d597f9eca97e03c8a0592016c8c10 (patch)
tree2a37fa281a8ac86d5a7cdd54f5964f90e20d6cf0
parent39ef727f465306bad804814e58ee0a94224c9fec (diff)
downloadplan9port-0c148046ed2d597f9eca97e03c8a0592016c8c10.tar.gz
plan9port-0c148046ed2d597f9eca97e03c8a0592016c8c10.tar.bz2
plan9port-0c148046ed2d597f9eca97e03c8a0592016c8c10.zip
fix problem in cache.
-rw-r--r--src/libventi/cache.c22
-rw-r--r--src/libventi/file.c3
-rw-r--r--src/libventi/root.c2
-rw-r--r--src/libventi/send.c15
4 files changed, 21 insertions, 21 deletions
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 <u.h>
-#include <errno.h>
#include <libc.h>
#include <venti.h>
#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;