テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(dm-lc report) ti->errorの扱い

初期化時のエラーチェックをもう少しまともにした方が良いかもなと思って, 他のターゲットのコードを見てみると, dm-lcとは以下の2点で違う.

  1. ti->errorというのにエラーメッセージをつっこんでる.
  2. argcのチェックをしている.

後者については, 引数長のチェックはlc-* コマンドのチェックで十分と思うが, 前者ti->errorとは何だろうか. dm_table_add_targetより

        r = tgt->type->ctr(tgt, argc, argv);
        kfree(argv);
        if (r)
                goto bad;

        t->highs[t->num_targets++] = tgt->begin + tgt->len - 1;

        if (!tgt->num_discard_bios && tgt->discards_supported)
                DMWARN("%s: %s: ignoring discards_supported because num_discard_bios is zero.",
                       dm_device_name(t->md), type);

        return 0;

 bad:
        DMERR("%s: %s: %s", dm_device_name(t->md), type, tgt->error);
        dm_put_target_type(tgt->type);
        return r;
}

単に, DMERRの実行を遅らせているだけだ. コード量の削減以外に何かあるのだろうか. ctrの実行時にDMERRを出すことが望ましくない?いや, mirror_ctrではDMERRを呼んでいる.

dm-lcでは, エラーが起こった時に, LCERRというラッパーを呼んでいる. これは, このラッパーが実行された行番号を表示する. 従って, どこで落ちたかは明白だし, 理由についてもほとんどはコードから自明, そうでない場合は自然言語を書いている. 他のターゲットは, ふいに落ちた場合, どこで落ちたのか, メッセージをgrepして推測するという糞作業になってしまうのだと思うが, dm-lcは一目瞭然である. dm-lcの方式の方がより優れているように見えるが, なぜ彼らはエラーをリターンする時に(ファイルネーム, 行番号)を表示しないのだろうか. 不思議だ. gracefullyに落ちたならdmesgは問題なくアクセス可能であり, ふつうの人は脊髄反射的にここを見るものだ.

例えば, ti->errorに何か格納する操作をマクロで包んで, ここに文字列を格納した行番号を覚えておくとかいう方式があるかも知れないが, 完全に糞である.