diff options
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 35 | ||||
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 1 | ||||
| -rw-r--r-- | drivers/target/target_core_iblock.c | 2 | 
3 files changed, 19 insertions, 19 deletions
| diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index d190db5ea7d9..1d9a4866f9a7 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -3732,6 +3732,13 @@ qla2x00_remove_one(struct pci_dev *pdev)  	}  	qla2x00_wait_for_hba_ready(base_vha); +	/* +	 * if UNLOADING flag is already set, then continue unload, +	 * where it was set first. +	 */ +	if (test_and_set_bit(UNLOADING, &base_vha->dpc_flags)) +		return; +  	if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha) ||  	    IS_QLA28XX(ha)) {  		if (ha->flags.fw_started) @@ -3750,15 +3757,6 @@ qla2x00_remove_one(struct pci_dev *pdev)  	qla2x00_wait_for_sess_deletion(base_vha); -	/* -	 * if UNLOAD flag is already set, then continue unload, -	 * where it was set first. -	 */ -	if (test_bit(UNLOADING, &base_vha->dpc_flags)) -		return; - -	set_bit(UNLOADING, &base_vha->dpc_flags); -  	qla_nvme_delete(base_vha);  	dma_free_coherent(&ha->pdev->dev, @@ -4864,6 +4862,9 @@ qla2x00_alloc_work(struct scsi_qla_host *vha, enum qla_work_type type)  	struct qla_work_evt *e;  	uint8_t bail; +	if (test_bit(UNLOADING, &vha->dpc_flags)) +		return NULL; +  	QLA_VHA_MARK_BUSY(vha, bail);  	if (bail)  		return NULL; @@ -6628,13 +6629,6 @@ qla2x00_disable_board_on_pci_error(struct work_struct *work)  	struct pci_dev *pdev = ha->pdev;  	scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); -	/* -	 * if UNLOAD flag is already set, then continue unload, -	 * where it was set first. -	 */ -	if (test_bit(UNLOADING, &base_vha->dpc_flags)) -		return; -  	ql_log(ql_log_warn, base_vha, 0x015b,  	    "Disabling adapter.\n"); @@ -6645,9 +6639,14 @@ qla2x00_disable_board_on_pci_error(struct work_struct *work)  		return;  	} -	qla2x00_wait_for_sess_deletion(base_vha); +	/* +	 * if UNLOADING flag is already set, then continue unload, +	 * where it was set first. +	 */ +	if (test_and_set_bit(UNLOADING, &base_vha->dpc_flags)) +		return; -	set_bit(UNLOADING, &base_vha->dpc_flags); +	qla2x00_wait_for_sess_deletion(base_vha);  	qla2x00_delete_all_vps(ha, base_vha); diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 47835c4b4ee0..06c260f6cdae 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -2284,6 +2284,7 @@ scsi_device_set_state(struct scsi_device *sdev, enum scsi_device_state state)  		switch (oldstate) {  		case SDEV_RUNNING:  		case SDEV_CREATED_BLOCK: +		case SDEV_QUIESCE:  		case SDEV_OFFLINE:  			break;  		default: diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 51ffd5c002de..1c181d31f4c8 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -432,7 +432,7 @@ iblock_execute_zero_out(struct block_device *bdev, struct se_cmd *cmd)  				target_to_linux_sector(dev, cmd->t_task_lba),  				target_to_linux_sector(dev,  					sbc_get_write_same_sectors(cmd)), -				GFP_KERNEL, false); +				GFP_KERNEL, BLKDEV_ZERO_NOUNMAP);  	if (ret)  		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 
