LINUX.ORG.RU

Как вызвать IOCTL из пространства ядра в ядре линукс версии 5.10?

 , , ,


0

2

Обработчик IOCTL моего драйвера перенаправляет IOCTL запросы другому драйверу. Это прекрасно работало, но когда понадобилось добавить поддержку ядра 5.10, выяснилось, что старый способ больше не работает. Как теперь это можно провернуть?

    #define TARGET_ID "TGT"
    // ...
    char id[sizeof(TARGET_ID)];
    // ...
    mm_segment_t old_fs = get_fs();
    set_fs(KERNEL_DS);
    res = __blkdev_driver_ioctl(dev->bdev_raw, 0, SCSI_IOCTL_TARGET_ID, (unsigned long)id);
    set_fs(old_fs);

    if(0 == strcmp(id, TARGET_ID))
    {
        PINFO("*** target driver detected! ***\n");
        dev->is_target_driver = true;
    }
    else
    {
        ...

Ура! Ура! Ура! Вот так теперь работает:

    #define TARGET_ID "TGT"
    // ...
    char id[sizeof(TARGET_ID)];
    // ...
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 4)
    mm_segment_t old_fs = force_uaccess_begin();
    res = __blkdev_driver_ioctl(dev->bdev_raw, 0, SCSI_IOCTL_TARGET_ID, (unsigned long)id);
    force_uaccess_end(old_fs);
#else
    mm_segment_t old_fs = get_fs();
    set_fs(KERNEL_DS);
    res = __blkdev_driver_ioctl(dev->bdev_raw, 0, SCSI_IOCTL_TARGET_ID, (unsigned long)id);
    set_fs(old_fs);
#endif
    
    if(0 == strcmp(id, TARGET_ID))
    {
        PINFO("*** target driver detected! ***\n");
        dev->is_target_driver = true;
    }
    else
    {
        ...
zenbooster
() автор топика
Ответ на: комментарий от kto_tama

Вот за что я его не люблю - его пихают во все щели, даже туда, где более прямое средство есть.

mv ★★★★★
()

а совсем без set_fs в новых ядрах не работает?

тут они уже простые «заглушки», если CONFIG_SET_FS не стоит:
https://elixir.bootlin.com/linux/latest/source/include/linux/uaccess.h#L19

и вот пример: https://github.com/RinCat/RTL88x2BU-Linux-Driver/commit/64d833c13d51e0814a25a...

p.s. хотя, https://lore.kernel.org/lkml/20200710135706.537715-7-hch@lst.de/

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 1)
Ответ на: комментарий от mv

О более прямом средстве надо знать, и вообще думать надо. ebpf так люб потому, что в любой непонятной ситуации просто берем и фигачим код.

ТС: Вопрос о set_fs() – это невероятно старый, уже классический баян.

i586 ★★★★★
()
Последнее исправление: i586 (всего исправлений: 1)
23 декабря 2022 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.