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へ、データをコピーします。

トランザクション内で管理されているブロックが元々位置していたセクタへ書き出す

bwrite(dbuf);

bwrite関数を呼び出して、バッファdbufに格納されているデータを、バッファdbufに対応しているハードディスク上のセクタ(トランザクション内で管理されているブロックが元々位置していたセクタ)へ書き出します。

バッファに関連しているスリープロックを解放する

brelse(lbuf);
brelse(dbuf);

brelse関数を呼び出して、バッファlbufに関連しているスリープロックを解放し、他のプロセスがこのバッファを利用できるようにします。
brelse関数を呼び出して、バッファdbufに関連しているスリープロックを解放し、他のプロセスがこのバッファを利用できるようにします。