@@ -2085,7 +2085,7 @@ EXPORT_SYMBOL_GPL(scsi_mode_select);
* issued) if successful.
*/
int
-scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
+scsi_mode_sense(struct scsi_device *sdev, bool dbd, int modepage,
unsigned char *buffer, int len, int timeout, int retries,
struct scsi_mode_data *data, struct scsi_sense_hdr *sshdr)
{
@@ -2098,8 +2098,9 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
memset(data, 0, sizeof(*data));
memset(&cmd[0], 0, 12);
- dbd = sdev->set_dbd_for_ms ? 8 : dbd;
- cmd[1] = dbd & 0x18; /* allows DBD and LLBA bits */
+ dbd = sdev->set_dbd_for_ms ? true : dbd;
+ if (dbd)
+ cmd[1] = 1 << 3; /* DBD bit */
cmd[2] = modepage;
/* caller might not be interested in sense, but we need it */
@@ -1234,7 +1234,7 @@ int sas_read_port_mode_page(struct scsi_device *sdev)
if (!buffer)
return -ENOMEM;
- res = scsi_mode_sense(sdev, 1, 0x19, buffer, BUF_SIZE, 30*HZ, 3,
+ res = scsi_mode_sense(sdev, true, 0x19, buffer, BUF_SIZE, 30*HZ, 3,
&mode_data, NULL);
error = -EINVAL;
@@ -193,7 +193,7 @@ cache_type_store(struct device *dev, struct device_attribute *attr,
return count;
}
- if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), SD_TIMEOUT,
+ if (scsi_mode_sense(sdp, true, 8, buffer, sizeof(buffer), SD_TIMEOUT,
SD_MAX_RETRIES, &data, NULL))
return -EINVAL;
len = min_t(size_t, sizeof(buffer), data.length - data.header_length -
@@ -2561,7 +2561,7 @@ sd_print_capacity(struct scsi_disk *sdkp,
/* called with buffer of length 512 */
static inline int
-sd_do_mode_sense(struct scsi_device *sdp, int dbd, int modepage,
+sd_do_mode_sense(struct scsi_device *sdp, bool dbd, int modepage,
unsigned char *buffer, int len, struct scsi_mode_data *data,
struct scsi_sense_hdr *sshdr)
{
@@ -2639,7 +2639,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
int len = 0, res;
struct scsi_device *sdp = sdkp->device;
- int dbd;
+ bool dbd;
int modepage;
int first_len;
struct scsi_mode_data data;
@@ -2662,14 +2662,14 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
modepage = 0x3F;
if (sdp->use_192_bytes_for_3f)
first_len = 192;
- dbd = 0;
+ dbd = false;
}
} else if (sdp->type == TYPE_RBC) {
modepage = 6;
- dbd = 8;
+ dbd = true;
} else {
modepage = 8;
- dbd = 0;
+ dbd = true;
}
/* cautiously ask */
@@ -2823,7 +2823,7 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
if (sdkp->protection_type == 0)
return;
- res = scsi_mode_sense(sdp, 1, 0x0a, buffer, 36, SD_TIMEOUT,
+ res = scsi_mode_sense(sdp, true, 0x0a, buffer, 36, SD_TIMEOUT,
SD_MAX_RETRIES, &data, &sshdr);
if (!scsi_status_is_good(res) || !data.header_length ||
@@ -936,7 +936,7 @@ static void get_capabilities(struct scsi_cd *cd)
scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
/* ask for mode page 0x2a */
- rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, ms_len,
+ rc = scsi_mode_sense(cd->device, false, 0x2a, buffer, ms_len,
SR_TIMEOUT, 3, &data, NULL);
if (!scsi_status_is_good(rc) || data.length > ms_len ||
@@ -397,7 +397,7 @@ extern int scsi_track_queue_full(struct scsi_device *, int);
extern int scsi_set_medium_removal(struct scsi_device *, char);
-extern int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
+extern int scsi_mode_sense(struct scsi_device *sdev, bool dbd, int modepage,
unsigned char *buffer, int len, int timeout,
int retries, struct scsi_mode_data *data,
struct scsi_sense_hdr *);
The scsi_mode_sense() function has an argument called 'dbd' but confusingly this is used to specify the entire second byte of the CDB and not just the DBD bit. Several callers assumed that 'dbd' was a flag and passed in a value of 1 instead of the required 8 to disable fetching block descriptors. The invalid value of 1 was subsequently masked off by the function and was not actually passed on to the device. Turn the 'dbd' argument into a boolean and fix all callers. Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> --- drivers/scsi/scsi_lib.c | 7 ++++--- drivers/scsi/scsi_transport_sas.c | 2 +- drivers/scsi/sd.c | 14 +++++++------- drivers/scsi/sr.c | 2 +- include/scsi/scsi_device.h | 2 +- 5 files changed, 14 insertions(+), 13 deletions(-)