commit db1cda12aeacb3fde97b8a88120c9f8d1eaa7e44 from: Russ Cox date: Thu Aug 23 23:02:35 2007 UTC venti: seal arenas without bypassing dcache commit - 2432b7b1e57ccc8d204ba99e004d6fb1e1093373 commit + db1cda12aeacb3fde97b8a88120c9f8d1eaa7e44 blob - cc3ac62c1085cdd30f5766db978d4580ed61a4ee blob + 7cd2eb73c4244b555587e0fee267d74a3461e5d8 --- src/cmd/venti/srv/arena.c +++ src/cmd/venti/srv/arena.c @@ -65,7 +65,7 @@ initarena(Part *part, u64int base, u64int size, u32int } if(arena->diskstats.sealed && scorecmp(zeroscore, arena->score)==0) - backsumarena(arena); + sealarena(arena); return arena; } @@ -516,6 +516,7 @@ sumarena(Arena *arena) /* * read & sum all blocks except the last one */ + flushdcache(); memset(&s, 0, sizeof s); b = alloczblock(bs, 0, arena->part->blocksize); e = arena->base + arena->size; @@ -551,24 +552,19 @@ ReadErr: sha1(b->data, bs-VtScoreSize, nil, &s); sha1(zeroscore, VtScoreSize, nil, &s); sha1(nil, 0, score, &s); - + /* * 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) - logerr(EOk, "overwriting mismatched checksums for arena=%s, found=%V calculated=%V", - 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); - } + if(scorecmp(score, &b->data[bs - VtScoreSize]) != 0 + && scorecmp(zeroscore, &b->data[bs - VtScoreSize]) != 0) + logerr(EOk, "overwriting mismatched checksums for arena=%s, found=%V calculated=%V", + arena->name, &b->data[bs - VtScoreSize], score); freezblock(b); qlock(&arena->lock); scorecp(arena->score, score); + wbarena(arena); qunlock(&arena->lock); } @@ -587,6 +583,7 @@ wbarena(Arena *arena) } dirtydblock(b, DirtyArenaTrailer); bad = okarena(arena)<0 || packarena(arena, b->data)<0; + scorecp(b->data + arena->blocksize - VtScoreSize, arena->score); putdblock(b); if(bad) return -1;