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, но программа не запускается в моем ожидании.