tlibventi: minor vtfile bug fixes - plan9port - [fork] Plan 9 from user space
(HTM) git clone git://src.adamsgaard.dk/plan9port
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit e9b70a5f4ca38a98b64c9e0cea528693f5297376
(DIR) parent 13096891711f32d8a7dca3e1ba9cced908752c14
(HTM) Author: Russ Cox <rsc@swtch.com>
Date: Sat, 14 Jun 2008 23:05:19 -0400
libventi: minor vtfile bug fixes
Diffstat:
M src/libventi/file.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
---
(DIR) diff --git a/src/libventi/file.c b/src/libventi/file.c
t@@ -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.
t@@ -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);
t@@ -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);
t@@ -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;