我正在开发一个需要访问特殊 USB 设备的程序。这个 USB 设备作为文件系统中的常规文件,所以我必须用 O_DIRECT 标志打开这个文件。如下:
open(pathname, O_CREAT | O_RDWR | O_DIRECT | O_SYNC, S_IRWXU)
该程序在 PC 环境下运行良好。但是当我用 openwrt 将它移植到嵌入式板时,“open”函数返回 EINVAL 22 /* Invalid argument */.
- 在内核配置中选择了 O_DIRECT 支持。
- openwrt 的文件系统是 squashfs 和 jffs2。
- USB 设备的文件系统是胖的,并且挂载在 /media/aegis 目录下。
- board的ARCH是mips。
似乎从内核中的以下函数返回了错误:
int open_check_o_direct(struct file *f)
{
/* NB: we're sure to have correct a_ops only after f_op->open */
if (f->f_flags & O_DIRECT) {
if (!f->f_mapping->a_ops ||
((!f->f_mapping->a_ops->direct_IO) &&
(!f->f_mapping->a_ops->get_xip_mem))) {
return -EINVAL;
}
}
return 0;
}
是否知道 O_DIRECT 在 jffs2 上不受支持,而在 fat 上受支持。在 /media/aegis 中对文件进行操作时,我猜测使用了 fat 的 a_ops,但程序并没有按我的预期运行。