提交 6b383979 编写于 作者: J Joe Lawrence 提交者: Christoph Hellwig

qla2xxx: Prevent probe and board_disable race

The PCI register read checking introduced in commit fe1b806f
("qla2xxx: Disable adapter when we encounter a PCI disconnect") is
active during driver probe. Hold off scheduling any board removal until
the driver probe has completed. This ensures that the the board_disable
work structure is initialized and more importantly, avoids racing
qla2x00_probe_one.
Signed-off-by: NJoe Lawrence <joe.lawrence@stratus.com>
Acked-by: NChad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: NChristoph Hellwig <hch@lst.de>
上级 beb9e315
...@@ -3405,6 +3405,7 @@ typedef struct scsi_qla_host { ...@@ -3405,6 +3405,7 @@ typedef struct scsi_qla_host {
unsigned long pci_flags; unsigned long pci_flags;
#define PFLG_DISCONNECTED 0 /* PCI device removed */ #define PFLG_DISCONNECTED 0 /* PCI device removed */
#define PFLG_DRIVER_REMOVING 1 /* PCI driver .remove */ #define PFLG_DRIVER_REMOVING 1 /* PCI driver .remove */
#define PFLG_DRIVER_PROBING 2 /* PCI driver .probe */
uint32_t device_flags; uint32_t device_flags;
#define SWITCH_FOUND BIT_0 #define SWITCH_FOUND BIT_0
......
...@@ -118,7 +118,8 @@ qla2x00_check_reg32_for_disconnect(scsi_qla_host_t *vha, uint32_t reg) ...@@ -118,7 +118,8 @@ qla2x00_check_reg32_for_disconnect(scsi_qla_host_t *vha, uint32_t reg)
/* Check for PCI disconnection */ /* Check for PCI disconnection */
if (reg == 0xffffffff) { if (reg == 0xffffffff) {
if (!test_and_set_bit(PFLG_DISCONNECTED, &vha->pci_flags) && if (!test_and_set_bit(PFLG_DISCONNECTED, &vha->pci_flags) &&
!test_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags)) { !test_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags) &&
!test_bit(PFLG_DRIVER_PROBING, &vha->pci_flags)) {
/* /*
* Schedule this (only once) on the default system * Schedule this (only once) on the default system
* workqueue so that all the adapter workqueues and the * workqueue so that all the adapter workqueues and the
......
...@@ -2632,6 +2632,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2632,6 +2632,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
} }
pci_set_drvdata(pdev, base_vha); pci_set_drvdata(pdev, base_vha);
set_bit(PFLG_DRIVER_PROBING, &base_vha->pci_flags);
host = base_vha->host; host = base_vha->host;
base_vha->req = req; base_vha->req = req;
...@@ -2928,6 +2929,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2928,6 +2929,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
qlt_add_target(ha, base_vha); qlt_add_target(ha, base_vha);
clear_bit(PFLG_DRIVER_PROBING, &base_vha->pci_flags);
return 0; return 0;
probe_init_failed: probe_init_failed:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册