我应该使用哪个错误值?

时间:2013-03-05 08:30:43

标签: c linux error-handling linux-kernel

我目前正在为Linux内核构建一个模块。我的工作版本是3.8-rc3 +。我的工作引导我实现一些ioctl()命令。如您所知,我的命令应该返回一个适当的错误代码来描述执行过程中出错的地方。这看起来很简单,但我有一个用例,我无法弄清楚应该返回哪个错误代码。

基本上,我希望用户能够为给定设备设置加密密钥。我的模块将密钥存储在R-B树中,由设备唯一标识符(基本int)索引。如果“目标”设备已经在树中具有条目,则应该更新该条目,否则,模块仅使用所请求的加密密钥将新分配的条目添加到该设备的树。也就是说,尝试设置密钥时会发生多种情况:

  • 模块内部的某些内容可能正在使用用户想要更新的加密密钥:模块返回EBUSY错误。
  • 没有输入和分配失败:ENOMEM错误。
  • 该模块正在释放其资源。可以将现有密钥条目标记为删除(条目具有dying标志以表示此信号):内部我当前使用EPERM错误代码,因为调用者没有“权限”来更改条目正在被摧毁。

正如我所说,对于后一种情况,我使用EPERM错误代码,但我感觉这是错误的,我不知道我应该为此目的使用哪个错误代码。欢迎任何建议!

我还指定了linux标记,因为ioctl()可以在用户空间应用程序中使用。

编辑:在阅读了评论和答案之后,我想我会这样做:

  • 当模块释放其资源时,将返回ESHUTDOWN
  • 当只有目标键被销毁时,其余部分被销毁 树仍然是理智的,EACCES将被使用。

1 个答案:

答案 0 :(得分:3)

ESHUTDOWN怎么样? (传输端点关闭后无法发送)

另一个选项是ENXIO(没有此类设备或地址)。它不是100%准确,因为设备仍在那里,但它传达了错误的含义(它不再可用)。

一个简单的选择是ENOTSUP(不支持操作)但听起来更像是“未实施的方法”

EPERM听起来更好,但它通常用于“你没有这样做的权限/权利”,而不是“你现在不能这样做”。

ESTALE(过时的文件句柄)会很好,但它与NFS有关。