SCSI设备的扫描时由scsi host发起的,由函数scsi_scan_host()实现,最终生成scsi device( SCSI层SCSI 设备是由结构体scsi_device表示,它一般代表一块真实的硬盘,也可能代表虚拟的硬盘)。在SCSI upper layer注册了scsi driver(见drivers/scsi/sd.c),根据设备驱动模型,最终匹配触发SCSI 设备的识别。下面对这三个过程分别作详细的描述。
1. SCSI层总线驱动模型
我们知道linux的总线设备驱动模型:总线定义驱动和设备的方式,当驱动和设备匹配是会触发驱动定义的probe()函数。如果先产生设备,当驱动加载时会触发驱动定义的probe()函数;如果先产生驱动,当设备生成时会触发驱动定义的probe()函数。
在SCSI层同样定义了SCSI总线/SCSI设备/SCSI驱动,默认注册了SCSI driver,一旦生成SCSI device时,会执行SCSI driver的probe()函数。其中SCSI总线定义为scsi_bus_type,通过函数bus_register()注册该总线。

如上图所示,这里以hisi_sas驱动为例,描述了扫盘的过程。首先SAS作为PCIE设备在PCIE的设备扫描中被识别,而hisi_sas驱动作为PCIE驱动加载时匹配触发hisi_sas_probe()函数,经过重重过程,最终会生成SCSI device(此过程为SCSI device的扫描)。而在系统初始化过程中定义SCSI bus并加载scsi driver,因此会在生成SCSI device时执行sd_probe()去识别硬盘的信息(此过程为硬盘的识别)。
2. SCSI device的扫描
SCSI设备的扫描是由底层驱动调用函数scsi_scan_host()发起。这里存在同步扫描和异步扫描:同步扫描为一个SCSI host完成扫描后再进行下一个SCSI host的扫描;异步为多个SCSI host同时进行扫描。具体可通过配置SCSI_SCAN_TYPE_DEFAULT定义。但无论是同步还是异步最终会调用函数do_scsi_scan_host()来扫描SCSI device的主要工作。
若驱动自定义扫描函数(定义shost->hostt->scan_start()和shost->hostt->scan_finished()),采用驱动自定义的扫描方式。驱动hisi_sas就是采用自定义扫描方式,但最终仍会调用到函数__scsi_scan_target(),最终主要的过程与非自定义扫描函数过程一致(后面在LIBSAS驱动分析时在介绍)。
若没有自定义扫描函数时,对SCSI host所有通道进行扫描。每个SCSI device由host /channel/starget/lun组成。首先分配scsi target,然后调用函数scsi_probe_and_add_lun()扫描通道,分配SCSI device,并添加scsi device。过程如下:

这里又可以分为三个部分:
(1)分配SCSI device
分配SCSI device由函数scsi_alloc_sdev()执行,除了分配SCSI device外,它会分配对应的request-queue,并对其进行设置(在每个CPU上分配percpu的ctx,关联到q,设置超时work回调,若当前q的nr_hw_queues硬件队列与set不符时,重新调整hctx,并重新做ctx到hctx的映射)。

(2)扫描SCSI device
扫描SCSI device由函数scsi_probe_lun()执行,它主要是发送SCSI命令INQUIRY,获取硬盘INQUIRY相关信息。扫描SCSI device以及识别硬盘过程中的SCSI命令称为passthrough IO,后续专门章节介绍。
(3)添加SCSI device
扫描到SCSI device后需要将SCSI device添加到系统中,只有添加到系统中,才会与scsi driver匹配触发硬盘的识别。这个过程比较简单,主要通过函数scsi_add_lun()实现,而scsi_add_lun()则最终调用device_add(sdev->sdev_gendev)和transport_add_device(sdev->sdev_gendev)将SCSI device添加到系统中。
本文详细解析了Linux内核中SCSI设备的扫描过程,包括SCSI总线驱动模型、SCSIdevice的扫描机制,以及如何通过自定义或默认方式识别硬盘。重点介绍了SCSIdevice的分配、扫描和添加流程,以及hisi_sas驱动的实例应用。
SCSI设备的管理1&spm=1001.2101.3001.5002&articleId=121664683&d=1&t=3&u=f153c0bb95a64b49958b6b9598ade045)
7839

被折叠的 条评论
为什么被折叠?



