diff options
Diffstat (limited to 'drivers/scsi/sd.c')
| -rw-r--r-- | drivers/scsi/sd.c | 114 | 
1 files changed, 53 insertions, 61 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index cfba74cd8e8b..fedab3c21ddf 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -116,7 +116,7 @@ static int sd_eh_action(struct scsi_cmnd *, int);  static void sd_read_capacity(struct scsi_disk *sdkp, unsigned char *buffer);  static void scsi_disk_release(struct device *cdev);  static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *); -static void sd_print_result(struct scsi_disk *, int); +static void sd_print_result(const struct scsi_disk *, const char *, int);  static DEFINE_SPINLOCK(sd_index_lock);  static DEFINE_IDA(sd_index_ida); @@ -510,9 +510,9 @@ static const struct dev_pm_ops sd_pm_ops = {  };  static struct scsi_driver sd_template = { -	.owner			= THIS_MODULE,  	.gendrv = {  		.name		= "sd", +		.owner		= THIS_MODULE,  		.probe		= sd_probe,  		.remove		= sd_remove,  		.shutdown	= sd_shutdown, @@ -656,7 +656,7 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)  	unsigned int logical_block_size = sdkp->device->sector_size;  	unsigned int max_blocks = 0; -	q->limits.discard_zeroes_data = sdkp->lbprz; +	q->limits.discard_zeroes_data = 0;  	q->limits.discard_alignment = sdkp->unmap_alignment *  		logical_block_size;  	q->limits.discard_granularity = @@ -680,11 +680,13 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)  	case SD_LBP_WS16:  		max_blocks = min_not_zero(sdkp->max_ws_blocks,  					  (u32)SD_MAX_WS16_BLOCKS); +		q->limits.discard_zeroes_data = sdkp->lbprz;  		break;  	case SD_LBP_WS10:  		max_blocks = min_not_zero(sdkp->max_ws_blocks,  					  (u32)SD_MAX_WS10_BLOCKS); +		q->limits.discard_zeroes_data = sdkp->lbprz;  		break;  	case SD_LBP_ZERO: @@ -784,7 +786,7 @@ static int sd_setup_discard_cmnd(struct scsi_cmnd *cmd)  	 * amount of blocks described by the request.  	 */  	blk_add_request_payload(rq, page, len); -	ret = scsi_init_io(cmd, GFP_ATOMIC); +	ret = scsi_init_io(cmd);  	rq->__data_len = nr_bytes;  out: @@ -878,7 +880,7 @@ static int sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)  	 * knows how much to actually write.  	 */  	rq->__data_len = sdp->sector_size; -	ret = scsi_init_io(cmd, GFP_ATOMIC); +	ret = scsi_init_io(cmd);  	rq->__data_len = nr_bytes;  	return ret;  } @@ -912,7 +914,7 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)  	int ret;  	unsigned char protect; -	ret = scsi_init_io(SCpnt, GFP_ATOMIC); +	ret = scsi_init_io(SCpnt);  	if (ret != BLKPREP_OK)  		goto out;  	SCpnt = rq->special; @@ -1334,9 +1336,9 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode,  	 * may try and take the device offline, in which case all further  	 * access to the device is prohibited.  	 */ -	error = scsi_nonblockable_ioctl(sdp, cmd, p, -					(mode & FMODE_NDELAY) != 0); -	if (!scsi_block_when_processing_errors(sdp) || !error) +	error = scsi_ioctl_block_when_processing_errors(sdp, cmd, +			(mode & FMODE_NDELAY) != 0); +	if (error)  		goto out;  	/* @@ -1492,7 +1494,7 @@ static int sd_sync_cache(struct scsi_disk *sdkp)  	}  	if (res) { -		sd_print_result(sdkp, res); +		sd_print_result(sdkp, "Synchronize Cache(10) failed", res);  		if (driver_byte(res) & DRIVER_SENSE)  			sd_print_sense_hdr(sdkp, &sshdr); @@ -1541,31 +1543,19 @@ static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,  			   unsigned int cmd, unsigned long arg)  {  	struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device; -	int ret; - -	ret = scsi_verify_blk_ioctl(bdev, cmd); -	if (ret < 0) -		return ret; +	int error; -	/* -	 * If we are in the middle of error recovery, don't let anyone -	 * else try and use this device.  Also, if error recovery fails, it -	 * may try and take the device offline, in which case all further -	 * access to the device is prohibited. -	 */ -	if (!scsi_block_when_processing_errors(sdev)) -		return -ENODEV; +	error = scsi_ioctl_block_when_processing_errors(sdev, cmd, +			(mode & FMODE_NDELAY) != 0); +	if (error) +		return error; -	if (sdev->host->hostt->compat_ioctl) { -		ret = sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg); - -		return ret; -	} -  	/*   	 * Let the static ioctl translation table take care of it.  	 */ -	return -ENOIOCTLCMD;  +	if (!sdev->host->hostt->compat_ioctl) +		return -ENOIOCTLCMD;  +	return sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);  }  #endif @@ -1713,17 +1703,6 @@ static int sd_done(struct scsi_cmnd *SCpnt)  		if (sense_valid)  			sense_deferred = scsi_sense_is_deferred(&sshdr);  	} -#ifdef CONFIG_SCSI_LOGGING -	SCSI_LOG_HLCOMPLETE(1, scsi_print_result(SCpnt)); -	if (sense_valid) { -		SCSI_LOG_HLCOMPLETE(1, scmd_printk(KERN_INFO, SCpnt, -						   "sd_done: sb[respc,sk,asc," -						   "ascq]=%x,%x,%x,%x\n", -						   sshdr.response_code, -						   sshdr.sense_key, sshdr.asc, -						   sshdr.ascq)); -	} -#endif  	sdkp->medium_access_timed_out = 0;  	if (driver_byte(result) != DRIVER_SENSE && @@ -1743,7 +1722,6 @@ static int sd_done(struct scsi_cmnd *SCpnt)  		 * unknown amount of data was transferred so treat it as an  		 * error.  		 */ -		scsi_print_sense("sd", SCpnt);  		SCpnt->result = 0;  		memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);  		break; @@ -1779,6 +1757,10 @@ static int sd_done(struct scsi_cmnd *SCpnt)  		break;  	}   out: +	SCSI_LOG_HLCOMPLETE(1, scmd_printk(KERN_INFO, SCpnt, +					   "sd_done: completed %d of %d bytes\n", +					   good_bytes, scsi_bufflen(SCpnt))); +  	if (rq_data_dir(SCpnt->request) == READ && scsi_prot_sg_count(SCpnt))  		sd_dif_complete(SCpnt, good_bytes); @@ -1834,12 +1816,12 @@ sd_spinup_disk(struct scsi_disk *sdkp)  			/* no sense, TUR either succeeded or failed  			 * with a status error */  			if(!spintime && !scsi_status_is_good(the_result)) { -				sd_printk(KERN_NOTICE, sdkp, "Unit Not Ready\n"); -				sd_print_result(sdkp, the_result); +				sd_print_result(sdkp, "Test Unit Ready failed", +						the_result);  			}  			break;  		} -					 +  		/*  		 * The device does not want the automatic start to be issued.  		 */ @@ -1955,7 +1937,6 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,  			struct scsi_sense_hdr *sshdr, int sense_valid,  			int the_result)  { -	sd_print_result(sdkp, the_result);  	if (driver_byte(the_result) & DRIVER_SENSE)  		sd_print_sense_hdr(sdkp, sshdr);  	else @@ -2001,7 +1982,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,  	do {  		memset(cmd, 0, 16); -		cmd[0] = SERVICE_ACTION_IN; +		cmd[0] = SERVICE_ACTION_IN_16;  		cmd[1] = SAI_READ_CAPACITY_16;  		cmd[13] = RC16_LEN;  		memset(buffer, 0, RC16_LEN); @@ -2036,7 +2017,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,  	} while (the_result && retries);  	if (the_result) { -		sd_printk(KERN_NOTICE, sdkp, "READ CAPACITY(16) failed\n"); +		sd_print_result(sdkp, "Read Capacity(16) failed", the_result);  		read_capacity_error(sdkp, sdp, &sshdr, sense_valid, the_result);  		return -EINVAL;  	} @@ -2118,7 +2099,7 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,  	} while (the_result && retries);  	if (the_result) { -		sd_printk(KERN_NOTICE, sdkp, "READ CAPACITY failed\n"); +		sd_print_result(sdkp, "Read Capacity(10) failed", the_result);  		read_capacity_error(sdkp, sdp, &sshdr, sense_valid, the_result);  		return -EINVAL;  	} @@ -2643,12 +2624,12 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)  		} else {	/* LBP VPD page tells us what to use */ -			if (sdkp->lbpu && sdkp->max_unmap_blocks) -				sd_config_discard(sdkp, SD_LBP_UNMAP); -			else if (sdkp->lbpws) +			if (sdkp->lbpws)  				sd_config_discard(sdkp, SD_LBP_WS16);  			else if (sdkp->lbpws10)  				sd_config_discard(sdkp, SD_LBP_WS10); +			else if (sdkp->lbpu && sdkp->max_unmap_blocks) +				sd_config_discard(sdkp, SD_LBP_UNMAP);  			else  				sd_config_discard(sdkp, SD_LBP_DISABLE);  		} @@ -3142,8 +3123,7 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)  	res = scsi_execute_req_flags(sdp, cmd, DMA_NONE, NULL, 0, &sshdr,  			       SD_TIMEOUT, SD_MAX_RETRIES, NULL, REQ_PM);  	if (res) { -		sd_printk(KERN_WARNING, sdkp, "START_STOP FAILED\n"); -		sd_print_result(sdkp, res); +		sd_print_result(sdkp, "Start/Stop Unit failed", res);  		if (driver_byte(res) & DRIVER_SENSE)  			sd_print_sense_hdr(sdkp, &sshdr);  		if (scsi_sense_valid(&sshdr) && @@ -3337,15 +3317,27 @@ module_exit(exit_sd);  static void sd_print_sense_hdr(struct scsi_disk *sdkp,  			       struct scsi_sense_hdr *sshdr)  { -	sd_printk(KERN_INFO, sdkp, " "); -	scsi_show_sense_hdr(sshdr); -	sd_printk(KERN_INFO, sdkp, " "); -	scsi_show_extd_sense(sshdr->asc, sshdr->ascq); +	scsi_show_sense_hdr(sdkp->device, +			    sdkp->disk ? sdkp->disk->disk_name : NULL, sshdr); +	scsi_show_extd_sense(sdkp->device, +			     sdkp->disk ? sdkp->disk->disk_name : NULL, +			     sshdr->asc, sshdr->ascq);  } -static void sd_print_result(struct scsi_disk *sdkp, int result) +static void sd_print_result(const struct scsi_disk *sdkp, const char *msg, +			    int result)  { -	sd_printk(KERN_INFO, sdkp, " "); -	scsi_show_result(result); +	const char *hb_string = scsi_hostbyte_string(result); +	const char *db_string = scsi_driverbyte_string(result); + +	if (hb_string || db_string) +		sd_printk(KERN_INFO, sdkp, +			  "%s: Result: hostbyte=%s driverbyte=%s\n", msg, +			  hb_string ? hb_string : "invalid", +			  db_string ? db_string : "invalid"); +	else +		sd_printk(KERN_INFO, sdkp, +			  "%s: Result: hostbyte=0x%02x driverbyte=0x%02x\n", +			  msg, host_byte(result), driver_byte(result));  }  |