中断上下文调用filp_open
2024-10-31 18:10:36
问题的背景是在一段驱动代码中,调用了filp_open。
发现在某些场景下返回了-EACCES。
尝试过以下办法,均未奏效:
- 修改文件的所有者,并且设置mod为777
- 关闭selinux
通过GDB单点跟踪,最后发现filp_open会调用may_lookup,6.1版本的内核源码如下:
1 | static inline int may_lookup(struct user_namespace *mnt_userns, |
在这一步里,会去检查filp_open是否会阻塞当前调用(MAY_NOT_BLOCK),如果是单线程,则返回-ECHILD,可以确认不会阻塞;如果是多线程,则返回-EACCES。
而我使用该接口的场景是soft interrupt,众所周知,interrupt上下文是不能调用block api的。