2013-03-05 165 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