aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti/arena.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-13 04:35:13 +0000
committerrsc <devnull@localhost>2004-03-13 04:35:13 +0000
commit333c1dccc2f9af67b9c3d8513cca492d022fab4f (patch)
treedb2339b876058f9b21c228ce500336a88d6b954e /src/cmd/venti/arena.c
parent9ffbb5adcaeec878d3b6db0f8b1f654e839b4689 (diff)
downloadplan9port-333c1dccc2f9af67b9c3d8513cca492d022fab4f.tar.gz
plan9port-333c1dccc2f9af67b9c3d8513cca492d022fab4f.tar.bz2
plan9port-333c1dccc2f9af67b9c3d8513cca492d022fab4f.zip
Add binary fraction tree index.
The old index code is still supported too. Buildindex and checkindex need to be revisited, though they should be easy to adapt.
Diffstat (limited to 'src/cmd/venti/arena.c')
-rw-r--r--src/cmd/venti/arena.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/cmd/venti/arena.c b/src/cmd/venti/arena.c
index 2cfd1fcf..318f9ad2 100644
--- a/src/cmd/venti/arena.c
+++ b/src/cmd/venti/arena.c
@@ -468,18 +468,16 @@ ReadErr:
int
wbarena(Arena *arena)
{
- ZBlock *b;
+ DBlock *b;
int bad;
- b = alloczblock(arena->blocksize, 1);
- if(b == nil){
+ if((b = getdblock(arena->part, arena->base + arena->size, 0)) == nil){
logerr(EAdmin, "can't write arena trailer: %r");
-///ZZZ add error message?
return -1;
}
- bad = okarena(arena)<0 || packarena(arena, b->data)<0 ||
- writepart(arena->part, arena->base + arena->size, b->data, arena->blocksize)<0;
- freezblock(b);
+ dirtydblock(b, DirtyArenaTrailer);
+ bad = okarena(arena)<0 || packarena(arena, b->data)<0;
+ putdblock(b);
if(bad)
return -1;
return 0;
@@ -502,6 +500,10 @@ wbarenahead(Arena *arena)
///ZZZ add error message?
return -1;
}
+ /*
+ * this writepart is okay because it only happens
+ * during initialization.
+ */
bad = packarenahead(&head, b->data)<0 ||
writepart(arena->part, arena->base - arena->blocksize, b->data, arena->blocksize)<0;
freezblock(b);
@@ -582,6 +584,7 @@ okarena(Arena *arena)
static CIBlock*
getcib(Arena *arena, int clump, int writing, CIBlock *rock)
{
+ int read;
CIBlock *cib;
u32int block, off;
@@ -613,7 +616,12 @@ getcib(Arena *arena, int clump, int writing, CIBlock *rock)
cib->block = block;
cib->offset = off;
- cib->data = getdblock(arena->part, arena->base + arena->size - (block + 1) * arena->blocksize, arena->blocksize);
+
+ read = 1;
+ if(writing && off == 0 && clump == arena->clumps-1)
+ read = 0;
+
+ cib->data = getdblock(arena->part, arena->base + arena->size - (block + 1) * arena->blocksize, read);
if(cib->data == nil)
return nil;
return cib;