From: "Ewan D. Milne" <[email protected]>

Avoid duplicate tests when examining sense data for FM/EOM/ILI
bits.  Moved extraction of status to scsi_normalize_sense() if
the config option CONFIG_SCSI_ENHANCED_UA is used, because
descriptor format sense data is already being parsed there.

Signed-off-by: Ewan D. Milne <[email protected]>
---
 drivers/scsi/scsi_error.c | 16 +++++++++++++++-
 include/scsi/scsi_eh.h    |  3 +++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index d0b5a26..3ad001e 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -340,6 +340,10 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
         * Previous logic looked for FILEMARK, EOM or ILI which are
         * mainly associated with tapes and returned SUCCESS.
         */
+#ifdef CONFIG_SCSI_ENHANCED_UA
+       if (sshdr.fm_eom_ili)
+               return SUCCESS;
+#else
        if (sshdr.response_code == 0x70) {
                /* fixed format */
                if (scmd->sense_buffer[2] & 0xe0)
@@ -355,6 +359,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
                    (scmd->sense_buffer[11] & 0xe0))
                        return SUCCESS;
        }
+#endif
 
        switch (sshdr.sense_key) {
        case NO_SENSE:
@@ -2198,6 +2203,11 @@ int scsi_normalize_sense(const u8 *sense_buffer, int 
sb_len,
                                    ((sense_buffer[desc_pos + 4] & 0x01) != 0))
                                        sshdr->ua_queue_overflow = 1;
 
+                               if ((desc_type == 0x04) && (desc_len >= 4) &&
+                                   (addl_len >= 2) &&
+                                   ((sense_buffer[desc_pos + 3] & 0xe0) != 0))
+                                       sshdr->fm_eom_ili = 1;
+
                                if (addl_len > (desc_len - 2))
                                        addl_len = desc_len - 2;
 
@@ -2210,8 +2220,12 @@ int scsi_normalize_sense(const u8 *sense_buffer, int 
sb_len,
                /*
                 * fixed format
                 */
-               if (sb_len > 2)
+               if (sb_len > 2) {
+#ifdef CONFIG_SCSI_ENHANCED_UA
+                       sshdr->fm_eom_ili = ((sense_buffer[2] & 0xe0) != 0);
+#endif
                        sshdr->sense_key = (sense_buffer[2] & 0xf);
+               }
                if (sb_len > 7) {
                        sb_len = (sb_len < (sense_buffer[7] + 8)) ?
                                         sb_len : (sense_buffer[7] + 8);
diff --git a/include/scsi/scsi_eh.h b/include/scsi/scsi_eh.h
index b6c4d3d..d53a1d2 100644
--- a/include/scsi/scsi_eh.h
+++ b/include/scsi/scsi_eh.h
@@ -27,6 +27,9 @@ struct scsi_sense_hdr {               /* See SPC-3 section 
4.5 */
        u8 additional_length;   /* always 0 for fixed sense format */
 #ifdef CONFIG_SCSI_ENHANCED_UA
        unsigned int ua_queue_overflow:1;       /* UA info lost by device */
+
+       unsigned int fm_eom_ili:1;      /* filemark, end of medium, or
+                                          incorrect length indicator set */
 #endif
 };
 
-- 
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to