10

現在、Linuxカーネル用のモジュールを構築しています。私の作業リビジョンは3.8-rc3+です。私の仕事は私にいくつかのioctl()コマンドを実装するように導きました。ご存知のように、私のコマンドは、実行中に何がうまくいかなかったかを説明する適切なエラーコードを返す必要があります。これは非常に単純に思えますが、どのエラーコードを返す必要があるのか​​わからないユースケースがあります。

基本的に、ユーザーが特定のデバイスに暗号化キーを設定できるようにする必要があります。私のモジュールは、デバイスの一意の識別子(基本int)によってインデックス付けされたRBツリーにキーを格納します。「ターゲット」デバイスがすでにツリーにエントリを持っている場合は、このエントリを更新する必要があります。そうでない場合、モジュールは、要求された暗号化キーを使用して、そのデバイスのツリーに新しく割り当てられたエントリを追加するだけです。とはいえ、キーを設定しようとすると、複数のことが発生する可能性があります。

  • モジュール内の何かが、ユーザーが更新したい暗号化キーを使用している可能性があります。モジュールはEBUSYエラーを返します。
  • エントリがなく、割り当てに失敗しました:ENOMEMエラー。
  • モジュールはそのリソースを解放しています。既存のキーエントリに削除のマークが付けられている可能性があります(エントリにはdyingこれを通知するフラグがあります):内部的には現在EPERMエラーコードを使用しています。これは、呼び出し元がエントリの破棄中にエントリを変更する「許可」を持っていないためです。

私が言ったように、後者の場合、私はEPERMエラーコードを使用しますが、それは間違っていると感じており、その目的のためにどのエラーコードを使用すべきかわかりません。どんなアドバイスも大歓迎です!

ioctl()また、ユーザースペースアプリケーション内で使用できるLinuxタグも指定しました。

編集:コメントと回答を読んだ後、私はそれをこのようにするだろうと思います:

  • モジュールがリソースを解放しているときに、ESHUTDOWNが返されます。
  • ターゲットキーのみが破棄され、ツリーの残りの部分がまだ正常である場合は、EACCESが使用されます。
4

1 に答える 1

3

どうESHUTDOWNですか?(トランスポートエンドポイントのシャットダウン後に送信できません)

別のオプションはENXIO(そのようなデバイスまたはアドレスはありません)です。デバイスはまだそこにあるため、100%正確ではありませんが、エラーの意味を伝えます(使用できなくなります)。

簡単な選択はENOTSUP(操作はサポートされていません)ですが、それは「メソッドが実装されていない」ように聞こえます

EPERM見た目は良くなりますが、通常は「現在これを行うことはできません」ではなく、「これを行うための許可/権利がありません」で使用されます。

ESTALE(古いファイルハンドル)はいいのですが、NFSに関連しています。

于 2013-03-05T12:34:57.887 に答える