如何在Linux内核5.10中从内核空间调用ioctl?

lyfkaqu1  于 2023-06-05  发布在  Linux
关注(0)|答案(2)|浏览(285)

我的驱动程序的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
{
    ...
xoefb8l8

xoefb8l81#

万岁万岁!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

#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
    {
        ...
qnzebej0

qnzebej02#

似乎force_uaccess_开始()不能替换set_fs(KERNEL_DS);下面是它的定义:

static inline mm_segment_t force_uaccess_begin(void)
{
    mm_segment_t fs = get_fs();

    set_fs(USER_DS);
    return fs;
}

而mm_segment_t、force_uaccess_开始在linux 5.18之后都被删除了。

相关问题