如何找到块设备的 scsi_host_template 函数?
How to find the scsi_host_template functions for a block device?
我正在查看 Linux 内核的 IO 路径,在函数 scsi_dispatch_cmd()
的底部,调用了驱动程序代码
rtn = host->hostt->queuecommand(host, cmd);
所以,对于像 /dev/sda/
这样的块设备,有没有办法找出它正在使用的 hostt
或 scsi_host_template
。我想检查 queuecommand
指向哪个函数..
作为对这个问题的思考草图。
在我的 USB 驱动器机器中,我可以看到:
$ ls -l /dev/sdg
brw-rw---- 1 root disk 8, 96 Apr 27 01:21 /dev/sdg
$ ll /sys/dev/block/8\:96/device/drive
lrwxrwxrwx 1 root root 0 Apr 27 01:32 /sys/dev/block/8:96/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
所以通常这样的块设备是通过常规 Linux scsi disk driver 处理的。这与例如有关USB 处理:
$ lsmod | grep sd
sd_mod 49152 13
scsi_mod 225280 5 sd_mod,usb_storage,libata,uas,sg
在这种特殊情况下,我们可以看到 queuecommand 和提到的驱动器之间的关系:
$ grep queuecommand /proc/kallsyms
ffffffffc052be60 t uas_queuecommand [uas]
ffffffffc0582ad0 t queuecommand [usb_storage]
现在,在 Linux 源目录中:
$ grep -rnI '\.queuecommand =' | grep usb
drivers/usb/storage/uas.c:846: .queuecommand = uas_queuecommand,
drivers/usb/storage/scsiglue.c:609: .queuecommand = queuecommand,
希望对您有所帮助。
我正在查看 Linux 内核的 IO 路径,在函数 scsi_dispatch_cmd()
的底部,调用了驱动程序代码
rtn = host->hostt->queuecommand(host, cmd);
所以,对于像 /dev/sda/
这样的块设备,有没有办法找出它正在使用的 hostt
或 scsi_host_template
。我想检查 queuecommand
指向哪个函数..
作为对这个问题的思考草图。
在我的 USB 驱动器机器中,我可以看到:
$ ls -l /dev/sdg
brw-rw---- 1 root disk 8, 96 Apr 27 01:21 /dev/sdg
$ ll /sys/dev/block/8\:96/device/drive
lrwxrwxrwx 1 root root 0 Apr 27 01:32 /sys/dev/block/8:96/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
所以通常这样的块设备是通过常规 Linux scsi disk driver 处理的。这与例如有关USB 处理:
$ lsmod | grep sd
sd_mod 49152 13
scsi_mod 225280 5 sd_mod,usb_storage,libata,uas,sg
在这种特殊情况下,我们可以看到 queuecommand 和提到的驱动器之间的关系:
$ grep queuecommand /proc/kallsyms
ffffffffc052be60 t uas_queuecommand [uas]
ffffffffc0582ad0 t queuecommand [usb_storage]
现在,在 Linux 源目录中:
$ grep -rnI '\.queuecommand =' | grep usb
drivers/usb/storage/uas.c:846: .queuecommand = uas_queuecommand,
drivers/usb/storage/scsiglue.c:609: .queuecommand = queuecommand,
希望对您有所帮助。