[linux-users: 108999] カーネルスレッド内からのSCSI Genericデバイスの呼び出しについて

harrier @ mwe.biglobe.ne.jp harrier @ mwe.biglobe.ne.jp
2015年 12月 24日 (木) 12:24:20 JST


中村@川崎です。

ここ1週間以上ハマってしまってどうにも良くわからない事があります。

自作のカーネルモジュールの中からSCSI Genericデバイスを使用するため、
filp_open()で/dev/sgデバイスをオープンし、unlocked_ioctlハンドラを
ダイレクトに呼び出すようにしてみました(set_fs()はしています)。
試しとしてREAD CAPACITYを行ってみました。

しかし、モジュールの初期化処理から実行した場合は期待した通りの動作をするものの、
カーネルスレッドを作成し、その中から呼び出すと期待した結果が得られません。
ioctlは正常に完了しているにも関わらず、8バイトの出力バッファにデータが書き込まれない状況です。

添付のソースを実行した場合のカーネルバッファの出力は以下のような状態でした

[ 6425.278652] intr module init              <-- insmod実行
[ 6425.278657] read_capacity start:0         <-- 初期化処理から呼び出し
[ 6425.278676] buff:ffff8800cd6c7be6
[ 6425.278737] 3A 38 60 2F 00 00 02 00       <-- 期待した結果が得られた
[ 6425.278739] ret = 0
[ 6425.278740] read_capacity done:0
[ 6425.281906] [sample] sample_thread start
[ 6425.281911] read_capacity start:1         <-- スレッドの頭で実行
[ 6425.281933] buff:ffff8800da6d3df6
[ 6425.281974] E5 E5 E5 E5 E5 E5 E5 E5       <-- E5で初期化したまま書き込まれてない
[ 6425.281976] ret = 0
[ 6425.281978] read_capacity done:1
[ 6432.132685] intr module exit              <-- rmmod実行
[ 6432.132705] read_capacity start:2         <-- スレッドの終了時に実行
[ 6432.132728] buff:ffff8800da6d3df6
[ 6432.132789] E5 E5 E5 E5 E5 E5 E5 E5       <-- 同じく書き込まれない
[ 6432.132791] ret = 0
[ 6432.132794] read_capacity done:2
[ 6432.132795] [sample] sample_thread exit

色々調べてみたのですが、SCSIコマンドとしては正常にデバイスに送られ、
正しい結果をホストに返してきているようです。
ですが、なぜか出力バッファに書き込まれていないようで。

カーネルスレッドから呼び出すにあたって何か足りない手続きがあるのでしょうか?

環境は
Ubuntu 15.04
Kernel 4.2.0-22-generic x86_64
です。


--
Takahiro Nakamura
harrier @ mwe.biglobe.ne.jp
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: sample_drv.c
型:         text/x-csrc
サイズ:     5860 バイト
説明:       無し
URL:        <http://listserv.linux.or.jp/pipermail/linux-users/attachments/20151224/a137b188/attachment-0001.c>


linux-users メーリングリストの案内