我正在开发一个需要访问特殊USB设备的程序 . 此USB设备充当文件系统中的常规文件,因此我必须使用O_DIRECT标志打开此文件 . 如下:

open(pathname, O_CREAT | O_RDWR | O_DIRECT | O_SYNC, S_IRWXU)

该程序适用于PC环境 . 但是当我用openwrt将它移植到嵌入式主板时,“open”函数返回EINVAL 22 / 无效参数 / .

  • 在内核配置中选择了O_DIRECT支持 .

  • openwrt的文件系统是squashfs和jffs2 .

  • USB设备的文件系统很胖,并挂载在/ media / aegis目录下 .

  • 板的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;
 }

是否知道在jffs2上不支持O_DIRECT并且在fat上受支持 . 当在/ media / aegis中运行文件时,我猜使用了脂肪的a_ops,但是程序没有按照我的预期运行 .