venti: seal arenas without bypassing dcache
This commit is contained in:
parent
2432b7b1e5
commit
db1cda12ae
1 changed files with 9 additions and 12 deletions
|
|
@ -65,7 +65,7 @@ initarena(Part *part, u64int base, u64int size, u32int blocksize)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(arena->diskstats.sealed && scorecmp(zeroscore, arena->score)==0)
|
if(arena->diskstats.sealed && scorecmp(zeroscore, arena->score)==0)
|
||||||
backsumarena(arena);
|
sealarena(arena);
|
||||||
|
|
||||||
return arena;
|
return arena;
|
||||||
}
|
}
|
||||||
|
|
@ -516,6 +516,7 @@ sumarena(Arena *arena)
|
||||||
/*
|
/*
|
||||||
* read & sum all blocks except the last one
|
* read & sum all blocks except the last one
|
||||||
*/
|
*/
|
||||||
|
flushdcache();
|
||||||
memset(&s, 0, sizeof s);
|
memset(&s, 0, sizeof s);
|
||||||
b = alloczblock(bs, 0, arena->part->blocksize);
|
b = alloczblock(bs, 0, arena->part->blocksize);
|
||||||
e = arena->base + arena->size;
|
e = arena->base + arena->size;
|
||||||
|
|
@ -554,21 +555,16 @@ ReadErr:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* check for no checksum or the same
|
* 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(score, &b->data[bs - VtScoreSize]) != 0
|
||||||
if(scorecmp(zeroscore, &b->data[bs - VtScoreSize]) != 0)
|
&& scorecmp(zeroscore, &b->data[bs - VtScoreSize]) != 0)
|
||||||
logerr(EOk, "overwriting mismatched checksums for arena=%s, found=%V calculated=%V",
|
logerr(EOk, "overwriting mismatched checksums for arena=%s, found=%V calculated=%V",
|
||||||
arena->name, &b->data[bs - VtScoreSize], score);
|
arena->name, &b->data[bs - VtScoreSize], score);
|
||||||
scorecp(&b->data[bs - VtScoreSize], score);
|
|
||||||
if(writepart(arena->part, e, b->data, bs) < 0)
|
|
||||||
logerr(EOk, "sumarena can't write sum for %s: %r", arena->name);
|
|
||||||
}
|
|
||||||
freezblock(b);
|
freezblock(b);
|
||||||
|
|
||||||
qlock(&arena->lock);
|
qlock(&arena->lock);
|
||||||
scorecp(arena->score, score);
|
scorecp(arena->score, score);
|
||||||
|
wbarena(arena);
|
||||||
qunlock(&arena->lock);
|
qunlock(&arena->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -587,6 +583,7 @@ wbarena(Arena *arena)
|
||||||
}
|
}
|
||||||
dirtydblock(b, DirtyArenaTrailer);
|
dirtydblock(b, DirtyArenaTrailer);
|
||||||
bad = okarena(arena)<0 || packarena(arena, b->data)<0;
|
bad = okarena(arena)<0 || packarena(arena, b->data)<0;
|
||||||
|
scorecp(b->data + arena->blocksize - VtScoreSize, arena->score);
|
||||||
putdblock(b);
|
putdblock(b);
|
||||||
if(bad)
|
if(bad)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue