如何找到块设备的 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/ 这样的块设备,有没有办法找出它正在使用的 hosttscsi_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,

希望对您有所帮助。