log.c static void install_trans(void)
トップページ
jupiteroak.hatenablog.com
log.c
https://github.com/mit-pdos/xv6-public/blob/master/log.c#L69
static void install_trans(void) { int tail; for (tail = 0; tail < log.lh.n; tail++) { struct buf *lbuf = bread(log.dev, log.start+tail+1); // read log block struct buf *dbuf = bread(log.dev, log.lh.block[tail]); // read dst memmove(dbuf->data, lbuf->data, BSIZE); // copy block to dst bwrite(dbuf); // write dst to disk brelse(lbuf); brelse(dbuf); } }
install_trans関数は、ハードディスク上のログスペースに保存されているブロック(トランザクション内で管理されているブロック)をハードディスク上の元の位置に保存します。
処理の内容
ハードディスク上のログスペースに保存されているブロックをハードディスク上の元の位置に保存する
for (tail = 0; tail < log.lh.n; tail++) { ... }
ハードディスク上のログスペースに保存されているブロック(トランザクション内で管理されているブロック)を、ハードディスク上の元の位置に保存します。メインメモリ上で管理されているlogheader構造体のnメンバの値は、トランザクション内で管理されているブロックの数を示しています。この値が0の時は、ハードディスク上のログスペースに保存されているブロックが存在している場合でも、ハードディスク上の元の位置に保存する処理を行いません。
ハードディスク上のログスペースに保存されているブロックに対応するバッファを取得する
struct buf *lbuf = bread(log.dev, log.start+tail+1);
bread関数を呼び出して、ハードディスク上のログスペースに保存されているブロック(トランザクション内で管理されているブロック)に対応するバッファを取得します。
log.startは、ログスペースのヘッダーブロックを指定するセクタ番号です。よって、1回目のループでは、log.start+tail+1は、ヘッダーブロックの次にあるブロック(セクタ)を指定するセクタ番号とまります。
ハードディスク上のログスペースに保存されているブロックが元々位置していたセクタに対応するバッファを取得する
struct buf *dbuf = bread(log.dev, log.lh.block[tail]);
bread関数を呼び出して、ハードディスク上のログスペースに保存されているブロック(トランザクション内で管理されているブロック)が元々位置していたセクタに対応するバッファを取得します。
block[tail]には、トランザクション内で管理されているブロックが元々位置していたのセクタのセクタ番号が格納されています。
ハードディスク上のログスペースに保存されているブロックからそのブロックが元々位置していたセクタへデータを保存する
memmove(dbuf->data, lbuf->data, BSIZE);
memmove関数を呼び出して、ハードディスク上のログスペースに保存されているブロック(トランザクション内で管理されているブロック)に対応しているバッファlbufから、そのブロックが元々位置していたセクタに対応しているバッファdbufへ、データをコピーします。