bio.c void bwrite(struct buf *b)

トップページ
jupiteroak.hatenablog.com


bio.c
https://github.com/mit-pdos/xv6-public/blob/master/bio.c#L109

void bwrite(struct buf *b)
{
  if(!holdingsleep(&b->lock))
    panic("bwrite");
  b->flags |= B_DIRTY;
  iderw(b);
}

bwrite関数は、バッファbに格納されているデータを、バッファbに対応しているハードディスク上のセクタへ書き出します。

引数 struct buf *b
ハードディスクへ書き出すデータを保存しているバッファを指定するアドレスです。


処理の内容

現在実行中のプロセスがスリープロックを保持していることを確認する

if(!holdingsleep(&b->lock))
  panic("bwrite");

holdingsleep関数を呼び出して、現在実行中のプロセスがスリープロックを保持しているかを確認します。!holdingsleep(&b->lock)が真となる場合→holdingsleep関数の戻り値が0となる場合→スリープロックを保持していない場合は、panic関数を呼び出してメッセージを出力します。

バッファの状態を示すフラグを変更する

b->flags |= B_DIRTY;

B_DIRTY(#define B_DIRTY 0x4)をビット和代入することで、flagsメンバのbit2のみを1に設定します。バッファbのflagsメンバのbit2が1の時、バッファbが保存しているデータをハードディスクへ書き出す必要がある状態であることを示しています。

ハードディスクへの書き出し処理を行う

iderw(b);

iderw関数を呼び出して、バッファbからハードディスクへの書き出し処理を開始させます。