2013-03-05 166 views
10

我目前正在爲Linux內核構建一個模塊。我的工作版本是3.8-rc3 +。我的工作使我執行一些ioctl()命令。如你所知,我的命令應該返回一個合適的錯誤代碼來描述執行過程中出錯的地方。這看起來很簡單,但我有一個用例,我不知道應該返回哪個錯誤代碼。我應該使用哪個錯誤值?

基本上,我希望用戶能夠爲給定設備設置加密密鑰。我的模塊將密鑰存儲在R-B樹中,由設備唯一標識符(一個基本的int)索引。如果「目標」設備在樹中已經有一個條目,那麼這個條目應該被更新,否則,模塊只是用請求的加密密鑰向該設備的樹添加新分配的條目。

  • 東西模塊內部可能使用用戶想要更新密鑰:模塊返回EBUSY錯誤試圖設置鍵這就是說,多件事情可能會發生。
  • 沒有輸入和分配失敗:ENOMEM錯誤。
  • 該模塊正在釋放其資源。現有的密鑰條目可能被標記爲刪除(該條目有一個標記爲dying的信號):在內部,我當前使用EPERM錯誤代碼,因爲調用者沒有「權限」來在其被銷燬時更改條目。

正如我所說的,對於後一種情況,我用EPERM錯誤代碼,但它是錯的我有一種感覺,我不知道哪個錯誤代碼,我應該使用用於這一目的。歡迎任何建議!

我還指定了linux標記,因爲ioctl()可以在用戶空間應用程序中使用。

編輯:通過評論和答案看了之後,我想我會這樣說:

  • 當模塊釋放其資源,ESHUTDOWN將被退回。
  • 當只有目標密鑰被銷燬時,其餘的 樹仍然健全,將使用EACCES
+0

你大概可以使用任何, 的#define的EACCES 13/*權限被拒絕* /#定義 14 EFAULT/*錯誤地址* /#定義 EBUSY 16/*設備或資源忙*/ – 2013-03-05 09:00:42

+0

@KinjalPatel我不能如果我想區分使用案例1和使用案例3,則使用'EBUSY'。'EFAULT'不適用,因爲該命令具有良好的參數,並且不會發生段錯誤。 'EACCES'可以做到這一點,但我也有感覺這不是它最初的目的。我對嗎 ? – Rerito 2013-03-05 09:09:17

+0

是的,EACCES通常用於用戶權限。但在你的情況下,我認爲它合適 – 2013-03-05 09:21:32

回答

3

ESHUTDOWN? (傳輸端點關閉後不能發送)

另一個選項是ENXIO(沒有這樣的設備或地址)。它不是100%準確的,因爲該設備仍然存在,但它表達了錯誤的含義(它不再可用)。

一個簡單的選擇是ENOTSUP(不支持操作),但聽起來更像是

EPERM聽起來更好,但它通常以「您沒有權限/權利要做到這一點」拿來主義「沒有實現的方法」而不是「你現在不能這樣做」。

ESTALE(陳舊文件句柄)會很好,但它與NFS相關。

+0

我錯過了'ESHUTDOWN',它非常明確,儘管描述似乎誤導了我。無論如何,我認爲這是最好的解決方案。謝謝你指出。 – Rerito 2013-03-05 12:47:48