[英]How to call ioctl from kernel space in Linux kernel 5.10?
我的驅動程序的 IOCTL 處理程序將 IOCTL 請求重定向到另一個驅動程序。 這曾經很好用,但是當我需要添加對 5.10 kernel 的支持時,原來舊的方法不再起作用了。 現在怎么辦?
#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
{
...
好像 force_uaccess_begin() 不能代替 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_begin在linux 5.18之后都被去掉了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.