Skip to content

Commit

Permalink
[SCSI] sd: Quiesce mode sense error messages
Browse files Browse the repository at this point in the history
Messages about discovered disk properties are only printed once unless
they are found to have changed. Errors encountered during mode sense,
however, are printed every time we revalidate.

Quiesce mode sense errors so they are only printed during the first
scan.

[jejb: checkpatch fixes]
Bugzilla: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=733565
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
  • Loading branch information
martinkpetersen authored and James Bottomley committed Mar 27, 2014
1 parent 89d9a56 commit b2bff6c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 16 deletions.
38 changes: 22 additions & 16 deletions drivers/scsi/sd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2281,7 +2281,7 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)

set_disk_ro(sdkp->disk, 0);
if (sdp->skip_ms_page_3f) {
sd_printk(KERN_NOTICE, sdkp, "Assuming Write Enabled\n");
sd_first_printk(KERN_NOTICE, sdkp, "Assuming Write Enabled\n");
return;
}

Expand Down Expand Up @@ -2313,7 +2313,7 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
}

if (!scsi_status_is_good(res)) {
sd_printk(KERN_WARNING, sdkp,
sd_first_printk(KERN_WARNING, sdkp,
"Test WP failed, assume Write Enabled\n");
} else {
sdkp->write_prot = ((data.device_specific & 0x80) != 0);
Expand Down Expand Up @@ -2381,7 +2381,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
if (!data.header_length) {
modepage = 6;
first_len = 0;
sd_printk(KERN_ERR, sdkp, "Missing header in MODE_SENSE response\n");
sd_first_printk(KERN_ERR, sdkp,
"Missing header in MODE_SENSE response\n");
}

/* that went OK, now ask for the proper length */
Expand All @@ -2394,7 +2395,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
if (len < 3)
goto bad_sense;
else if (len > SD_BUF_SIZE) {
sd_printk(KERN_NOTICE, sdkp, "Truncating mode parameter "
sd_first_printk(KERN_NOTICE, sdkp, "Truncating mode parameter "
"data from %d to %d bytes\n", len, SD_BUF_SIZE);
len = SD_BUF_SIZE;
}
Expand All @@ -2417,8 +2418,9 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
/* We're interested only in the first 3 bytes.
*/
if (len - offset <= 2) {
sd_printk(KERN_ERR, sdkp, "Incomplete "
"mode parameter data\n");
sd_first_printk(KERN_ERR, sdkp,
"Incomplete mode parameter "
"data\n");
goto defaults;
} else {
modepage = page_code;
Expand All @@ -2432,14 +2434,15 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
else if (!spf && len - offset > 1)
offset += 2 + buffer[offset+1];
else {
sd_printk(KERN_ERR, sdkp, "Incomplete "
"mode parameter data\n");
sd_first_printk(KERN_ERR, sdkp,
"Incomplete mode "
"parameter data\n");
goto defaults;
}
}
}

sd_printk(KERN_ERR, sdkp, "No Caching mode page found\n");
sd_first_printk(KERN_ERR, sdkp, "No Caching mode page found\n");
goto defaults;

Page_found:
Expand All @@ -2453,7 +2456,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)

sdkp->DPOFUA = (data.device_specific & 0x10) != 0;
if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
sd_printk(KERN_NOTICE, sdkp,
sd_first_printk(KERN_NOTICE, sdkp,
"Uses READ/WRITE(6), disabling FUA\n");
sdkp->DPOFUA = 0;
}
Expand All @@ -2475,16 +2478,19 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
sshdr.sense_key == ILLEGAL_REQUEST &&
sshdr.asc == 0x24 && sshdr.ascq == 0x0)
/* Invalid field in CDB */
sd_printk(KERN_NOTICE, sdkp, "Cache data unavailable\n");
sd_first_printk(KERN_NOTICE, sdkp, "Cache data unavailable\n");
else
sd_printk(KERN_ERR, sdkp, "Asking for cache data failed\n");
sd_first_printk(KERN_ERR, sdkp,
"Asking for cache data failed\n");

defaults:
if (sdp->wce_default_on) {
sd_printk(KERN_NOTICE, sdkp, "Assuming drive cache: write back\n");
sd_first_printk(KERN_NOTICE, sdkp,
"Assuming drive cache: write back\n");
sdkp->WCE = 1;
} else {
sd_printk(KERN_ERR, sdkp, "Assuming drive cache: write through\n");
sd_first_printk(KERN_ERR, sdkp,
"Assuming drive cache: write through\n");
sdkp->WCE = 0;
}
sdkp->RCD = 0;
Expand Down Expand Up @@ -2513,7 +2519,7 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)

if (!scsi_status_is_good(res) || !data.header_length ||
data.length < 6) {
sd_printk(KERN_WARNING, sdkp,
sd_first_printk(KERN_WARNING, sdkp,
"getting Control mode page failed, assume no ATO\n");

if (scsi_sense_valid(&sshdr))
Expand All @@ -2525,7 +2531,7 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
offset = data.header_length + data.block_descriptor_length;

if ((buffer[offset] & 0x3f) != 0x0a) {
sd_printk(KERN_ERR, sdkp, "ATO Got wrong page\n");
sd_first_printk(KERN_ERR, sdkp, "ATO Got wrong page\n");
return;
}

Expand Down
6 changes: 6 additions & 0 deletions drivers/scsi/sd.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,12 @@ static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
(sdsk)->disk->disk_name, ##a) : \
sdev_printk(prefix, (sdsk)->device, fmt, ##a)

#define sd_first_printk(prefix, sdsk, fmt, a...) \
do { \
if ((sdkp)->first_scan) \
sd_printk(prefix, sdsk, fmt, ##a); \
} while (0)

static inline int scsi_medium_access_command(struct scsi_cmnd *scmd)
{
switch (scmd->cmnd[0]) {
Expand Down

0 comments on commit b2bff6c

Please sign in to comment.