diff options
author | Russ Cox <rsc@swtch.com> | 2008-06-14 23:05:19 -0400 |
---|---|---|
committer | Russ Cox <rsc@swtch.com> | 2008-06-14 23:05:19 -0400 |
commit | e9b70a5f4ca38a98b64c9e0cea528693f5297376 (patch) | |
tree | e70983725de006fac4d47da4f3bfe9d3504205ef /src/libventi | |
parent | 13096891711f32d8a7dca3e1ba9cced908752c14 (diff) | |
download | plan9port-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.c | 13 |
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; |