Здравствуйте, надеюсь кто-то сможет помочь с решением задачки. Под линукс раньше не писал, так что прощу прощения за возможные банальности.
Задача такая: есть обработчик sys_open (тот который в sys_call_table)
asmlinkage long sys_open(const char __user *filename,
int flags, int mode);
Нужно как-то определить на каком устройстве находится файл к которому происходит обращение, а именно является оно съемным (usb-flash, usb-hdd) или же несъемным. Уже несколько дней пытаюсь рыть внутри
current->fs->pwd
Единственная полезная вещь которую смог найти это
current->fs->pwd.mnt->mnt_sb->s_bdev->bd_disk->flags
в котором установлен GENHD_FL_REMOVABLE на этот же int flags можно выйти и через
...pwd->mnt_mountpoint->mnt...
и еще несколькими путями, но в первом случае получаем всегда одинаковый набор флагов, более того, одно и то же устройство, то, которое смонтировано в корень ФС (sda1 в моем случае вместо sdd, являющегося флешкой).
Во втором же случае указатель на block_device (s_bdev) внутри super_block (mnt_sb) вообще может быть null (выяснилось после нескольких падений при попытке проверки флагов).
В итоге я не смог вытащить не только тип устройства, но и вообще само устройство.
Сейчас другим способом (костыль тот еще) получаю только имя устройства, при каждом изменении mtab, вытаскиваю из него список устройств с точкой монтирования. Но и имея имя устройства вида /dev/sdd1, не могу определить является ли оно съемным или нет.
Помогите пожалуйста советом, а если бы кто подкинул алгоритм вида
1. Получаем имя устройства из current->fs->...
2. Хэндл устройства через devfs_find_handle()
3. Флаги устройства через devfs_get_flags()
4. Проверяем флаг DEVFS_FL_REMOVABLE
То я... скажу ОГРОМНОЕ человеческое спасибо.