O_DIRECT не может работать на openwrt?

Я разрабатываю программу, которая требует доступа к специальному USB-устройству. Это USB-устройство действует как обычный файл в файловой системе, поэтому я должен открыть этот файл с флагом O_DIRECT. Следующим образом:

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

Программа хорошо работает на ПК. Но когда я портирую его на встроенную плату с openwrt, функция "open" возвращает EINVAL 22 /* Недопустимый аргумент */.

  • Поддержка O_DIRECT выбрана в конфигурации ядра.
  • Файловая система openwrt - это squashfs и jffs2.
  • Файловая система USB-устройства толстая и смонтирована в каталоге /media/aegis.
  • АРКА доски - это мипс.

Похоже, ошибка возвращается из следующей функции в ядре:

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 и поддерживается на толстом. При работе с файлом в /media/aegis я предполагаю, что используется a_ops of fat, но программа не запускается в моем ожидании.

0 ответов

Другие вопросы по тегам