Lions' 本読み (130)
朝練。諸々確認しつつ write 関連見つつ b_flags 云々まで見れるかどうか。
とりあえずフラグについて控え (書いて覚える的ナニ)。
- av_ なリストから取り出す時、b_flags 属性は B_BUSY にされる
- バッファの情報とディスクの情報が同一の状態であれば b_flags 属性は B_DONE フラグはオン
- ディスクの情報よりバッファの情報のほうがより新しい場合、b_flags 属性は B_DELWRI フラグがオン
write 関連見ていきます。
- bwirte 手続き
- B_READ、B_DONE、B_ERROR、B_DELWRI フラグを落としている
- b_wcount 属性を -256 で初期化している箇所が目に付くのですがとりあえずスルー
- (B_READ フラグを落としているので) 書き込みリクエスト kickoff
- B_ASYNC フラグがオフの場合、処理完了を待ってバッファを av_ なリストに戻す
- B_ASYNC フラグがオンで、B_DELWRI フラグがオフなら geterror 手続き呼び出し
- bdwrite 手続き
- テープの場合 bawrite 手続きで書き込みとのこと
- それ以外は b_flags 属性に B_DELWRI および B_DONW を設定してバッファを av_ なリストに戻す
- bawrite 手続き
- b_flags 属性に B_ASYNC を設定
- bwrite 手続き呼び出し (処理完了待ちをしない)
B_DELWRI で xref 確認したら結構面白いです。ひとつは getblk 手続き。
4960 notavail(bp = bfreelist.av_forw); 4961 if (bp->b_flags & B_DELWRI) { 4962 bp->b_flags =| B_ASYNC; 4963 bwrite(bp); 4964 goto loop;
av_ なリストから除去しているあたりも絶妙。あら? これ以降どうなるのかな。つうか b_ なリストからの出し入れというあたりの理解が微妙なカンジ。
b_{forw,back} 属性
何とも微妙。そもそも構造体の属性の名前はカブッちゃ駄目、って話だったと思っていたのですが、これらは struct buf と struct devtab で名前が重複してます。
4520 struct buf 4521 { 4522 int b_flags; 4523 struct buf *b_forw; 4524 struct buf *b_back;
あるいは以下が struct devtab 型。
4551 struct devtab 4552 { 4553 char d_active; 4554 char d_errcnt; 4555 struct buf *b_forw; 4556 struct buf *b_back; 4557 struct buf *d_actf;
わざわざ b_ にしてるあたり、恣意的な何かを感じるのですが全然分からん。
ので、そこはスルーして xref で順に確認してみるに
- b_forw 属性
- b_ なリストを先頭から手繰る時に使われています (incore とか getblk)
- 他で使われているのは getblk で bfreelist から外される時、dp な b_ リストの先頭に挿入される時と、binit での初期設定あたり
- ここは b_back と同様
あ、分かった。名前を同じくしてるのって
4937 for (bp=dp->b_forw; bp != dp; bp = bp->b_forw) {
なあたりと何か関係があったりするのかな。それにしても binit の以下の部分とか今の常識的に色々凄い。
5076 for (bdp = bdevsw; bdp->d_open; bdp++) { 5077 dp = bdp->d_tab; 5078 if(dp) { 5079 dp->b_forw = dp; 5080 dp->b_back = dp; 5081 } 5082 i++; 5083 }
そして時間切れ
b_flags 云々については夜なのかどうなのか。