0

我正在开发一个需要访问特殊 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,但程序并没有按我的预期运行。

4

0 回答 0