diff options
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/aacraid/aacraid.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/aacraid/commsup.c | 43 | ||||
| -rw-r--r-- | drivers/scsi/aacraid/linit.c | 5 | ||||
| -rw-r--r-- | drivers/scsi/aacraid/rx.c | 15 | ||||
| -rw-r--r-- | drivers/scsi/aacraid/src.c | 20 | ||||
| -rw-r--r-- | drivers/scsi/bfa/bfad_bsg.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/bfa/bfad_im.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/bfa/bfad_im.h | 10 | ||||
| -rw-r--r-- | drivers/scsi/libfc/fc_lport.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/libsas/sas_expander.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_mem.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/osd/osd_initiator.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/scsi_debugfs.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/scsi_devinfo.c | 33 | ||||
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/scsi_scan.c | 13 | ||||
| -rw-r--r-- | drivers/scsi/scsi_sysfs.c | 10 | ||||
| -rw-r--r-- | drivers/scsi/scsi_transport_spi.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/sd.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/storvsc_drv.c | 3 | ||||
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 7 | 
21 files changed, 125 insertions, 102 deletions
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 403a639574e5..d52265416da2 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h @@ -1673,6 +1673,7 @@ struct aac_dev  	struct aac_hba_map_info	hba_map[AAC_MAX_BUSES][AAC_MAX_TARGETS];  	u8			adapter_shutdown;  	u32			handle_pci_error; +	bool			init_reset;  };  #define aac_adapter_interrupt(dev) \ @@ -1724,6 +1725,7 @@ struct aac_dev  #define FIB_CONTEXT_FLAG_NATIVE_HBA		(0x00000010)  #define FIB_CONTEXT_FLAG_NATIVE_HBA_TMF	(0x00000020)  #define FIB_CONTEXT_FLAG_SCSI_CMD	(0x00000040) +#define FIB_CONTEXT_FLAG_EH_RESET	(0x00000080)  /*   *	Define the command values diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 525a652dab48..80a8cb26cdea 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c @@ -467,35 +467,6 @@ int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw  	return 0;  } -#ifdef CONFIG_EEH -static inline int aac_check_eeh_failure(struct aac_dev *dev) -{ -	/* Check for an EEH failure for the given -	 * device node. Function eeh_dev_check_failure() -	 * returns 0 if there has not been an EEH error -	 * otherwise returns a non-zero value. -	 * -	 * Need to be called before any PCI operation, -	 * i.e.,before aac_adapter_check_health() -	 */ -	struct eeh_dev *edev = pci_dev_to_eeh_dev(dev->pdev); - -	if (eeh_dev_check_failure(edev)) { -		/* The EEH mechanisms will handle this -		 * error and reset the device if -		 * necessary. -		 */ -		return 1; -	} -	return 0; -} -#else -static inline int aac_check_eeh_failure(struct aac_dev *dev) -{ -	return 0; -} -#endif -  /*   *	Define the highest level of host to adapter communication routines.   *	These routines will support host to adapter FS commuication. These @@ -701,7 +672,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,  					return -ETIMEDOUT;  				} -				if (aac_check_eeh_failure(dev)) +				if (unlikely(pci_channel_offline(dev->pdev)))  					return -EFAULT;  				if ((blink = aac_adapter_check_health(dev)) > 0) { @@ -801,7 +772,7 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback,  		spin_unlock_irqrestore(&fibptr->event_lock, flags); -		if (aac_check_eeh_failure(dev)) +		if (unlikely(pci_channel_offline(dev->pdev)))  			return -EFAULT;  		fibptr->flags |= FIB_CONTEXT_FLAG_WAIT; @@ -1583,6 +1554,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)  	 * will ensure that i/o is queisced and the card is flushed in that  	 * case.  	 */ +	aac_free_irq(aac);  	aac_fib_map_free(aac);  	dma_free_coherent(&aac->pdev->dev, aac->comm_size, aac->comm_addr,  			  aac->comm_phys); @@ -1590,7 +1562,6 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)  	aac->comm_phys = 0;  	kfree(aac->queues);  	aac->queues = NULL; -	aac_free_irq(aac);  	kfree(aac->fsa_dev);  	aac->fsa_dev = NULL; @@ -2511,8 +2482,8 @@ int aac_command_thread(void *data)  			/* Synchronize our watches */  			if (((NSEC_PER_SEC - (NSEC_PER_SEC / HZ)) > now.tv_nsec)  			 && (now.tv_nsec > (NSEC_PER_SEC / HZ))) -				difference = (((NSEC_PER_SEC - now.tv_nsec) * HZ) -				  + NSEC_PER_SEC / 2) / NSEC_PER_SEC; +				difference = HZ + HZ / 2 - +					     now.tv_nsec / (NSEC_PER_SEC / HZ);  			else {  				if (now.tv_nsec > NSEC_PER_SEC / 2)  					++now.tv_sec; @@ -2536,6 +2507,10 @@ int aac_command_thread(void *data)  		if (kthread_should_stop())  			break; +		/* +		 * we probably want usleep_range() here instead of the +		 * jiffies computation +		 */  		schedule_timeout(difference);  		if (kthread_should_stop()) diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index c9252b138c1f..d55332de08f9 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -1037,7 +1037,7 @@ static int aac_eh_bus_reset(struct scsi_cmnd* cmd)  			info = &aac->hba_map[bus][cid];  			if (bus >= AAC_MAX_BUSES || cid >= AAC_MAX_TARGETS ||  			    info->devtype != AAC_DEVTYPE_NATIVE_RAW) { -				fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT; +				fib->flags |= FIB_CONTEXT_FLAG_EH_RESET;  				cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;  			}  		} @@ -1680,6 +1680,9 @@ static int aac_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)  	aac->cardtype = index;  	INIT_LIST_HEAD(&aac->entry); +	if (aac_reset_devices || reset_devices) +		aac->init_reset = true; +  	aac->fibs = kzalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL);  	if (!aac->fibs)  		goto out_free_host; diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c index 93ef7c37e568..620166694171 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c @@ -561,11 +561,16 @@ int _aac_rx_init(struct aac_dev *dev)  	dev->a_ops.adapter_sync_cmd = rx_sync_cmd;  	dev->a_ops.adapter_enable_int = aac_rx_disable_interrupt;  	dev->OIMR = status = rx_readb (dev, MUnit.OIMR); -	if ((((status & 0x0c) != 0x0c) || aac_reset_devices || reset_devices) && -	  !aac_rx_restart_adapter(dev, 0, IOP_HWSOFT_RESET)) -		/* Make sure the Hardware FIFO is empty */ -		while ((++restart < 512) && -		  (rx_readl(dev, MUnit.OutboundQueue) != 0xFFFFFFFFL)); + +	if (((status & 0x0c) != 0x0c) || dev->init_reset) { +		dev->init_reset = false; +		if (!aac_rx_restart_adapter(dev, 0, IOP_HWSOFT_RESET)) { +			/* Make sure the Hardware FIFO is empty */ +			while ((++restart < 512) && +			       (rx_readl(dev, MUnit.OutboundQueue) != 0xFFFFFFFFL)); +		} +	} +  	/*  	 *	Check to see if the board panic'd while booting.  	 */ diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c index 0c9361c87ec8..fde6b6aa86e3 100644 --- a/drivers/scsi/aacraid/src.c +++ b/drivers/scsi/aacraid/src.c @@ -868,9 +868,13 @@ int aac_src_init(struct aac_dev *dev)  	/* Failure to reset here is an option ... */  	dev->a_ops.adapter_sync_cmd = src_sync_cmd;  	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; -	if ((aac_reset_devices || reset_devices) && -		!aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET)) -		++restart; + +	if (dev->init_reset) { +		dev->init_reset = false; +		if (!aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET)) +			++restart; +	} +  	/*  	 *	Check to see if the board panic'd while booting.  	 */ @@ -1014,9 +1018,13 @@ int aac_srcv_init(struct aac_dev *dev)  	/* Failure to reset here is an option ... */  	dev->a_ops.adapter_sync_cmd = src_sync_cmd;  	dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; -	if ((aac_reset_devices || reset_devices) && -		!aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET)) -		++restart; + +	if (dev->init_reset) { +		dev->init_reset = false; +		if (!aac_src_restart_adapter(dev, 0, IOP_HWSOFT_RESET)) +			++restart; +	} +  	/*  	 *	Check to see if flash update is running.  	 *	Wait for the adapter to be up and running. Wait up to 5 minutes diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c index 72ca2a2e08e2..b2fa195adc7a 100644 --- a/drivers/scsi/bfa/bfad_bsg.c +++ b/drivers/scsi/bfa/bfad_bsg.c @@ -3135,7 +3135,8 @@ bfad_im_bsg_vendor_request(struct bsg_job *job)  	struct fc_bsg_request *bsg_request = job->request;  	struct fc_bsg_reply *bsg_reply = job->reply;  	uint32_t vendor_cmd = bsg_request->rqst_data.h_vendor.vendor_cmd[0]; -	struct bfad_im_port_s *im_port = shost_priv(fc_bsg_to_shost(job)); +	struct Scsi_Host *shost = fc_bsg_to_shost(job); +	struct bfad_im_port_s *im_port = bfad_get_im_port(shost);  	struct bfad_s *bfad = im_port->bfad;  	void *payload_kbuf;  	int rc = -EINVAL; @@ -3350,7 +3351,8 @@ int  bfad_im_bsg_els_ct_request(struct bsg_job *job)  {  	struct bfa_bsg_data *bsg_data; -	struct bfad_im_port_s *im_port = shost_priv(fc_bsg_to_shost(job)); +	struct Scsi_Host *shost = fc_bsg_to_shost(job); +	struct bfad_im_port_s *im_port = bfad_get_im_port(shost);  	struct bfad_s *bfad = im_port->bfad;  	bfa_bsg_fcpt_t *bsg_fcpt;  	struct bfad_fcxp    *drv_fcxp; diff --git a/drivers/scsi/bfa/bfad_im.c b/drivers/scsi/bfa/bfad_im.c index 24e657a4ec80..c05d6e91e4bd 100644 --- a/drivers/scsi/bfa/bfad_im.c +++ b/drivers/scsi/bfa/bfad_im.c @@ -546,6 +546,7 @@ int  bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port,  			struct device *dev)  { +	struct bfad_im_port_pointer *im_portp;  	int error = 1;  	mutex_lock(&bfad_mutex); @@ -564,7 +565,8 @@ bfad_im_scsi_host_alloc(struct bfad_s *bfad, struct bfad_im_port_s *im_port,  		goto out_free_idr;  	} -	im_port->shost->hostdata[0] = (unsigned long)im_port; +	im_portp = shost_priv(im_port->shost); +	im_portp->p = im_port;  	im_port->shost->unique_id = im_port->idr_id;  	im_port->shost->this_id = -1;  	im_port->shost->max_id = MAX_FCP_TARGET; @@ -748,7 +750,7 @@ bfad_scsi_host_alloc(struct bfad_im_port_s *im_port, struct bfad_s *bfad)  	sht->sg_tablesize = bfad->cfg_data.io_max_sge; -	return scsi_host_alloc(sht, sizeof(unsigned long)); +	return scsi_host_alloc(sht, sizeof(struct bfad_im_port_pointer));  }  void diff --git a/drivers/scsi/bfa/bfad_im.h b/drivers/scsi/bfa/bfad_im.h index c81ec2a77ef5..06ce4ba2b7bc 100644 --- a/drivers/scsi/bfa/bfad_im.h +++ b/drivers/scsi/bfa/bfad_im.h @@ -69,6 +69,16 @@ struct bfad_im_port_s {  	struct fc_vport *fc_vport;  }; +struct bfad_im_port_pointer { +	struct bfad_im_port_s *p; +}; + +static inline struct bfad_im_port_s *bfad_get_im_port(struct Scsi_Host *host) +{ +	struct bfad_im_port_pointer *im_portp = shost_priv(host); +	return im_portp->p; +} +  enum bfad_itnim_state {  	ITNIM_STATE_NONE,  	ITNIM_STATE_ONLINE, diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index 5da46052e179..21be672679fb 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c @@ -904,10 +904,14 @@ static void fc_lport_recv_els_req(struct fc_lport *lport,  		case ELS_FLOGI:  			if (!lport->point_to_multipoint)  				fc_lport_recv_flogi_req(lport, fp); +			else +				fc_rport_recv_req(lport, fp);  			break;  		case ELS_LOGO:  			if (fc_frame_sid(fp) == FC_FID_FLOGI)  				fc_lport_recv_logo_req(lport, fp); +			else +				fc_rport_recv_req(lport, fp);  			break;  		case ELS_RSCN:  			lport->tt.disc_recv_req(lport, fp); diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index ca1566237ae7..3183d63de4da 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c @@ -2145,7 +2145,7 @@ void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,  		struct sas_rphy *rphy)  {  	struct domain_device *dev; -	unsigned int reslen = 0; +	unsigned int rcvlen = 0;  	int ret = -EINVAL;  	/* no rphy means no smp target support (ie aic94xx host) */ @@ -2179,12 +2179,12 @@ void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,  	ret = smp_execute_task_sg(dev, job->request_payload.sg_list,  			job->reply_payload.sg_list); -	if (ret > 0) { -		/* positive number is the untransferred residual */ -		reslen = ret; +	if (ret >= 0) { +		/* bsg_job_done() requires the length received  */ +		rcvlen = job->reply_payload.payload_len - ret;  		ret = 0;  	}  out: -	bsg_job_done(job, ret, reslen); +	bsg_job_done(job, ret, rcvlen);  } diff --git a/drivers/scsi/lpfc/lpfc_mem.c b/drivers/scsi/lpfc/lpfc_mem.c index 56faeb049b4a..87c08ff37ddd 100644 --- a/drivers/scsi/lpfc/lpfc_mem.c +++ b/drivers/scsi/lpfc/lpfc_mem.c @@ -753,12 +753,12 @@ lpfc_rq_buf_free(struct lpfc_hba *phba, struct lpfc_dmabuf *mp)  	drqe.address_hi = putPaddrHigh(rqb_entry->dbuf.phys);  	rc = lpfc_sli4_rq_put(rqb_entry->hrq, rqb_entry->drq, &hrqe, &drqe);  	if (rc < 0) { -		(rqbp->rqb_free_buffer)(phba, rqb_entry);  		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,  				"6409 Cannot post to RQ %d: %x %x\n",  				rqb_entry->hrq->queue_id,  				rqb_entry->hrq->host_index,  				rqb_entry->hrq->hba_index); +		(rqbp->rqb_free_buffer)(phba, rqb_entry);  	} else {  		list_add_tail(&rqb_entry->hbuf.list, &rqbp->rqb_buffer_list);  		rqbp->buffer_count++; diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index a4f28b7e4c65..e18877177f1b 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c @@ -1576,7 +1576,9 @@ static struct request *_make_request(struct request_queue *q, bool has_write,  		return req;  	for_each_bio(bio) { -		ret = blk_rq_append_bio(req, bio); +		struct bio *bounce_bio = bio; + +		ret = blk_rq_append_bio(req, &bounce_bio);  		if (ret)  			return ERR_PTR(ret);  	} diff --git a/drivers/scsi/scsi_debugfs.c b/drivers/scsi/scsi_debugfs.c index 01f08c03f2c1..c3765d29fd3f 100644 --- a/drivers/scsi/scsi_debugfs.c +++ b/drivers/scsi/scsi_debugfs.c @@ -8,9 +8,11 @@ void scsi_show_rq(struct seq_file *m, struct request *rq)  {  	struct scsi_cmnd *cmd = container_of(scsi_req(rq), typeof(*cmd), req);  	int msecs = jiffies_to_msecs(jiffies - cmd->jiffies_at_alloc); -	char buf[80]; +	const u8 *const cdb = READ_ONCE(cmd->cmnd); +	char buf[80] = "(?)"; -	__scsi_format_command(buf, sizeof(buf), cmd->cmnd, cmd->cmd_len); +	if (cdb) +		__scsi_format_command(buf, sizeof(buf), cdb, cmd->cmd_len);  	seq_printf(m, ", .cmd=%s, .retries=%d, allocated %d.%03d s ago", buf,  		   cmd->retries, msecs / 1000, msecs % 1000);  } diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index 78d4aa8df675..dfb8da83fa50 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c @@ -34,7 +34,6 @@ struct scsi_dev_info_list_table {  }; -static const char spaces[] = "                "; /* 16 of them */  static blist_flags_t scsi_default_dev_flags;  static LIST_HEAD(scsi_dev_info_list);  static char scsi_dev_flags[256]; @@ -298,20 +297,13 @@ static void scsi_strcpy_devinfo(char *name, char *to, size_t to_length,  	size_t from_length;  	from_length = strlen(from); -	strncpy(to, from, min(to_length, from_length)); -	if (from_length < to_length) { -		if (compatible) { -			/* -			 * NUL terminate the string if it is short. -			 */ -			to[from_length] = '\0'; -		} else { -			/* -			 * space pad the string if it is short. -			 */ -			strncpy(&to[from_length], spaces, -				to_length - from_length); -		} +	/* This zero-pads the destination */ +	strncpy(to, from, to_length); +	if (from_length < to_length && !compatible) { +		/* +		 * space pad the string if it is short. +		 */ +		memset(&to[from_length], ' ', to_length - from_length);  	}  	if (from_length > to_length)  		 printk(KERN_WARNING "%s: %s string '%s' is too long\n", @@ -382,10 +374,8 @@ int scsi_dev_info_list_add_keyed(int compatible, char *vendor, char *model,  			    model, compatible);  	if (strflags) -		devinfo->flags = simple_strtoul(strflags, NULL, 0); -	else -		devinfo->flags = flags; - +		flags = (__force blist_flags_t)simple_strtoul(strflags, NULL, 0); +	devinfo->flags = flags;  	devinfo->compatible = compatible;  	if (compatible) @@ -458,7 +448,8 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,  			/*  			 * vendor strings must be an exact match  			 */ -			if (vmax != strlen(devinfo->vendor) || +			if (vmax != strnlen(devinfo->vendor, +					    sizeof(devinfo->vendor)) ||  			    memcmp(devinfo->vendor, vskip, vmax))  				continue; @@ -466,7 +457,7 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,  			 * @model specifies the full string, and  			 * must be larger or equal to devinfo->model  			 */ -			mlen = strlen(devinfo->model); +			mlen = strnlen(devinfo->model, sizeof(devinfo->model));  			if (mmax < mlen || memcmp(devinfo->model, mskip, mlen))  				continue;  			return devinfo; diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 1cbc497e00bd..d9ca1dfab154 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1967,6 +1967,8 @@ static bool scsi_mq_get_budget(struct blk_mq_hw_ctx *hctx)  out_put_device:  	put_device(&sdev->sdev_gendev);  out: +	if (atomic_read(&sdev->device_busy) == 0 && !scsi_device_blocked(sdev)) +		blk_mq_delay_run_hw_queue(hctx, SCSI_QUEUE_DELAY);  	return false;  } @@ -2148,11 +2150,13 @@ void __scsi_init_queue(struct Scsi_Host *shost, struct request_queue *q)  		q->limits.cluster = 0;  	/* -	 * set a reasonable default alignment on word boundaries: the -	 * host and device may alter it using -	 * blk_queue_update_dma_alignment() later. +	 * Set a reasonable default alignment:  The larger of 32-byte (dword), +	 * which is a common minimum for HBAs, and the minimum DMA alignment, +	 * which is set by the platform. +	 * +	 * Devices that require a bigger alignment can increase it later.  	 */ -	blk_queue_dma_alignment(q, 0x03); +	blk_queue_dma_alignment(q, max(4, dma_get_cache_alignment()) - 1);  }  EXPORT_SYMBOL_GPL(__scsi_init_queue); diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index be5e919db0e8..0880d975eed3 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -770,7 +770,7 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,   *     SCSI_SCAN_LUN_PRESENT: a new scsi_device was allocated and initialized   **/  static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, -		int *bflags, int async) +		blist_flags_t *bflags, int async)  {  	int ret; @@ -1049,14 +1049,15 @@ static unsigned char *scsi_inq_str(unsigned char *buf, unsigned char *inq,   *   - SCSI_SCAN_LUN_PRESENT: a new scsi_device was allocated and initialized   **/  static int scsi_probe_and_add_lun(struct scsi_target *starget, -				  u64 lun, int *bflagsp, +				  u64 lun, blist_flags_t *bflagsp,  				  struct scsi_device **sdevp,  				  enum scsi_scan_mode rescan,  				  void *hostdata)  {  	struct scsi_device *sdev;  	unsigned char *result; -	int bflags, res = SCSI_SCAN_NO_RESPONSE, result_len = 256; +	blist_flags_t bflags; +	int res = SCSI_SCAN_NO_RESPONSE, result_len = 256;  	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);  	/* @@ -1201,7 +1202,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget,   *     Modifies sdevscan->lun.   **/  static void scsi_sequential_lun_scan(struct scsi_target *starget, -				     int bflags, int scsi_level, +				     blist_flags_t bflags, int scsi_level,  				     enum scsi_scan_mode rescan)  {  	uint max_dev_lun; @@ -1292,7 +1293,7 @@ static void scsi_sequential_lun_scan(struct scsi_target *starget,   *     0: scan completed (or no memory, so further scanning is futile)   *     1: could not scan with REPORT LUN   **/ -static int scsi_report_lun_scan(struct scsi_target *starget, int bflags, +static int scsi_report_lun_scan(struct scsi_target *starget, blist_flags_t bflags,  				enum scsi_scan_mode rescan)  {  	unsigned char scsi_cmd[MAX_COMMAND_SIZE]; @@ -1538,7 +1539,7 @@ static void __scsi_scan_target(struct device *parent, unsigned int channel,  		unsigned int id, u64 lun, enum scsi_scan_mode rescan)  {  	struct Scsi_Host *shost = dev_to_shost(parent); -	int bflags = 0; +	blist_flags_t bflags = 0;  	int res;  	struct scsi_target *starget; diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 50e7d7e4a861..26ce17178401 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -967,7 +967,8 @@ sdev_show_wwid(struct device *dev, struct device_attribute *attr,  }  static DEVICE_ATTR(wwid, S_IRUGO, sdev_show_wwid, NULL); -#define BLIST_FLAG_NAME(name) [ilog2(BLIST_##name)] = #name +#define BLIST_FLAG_NAME(name)					\ +	[ilog2((__force unsigned int)BLIST_##name)] = #name  static const char *const sdev_bflags_name[] = {  #include "scsi_devinfo_tbl.c"  }; @@ -984,7 +985,7 @@ sdev_show_blacklist(struct device *dev, struct device_attribute *attr,  	for (i = 0; i < sizeof(sdev->sdev_bflags) * BITS_PER_BYTE; i++) {  		const char *name = NULL; -		if (!(sdev->sdev_bflags & BIT(i))) +		if (!(sdev->sdev_bflags & (__force blist_flags_t)BIT(i)))  			continue;  		if (i < ARRAY_SIZE(sdev_bflags_name) && sdev_bflags_name[i])  			name = sdev_bflags_name[i]; @@ -1414,7 +1415,10 @@ static void __scsi_remove_target(struct scsi_target *starget)  		 * check.  		 */  		if (sdev->channel != starget->channel || -		    sdev->id != starget->id || +		    sdev->id != starget->id) +			continue; +		if (sdev->sdev_state == SDEV_DEL || +		    sdev->sdev_state == SDEV_CANCEL ||  		    !get_device(&sdev->sdev_gendev))  			continue;  		spin_unlock_irqrestore(shost->host_lock, flags); diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index d0219e36080c..10ebb213ddb3 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -50,14 +50,14 @@  /* Our blacklist flags */  enum { -	SPI_BLIST_NOIUS = 0x1, +	SPI_BLIST_NOIUS = (__force blist_flags_t)0x1,  };  /* blacklist table, modelled on scsi_devinfo.c */  static struct {  	char *vendor;  	char *model; -	unsigned flags; +	blist_flags_t flags;  } spi_static_device_list[] __initdata = {  	{"HP", "Ultrium 3-SCSI", SPI_BLIST_NOIUS },  	{"IBM", "ULTRIUM-TD3", SPI_BLIST_NOIUS }, @@ -221,9 +221,11 @@ static int spi_device_configure(struct transport_container *tc,  {  	struct scsi_device *sdev = to_scsi_device(dev);  	struct scsi_target *starget = sdev->sdev_target; -	unsigned bflags = scsi_get_device_flags_keyed(sdev, &sdev->inquiry[8], -						      &sdev->inquiry[16], -						      SCSI_DEVINFO_SPI); +	blist_flags_t bflags; + +	bflags = scsi_get_device_flags_keyed(sdev, &sdev->inquiry[8], +					     &sdev->inquiry[16], +					     SCSI_DEVINFO_SPI);  	/* Populate the target capability fields with the values  	 * gleaned from the device inquiry */ diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 24fe68522716..a028ab3322a9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1312,6 +1312,7 @@ static int sd_init_command(struct scsi_cmnd *cmd)  static void sd_uninit_command(struct scsi_cmnd *SCpnt)  {  	struct request *rq = SCpnt->request; +	u8 *cmnd;  	if (SCpnt->flags & SCMD_ZONE_WRITE_LOCK)  		sd_zbc_write_unlock_zone(SCpnt); @@ -1320,9 +1321,10 @@ static void sd_uninit_command(struct scsi_cmnd *SCpnt)  		__free_page(rq->special_vec.bv_page);  	if (SCpnt->cmnd != scsi_req(rq)->cmd) { -		mempool_free(SCpnt->cmnd, sd_cdb_pool); +		cmnd = SCpnt->cmnd;  		SCpnt->cmnd = NULL;  		SCpnt->cmd_len = 0; +		mempool_free(cmnd, sd_cdb_pool);  	}  } diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c index 1b06cf0375dc..3b3d1d050cac 100644 --- a/drivers/scsi/storvsc_drv.c +++ b/drivers/scsi/storvsc_drv.c @@ -953,10 +953,11 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,  		case TEST_UNIT_READY:  			break;  		default: -			set_host_byte(scmnd, DID_TARGET_FAILURE); +			set_host_byte(scmnd, DID_ERROR);  		}  		break;  	case SRB_STATUS_INVALID_LUN: +		set_host_byte(scmnd, DID_NO_CONNECT);  		do_work = true;  		process_err_fn = storvsc_remove_lun;  		break; diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 011c3369082c..a355d989b414 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -6559,12 +6559,15 @@ static int ufshcd_config_vreg(struct device *dev,  		struct ufs_vreg *vreg, bool on)  {  	int ret = 0; -	struct regulator *reg = vreg->reg; -	const char *name = vreg->name; +	struct regulator *reg; +	const char *name;  	int min_uV, uA_load;  	BUG_ON(!vreg); +	reg = vreg->reg; +	name = vreg->name; +  	if (regulator_count_voltages(reg) > 0) {  		min_uV = on ? vreg->min_uV : 0;  		ret = regulator_set_voltage(reg, min_uV, vreg->max_uV);  | 

