首页 > 解决方案 > 如何找到块设备的 scsi_host_template 函数?

问题描述

我正在查看 Linux 内核的 IO 路径,在函数的底部,scsi_dispatch_cmd()调用了驱动程序代码

rtn = host->hostt->queuecommand(host, cmd);

所以,对于我的块设备/dev/sda/,有没有办法找出它正在使用哪个hosttscsi_host_template它正在使用。我想检查哪个函数queuecommand指向..

标签: clinuxlinux-kernellinux-device-driverscsi

解决方案


就像对这个主题的反思一样。
在我的 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 磁盘驱动程序处理的。这与例如 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,

希望这会帮助你。


推荐阅读