Lions' 本読み (93)

ええと、swap 手続きで云々している bdevsw は strct bdevsw な配列になっており、その d_strategy という属性が手続きとして呼び出される形になってます。

5212    (*bdevsw[swapdev>>8].d_strategy)(&swbuf);

それにしても定義のあたりがなかなかに微妙。以下が構造体宣言とポインタの定義 (?)

4617 struct      bdevsw  {
4618    int      (*d_open)();
4619    int      (*d_close)();
4620    int      (*d_strategy)();
4621    int      *d_tab;
4622 } bdevsw[];

で、次のページに手続きポインタな配列という形で初期化な記述があります。

4656 int (*bdevsw[])()
4657 {
4658  &nulldev, &nulldev, &rkstrategy, &rktab, /* rk */
4659  &nodev, &nodev, &nodev, 0, /* rp */

一次元配列の初期化な形になってるのかなんともアレゲ
このあたりの微妙な部分にツッコミを入れているのは止めて中身を確認。rdstrategy 手続きですが以下な部分が核心らしい。

5407    bp->av_forw = 0;
5408    spl5();
5409    if (rdtab.d_actf==0)
5410            rktab.d_actf = bp;
5411    else
5412            rktab.d_actl->av_forw = bp;
5413    rktab.d_actl = bp;

rktab は struct devtab 型ですね。ええと、d_actf 属性が NULL でなければ d_actl 属性にも何らかのオブジェクトがセットされてるのか。双方向リストってことなので一件のみだと同じソレを d_actf も d_actl も指してる形になるのか。
つうか、struct devtab と struct buf のカラミがイメージできてない。あ、ラストの前、なのか。や、次か。そうか、登録されてるオブジェクト自体は同じモノなので

先頭 - その次 - その次 - その次 - ラスト

みたいな表現ができるのか。
つうか、操作完了時に発生する割り込み処理な rdintr 手続きでリストの後始末してますね。まず先頭要素を確保しておいて

5457    bp = rktab.d_actf;

もごもごした後で次の要素を先頭にセット。

5470    rktab.d_actf = bp->av_forw;

で、iodone 手続き呼び出してます。
しかし何となくいっちゃん肝心な部分がマスクされたまま話が進んでるような気がしてなりません。別途諸々きちんと確認な方向にて。