現在、Linuxカーネル用のモジュールを構築しています。私の作業リビジョンは3.8-rc3+です。私の仕事は私にいくつかのioctl()
コマンドを実装するように導きました。ご存知のように、私のコマンドは、実行中に何がうまくいかなかったかを説明する適切なエラーコードを返す必要があります。これは非常に単純に思えますが、どのエラーコードを返す必要があるのかわからないユースケースがあります。
基本的に、ユーザーが特定のデバイスに暗号化キーを設定できるようにする必要があります。私のモジュールは、デバイスの一意の識別子(基本int
)によってインデックス付けされたRBツリーにキーを格納します。「ターゲット」デバイスがすでにツリーにエントリを持っている場合は、このエントリを更新する必要があります。そうでない場合、モジュールは、要求された暗号化キーを使用して、そのデバイスのツリーに新しく割り当てられたエントリを追加するだけです。とはいえ、キーを設定しようとすると、複数のことが発生する可能性があります。
- モジュール内の何かが、ユーザーが更新したい暗号化キーを使用している可能性があります。モジュールは
EBUSY
エラーを返します。 - エントリがなく、割り当てに失敗しました:
ENOMEM
エラー。 - モジュールはそのリソースを解放しています。既存のキーエントリに削除のマークが付けられている可能性があります(エントリには
dying
これを通知するフラグがあります):内部的には現在EPERM
エラーコードを使用しています。これは、呼び出し元がエントリの破棄中にエントリを変更する「許可」を持っていないためです。
私が言ったように、後者の場合、私はEPERM
エラーコードを使用しますが、それは間違っていると感じており、その目的のためにどのエラーコードを使用すべきかわかりません。どんなアドバイスも大歓迎です!
ioctl()
また、ユーザースペースアプリケーション内で使用できるLinuxタグも指定しました。
編集:コメントと回答を読んだ後、私はそれをこのようにするだろうと思います:
- モジュールがリソースを解放しているときに、
ESHUTDOWN
が返されます。 - ターゲットキーのみが破棄され、ツリーの残りの部分がまだ正常である場合は、
EACCES
が使用されます。