]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/scsi/qla2xxx/qla_os.c
Merge rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[linux-2.6-omap-h63xx.git] / drivers / scsi / qla2xxx / qla_os.c
index 495ccbc7f8cbd1f3dcb42351b20329c96de4c974..9f91f1a20542cde30379643072d127cc873a9c6a 100644 (file)
@@ -366,6 +366,12 @@ qla2x00_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
                goto qc_fail_command;
        }
 
+       /* Close window on fcport/rport state-transitioning. */
+       if (!*(fc_port_t **)rport->dd_data) {
+               cmd->result = DID_IMM_RETRY << 16;
+               goto qc_fail_command;
+       }
+
        if (atomic_read(&fcport->state) != FCS_ONLINE) {
                if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
                    atomic_read(&ha->loop_state) == LOOP_DEAD) {
@@ -421,6 +427,12 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
                goto qc24_fail_command;
        }
 
+       /* Close window on fcport/rport state-transitioning. */
+       if (!*(fc_port_t **)rport->dd_data) {
+               cmd->result = DID_IMM_RETRY << 16;
+               goto qc24_fail_command;
+       }
+
        if (atomic_read(&fcport->state) != FCS_ONLINE) {
                if (atomic_read(&fcport->state) == FCS_DEVICE_DEAD ||
                    atomic_read(&ha->loop_state) == LOOP_DEAD) {
@@ -1271,9 +1283,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
        fc_port_t *fcport;
        struct scsi_host_template *sht;
 
-if (PCI_FUNC(pdev->devfn))
-       goto probe_out;
-
        if (pci_enable_device(pdev))
                goto probe_out;
 
@@ -1675,11 +1684,13 @@ qla2x00_schedule_rport_del(struct scsi_qla_host *ha, fc_port_t *fcport,
                spin_lock_irqsave(&fcport->rport_lock, flags);
                fcport->drport = rport;
                fcport->rport = NULL;
+               *(fc_port_t **)rport->dd_data = NULL;
                spin_unlock_irqrestore(&fcport->rport_lock, flags);
                set_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags);
        } else {
                spin_lock_irqsave(&fcport->rport_lock, flags);
                fcport->rport = NULL;
+               *(fc_port_t **)rport->dd_data = NULL;
                spin_unlock_irqrestore(&fcport->rport_lock, flags);
                fc_remote_port_delete(rport);
        }