aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/venti/arena.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-03-11 19:14:09 +0000
committerrsc <devnull@localhost>2004-03-11 19:14:09 +0000
commit24998851775d2d2a737a172dc614d9b5c91706dc (patch)
tree6b249cd18b9ca71aec829c7a4686974f0594cf88 /src/cmd/venti/arena.c
parentd49a2e4801752c8a1211c7fac8cc08055a6b6fa5 (diff)
downloadplan9port-24998851775d2d2a737a172dc614d9b5c91706dc.tar.gz
plan9port-24998851775d2d2a737a172dc614d9b5c91706dc.tar.bz2
plan9port-24998851775d2d2a737a172dc614d9b5c91706dc.zip
Implement write buffer.
Diffstat (limited to 'src/cmd/venti/arena.c')
-rw-r--r--src/cmd/venti/arena.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/cmd/venti/arena.c b/src/cmd/venti/arena.c
index 4a59b278..2cfd1fcf 100644
--- a/src/cmd/venti/arena.c
+++ b/src/cmd/venti/arena.c
@@ -144,6 +144,7 @@ writeclumpinfo(Arena *arena, int clump, ClumpInfo *ci)
cib = getcib(arena, clump, 1, &r);
if(cib == nil)
return -1;
+ dirtydblock(cib->data, DirtyArenaCib);
packclumpinfo(ci, &cib->data->data[cib->offset]);
putcib(arena, cib);
return 0;
@@ -239,11 +240,13 @@ writearena(Arena *arena, u64int aa, u8int *clbuf, u32int n)
qunlock(&arena->lock);
return -1;
}
+ dirtydblock(b, DirtyArena);
m = blocksize - off;
if(m > n - nn)
m = n - nn;
memmove(&b->data[off], &clbuf[nn], m);
- ok = writepart(arena->part, a, b->data, blocksize);
+ // ok = writepart(arena->part, a, b->data, blocksize);
+ ok = 0;
putdblock(b);
if(ok < 0){
qunlock(&arena->lock);
@@ -302,12 +305,13 @@ writeaclump(Arena *arena, Clump *c, u8int *clbuf)
qunlock(&arena->lock);
return TWID64;
}
+ dirtydblock(b, DirtyArena);
m = blocksize - off;
if(m > n - nn)
m = n - nn;
memmove(&b->data[off], &clbuf[nn], m);
-print("writing\n");
- ok = writepart(arena->part, a, b->data, blocksize);
+ // ok = writepart(arena->part, a, b->data, blocksize);
+ ok = 0;
putdblock(b);
if(ok < 0){
qunlock(&arena->lock);
@@ -352,6 +356,7 @@ static void
sealarena(Arena *arena)
{
flushciblocks(arena);
+ flushdcache();
arena->sealed = 1;
wbarena(arena);
backsumarena(arena);
@@ -439,6 +444,8 @@ ReadErr:
/*
* check for no checksum or the same
+ *
+ * the writepart is okay because we flushed the dcache in sealarena
*/
if(scorecmp(score, &b->data[bs - VtScoreSize]) != 0){
if(scorecmp(zeroscore, &b->data[bs - VtScoreSize]) != 0)
@@ -585,6 +592,7 @@ getcib(Arena *arena, int clump, int writing, CIBlock *rock)
block = clump / arena->clumpmax;
off = (clump - block * arena->clumpmax) * ClumpInfoSize;
+/*
if(arena->cib.block == block
&& arena->cib.data != nil){
arena->cib.offset = off;
@@ -596,6 +604,8 @@ getcib(Arena *arena, int clump, int writing, CIBlock *rock)
cib = &arena->cib;
}else
cib = rock;
+*/
+ cib = rock;
qlock(&stats.lock);
stats.cireads++;
@@ -620,6 +630,8 @@ putcib(Arena *arena, CIBlock *cib)
/*
* must be called with arena locked
+ *
+ * cache turned off now that dcache does write caching too.
*/
int
flushciblocks(Arena *arena)
@@ -631,8 +643,8 @@ flushciblocks(Arena *arena)
qlock(&stats.lock);
stats.ciwrites++;
qunlock(&stats.lock);
- ok = writepart(arena->part, arena->base + arena->size - (arena->cib.block + 1) * arena->blocksize, arena->cib.data->data, arena->blocksize);
-
+// ok = writepart(arena->part, arena->base + arena->size - (arena->cib.block + 1) * arena->blocksize, arena->cib.data->data, arena->blocksize);
+ ok = 0;
if(ok < 0)
seterr(EAdmin, "failed writing arena directory block");
putdblock(arena->cib.data);