aboutsummaryrefslogtreecommitdiff
path: root/src/libventi
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-06-14 23:05:19 -0400
committerRuss Cox <rsc@swtch.com>2008-06-14 23:05:19 -0400
commite9b70a5f4ca38a98b64c9e0cea528693f5297376 (patch)
treee70983725de006fac4d47da4f3bfe9d3504205ef /src/libventi
parent13096891711f32d8a7dca3e1ba9cced908752c14 (diff)
downloadplan9port-e9b70a5f4ca38a98b64c9e0cea528693f5297376.tar.gz
plan9port-e9b70a5f4ca38a98b64c9e0cea528693f5297376.tar.bz2
plan9port-e9b70a5f4ca38a98b64c9e0cea528693f5297376.zip
libventi: minor vtfile bug fixes
Diffstat (limited to 'src/libventi')
-rw-r--r--src/libventi/file.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/libventi/file.c b/src/libventi/file.c
index 29b414f6..b6887dec 100644
--- a/src/libventi/file.c
+++ b/src/libventi/file.c
@@ -607,7 +607,7 @@ shrinkdepth(VtFile *r, VtBlock *p, VtEntry *e, int depth)
rb = vtcacheglobal(r->c, e->score, e->type);
if(rb == nil)
- return 0;
+ return -1;
/*
* Walk down to the new root block.
@@ -748,6 +748,12 @@ vtfileblockscore(VtFile *r, u32int bn, uchar score[VtScoreSize])
if(b == nil)
return -1;
+ if(DEPTH(e.type) == 0){
+ memmove(score, e.score, VtScoreSize);
+ vtblockput(b);
+ return 0;
+ }
+
i = mkindices(&e, bn, index);
if(i < 0){
vtblockput(b);
@@ -1058,6 +1064,8 @@ filewrite1(VtFile *f, void *data, long count, vlong offset)
return -1;
memmove(b->data+frag, data, count);
+ if(m == VtOWRITE && frag+count < e.dsize)
+ memset(b->data+frag+count, 0, e.dsize-frag-count);
if(offset+count > e.size){
vtfilegetentry(f, &e);
@@ -1118,9 +1126,12 @@ flushblock(VtCache *c, VtBlock *bb, uchar score[VtScoreSize], int ppb, int epb,
for(i=0; i<epb; i++){
if(vtentryunpack(&e, b->data, i) < 0)
goto Err;
+ if(!(e.flags&VtEntryActive))
+ continue;
if(flushblock(c, nil, e.score, e.psize/VtScoreSize, e.dsize/VtEntrySize,
e.type) < 0)
goto Err;
+ vtentrypack(&e, b->data, i);
}
break;