我目前正在为 Linux 内核构建一个模块。我的工作版本是 3.8-rc3+。我的工作使我实现了一些ioctl()
命令。如您所知,我的命令应该返回适当的错误代码来描述执行过程中出了什么问题。这看起来很简单,但我有一个用例,我不知道应该返回哪个错误代码。
基本上,我希望用户能够为给定设备设置加密密钥。我的模块将密钥存储在 RB 树中,由设备唯一标识符(基本int
)索引。如果“目标”设备在树中已经有一个条目,那么应该更新这个条目,否则,模块只需将一个新分配的条目添加到该设备的树中,并带有请求的加密密钥。也就是说,尝试设置密钥时可能会发生多种情况:
- 模块内部的某些东西可能正在使用用户想要更新的加密密钥:模块返回
EBUSY
错误。 - 没有条目并且分配失败:
ENOMEM
错误。 - 该模块正在释放其资源。现有的键条目可能被标记为删除(条目有一个
dying
标志来表示这一点):在内部我目前使用EPERM
错误代码,因为调用者没有“权限”在条目被销毁时更改条目。
正如我所说,对于后一种情况,我使用EPERM
错误代码,但我感觉它是错误的,我不知道我应该为此使用哪个错误代码。欢迎任何建议!
我还指定了 linux 标签,因为它ioctl()
可以在用户空间应用程序中使用。
编辑:通读评论和答案后,我想我会这样:
- 当模块释放其资源时,
ESHUTDOWN
将被返回。 - 当只有目标键被销毁,而树的其余部分仍然正常时,
EACCES
将被使用。