diff options
author | rsc <devnull@localhost> | 2004-03-13 04:35:13 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-03-13 04:35:13 +0000 |
commit | 333c1dccc2f9af67b9c3d8513cca492d022fab4f (patch) | |
tree | db2339b876058f9b21c228ce500336a88d6b954e /src/cmd/venti/arena.c | |
parent | 9ffbb5adcaeec878d3b6db0f8b1f654e839b4689 (diff) | |
download | plan9port-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.c | 24 |
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; |