ref: c25ea72c90893cf97d313178f5e2a38077cd9cd4
dir: /sync.c/
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <avl.h>
#include "dat.h"
#include "fns.h"
int
syncblk(Blk *b)
{
assert(b->flag & Bfinal);
lock(b);
b->flag &= ~(Bqueued|Bdirty);
unlock(b);
return pwrite(fs->fd, b->buf, Blksz, b->bp.addr);
}
void
enqueue(Blk *b)
{
assert(b->flag&Bdirty);
finalize(b);
if(syncblk(b) == -1){
ainc(&fs->broken);
fprint(2, "write: %r");
abort();
}
}
char*
snapshot(Mount *mnt)
{
char *e;
mnt->m.op = Oinsert;
// mnt->m.k[0] = Ksnap;
// PBIT64(mnt->m.k + 1, fs->nextgen++);
PBIT32(mnt->m.v + 0, mnt->root.ht);
PBIT64(mnt->m.v + 4, mnt->root.bp.addr);
PBIT64(mnt->m.v + 12, mnt->root.bp.hash);
PBIT64(mnt->m.v + 20, mnt->root.bp.gen);
PBIT64(mnt->m.v + 28, mnt->dead.addr);
PBIT64(mnt->m.v + 36, mnt->dead.hash);
PBIT64(mnt->m.v + 42, mnt->dead.gen);
if((e = btupsert(&fs->snap, &mnt->m, 1)) != nil)
return e;
if(sync() == -1)
return Eio;
return 0;
}
int
sync(void)
{
int i, r;
Arena *a;
Blk *b, *s;
qlock(&fs->snaplk);
r = 0;
s = fs->super;
fillsuper(s);
enqueue(s);
for(i = 0; i < fs->narena; i++){
a = &fs->arenas[i];
finalize(a->logtl);
if(syncblk(a->logtl) == -1)
r = -1;
}
for(b = fs->chead; b != nil; b = b->cnext){
if(!(b->flag & Bdirty))
continue;
if(syncblk(b) == -1)
r = -1;
}
if(r != -1)
r = syncblk(s);
qunlock(&fs->snaplk);
return r;
}