2016-12-19 7 views
1

Linux 호스트에서 호스트 버스 스캔을 실행하여 호스트에서/dev/sd * 장치를 가져올 수 있습니다.
스캔이 명령을 사용하여 발행 :
에코 "- - -">/SYS/클래스/scsi_host/host0/스캔

누군가가 나에게 리눅스 사용자 공간/커널 코드의 이벤트 흐름을 알려 주시기 바랍니다 수있는/dev/sd * 장치가 scsi 스캔을 게시하도록 유도합니까?

스토리지 컨트롤러에 보낸 PCI 버스 스캔 또는 SCSI 명령입니까? 아니면 새로운 것입니까?Linux에서 재검색 LUN 작동 방법

답변

1

iscsid 스캔 작동 방식을 코드로 살펴 보았습니다. __scsi_scan_target은 SCSI 검사를 수행하는 주요 기능입니다. 이 기능은 먼저 scsi_probe_and_add_lun 기능을 사용하여 LUN 0을 검사하고 추가하려고 시도합니다.

Dec 24 03:24:28 localhost kernel: [<ffffffff813e8c94>] scsi_probe_and_add_lun+0x3f4/0xc80 
Dec 24 03:24:28 localhost kernel: [<ffffffff815e5a51>] ? printk+0x77/0x8e 
Dec 24 03:24:28 localhost kernel: [<ffffffff813e9a0e>] __scsi_scan_target+0x13e/0x270 
Dec 24 03:24:28 localhost kernel: [<ffffffff813e9c30>] scsi_scan_target+0xf0/0x110 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050eedf>] iscsi_user_scan_session.part.13+0x10f/0x150 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef20>] ? iscsi_user_scan_session.part.13+0x150/0x150 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef41>] iscsi_user_scan_session+0x21/0x30 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b1b63>] device_for_each_child+0x53/0x90 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050cb6c>] iscsi_user_scan+0x3c/0x60 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffff813eb835>] store_scan+0xa5/0x100 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b1138>] dev_attr_store+0x18/0x30 
Dec 24 03:24:28 localhost kernel: [<ffffffff81225686>] sysfs_write_file+0xc6/0x140 
Dec 24 03:24:28 localhost kernel: [<ffffffff811afa7d>] vfs_write+0xbd/0x1e0 
Dec 24 03:24:28 localhost kernel: [<ffffffff811b04c8>] SyS_write+0x58/0xb0 
Dec 24 03:24:28 localhost kernel: [<ffffffff815fc9d9>] system_call_fastpath+0x16/0x1b 



scsi_probe_and_add_lun 함수 것이다
1. scsi_device 데이터 구조
2 호 scsi_probe_lun 할당하고 scsi_device 채우기 위해 0
3. 통화 scsi_add_lun에게 LUN에를 SCSI 문의를 보내 데이터 구조가 완료되었습니다.
이 데이터 구조는 scsi_sysfs_add_sdev 기능을 사용하여 추가됩니다.

는 그 다음 기능 scsi_report_lun_scan에 LUNS의 수를 얻을 수 SCSI 보고서 LUN 명령을 보내려고합니다. 이 기능은 LUN 수를 찾고 scsi_probe_and_add_lun 기능을 사용하여 모든 LUN을 다시 추가하려고 시도합니다.

scsi_sysfs_add_sdev scsi_target_add 함수를 호출하여 device_add scsi_device위한 장치를 추가한다.

Dec 24 03:24:28 localhost kernel: [<ffffffffa01d77d0>] sd_probe+0x320/0x380 [sd_mod] 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b6917>] driver_probe_device+0x87/0x390 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b6c20>] ? driver_probe_device+0x390/0x390 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b6c5b>] __device_attach+0x3b/0x40 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b477b>] bus_for_each_drv+0x6b/0xb0 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b6818>] device_attach+0x88/0xa0 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b5b18>] bus_probe_device+0x98/0xc0 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b3584>] device_add+0x4c4/0x7a0 
Dec 24 03:24:28 localhost kernel: [<ffffffff813c2ebc>] ? __pm_runtime_resume+0x5c/0x80 
Dec 24 03:24:28 localhost kernel: [<ffffffff813eba9c>] scsi_sysfs_add_sdev+0xac/0x320 
Dec 24 03:24:28 localhost kernel: [<ffffffff813e9317>] scsi_probe_and_add_lun+0xa77/0xc80 
Dec 24 03:24:28 localhost kernel: [<ffffffff815eceff>] scsi_report_lun_scan+0x39a/0x5f1 
Dec 24 03:24:28 localhost kernel: [<ffffffff813e9a24>] __scsi_scan_target+0x154/0x270 
Dec 24 03:24:28 localhost kernel: [<ffffffff813e9c30>] scsi_scan_target+0xf0/0x110 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050eedf>] iscsi_user_scan_session.part.13+0x10f/0x150 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef20>] ? iscsi_user_scan_session.part.13+0x150/0x150 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef41>] iscsi_user_scan_session+0x21/0x30 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b1b63>] device_for_each_child+0x53/0x90 
Dec 24 03:24:28 localhost kernel: [<ffffffffa050cb6c>] iscsi_user_scan+0x3c/0x60 [scsi_transport_iscsi] 
Dec 24 03:24:28 localhost kernel: [<ffffffff813eb835>] store_scan+0xa5/0x100 
Dec 24 03:24:28 localhost kernel: [<ffffffff813b1138>] dev_attr_store+0x18/0x30 
Dec 24 03:24:28 localhost kernel: [<ffffffff81225686>] sysfs_write_file+0xc6/0x140 
Dec 24 03:24:28 localhost kernel: [<ffffffff811afa7d>] vfs_write+0xbd/0x1e0 
Dec 24 03:24:28 localhost kernel: [<ffffffff811b04c8>] SyS_write+0x58/0xb0 
Dec 24 03:24:28 localhost kernel: [<ffffffff815fc9d9>] system_call_fastpath+0x16/0x1b 

리눅스 3.14.69 드라이버 \ \ SCSI의 \의 sd.c이

이 sd_probe 기능은 디스크 및 출시를 할당 :

이 device_add은 (sd_probe가)드라이버 '프로브 함수를 호출 스레드 sd_probe_async. add_disk를 호출하고 메시지를 출력

async_schedule_domain(sd_probe_async, sdkp, &scsi_sd_probe_domain); 

sd_probe_async : "연결 SCSI %의 sdisk"

블로그에
+0

넣어 같은 정보 : http://sklinuxblog.blogspot.in/2017/01/ scsi-user-scan-scsi-device-addition.html –