From 4e85e0553b4c56b3578afc244b3b1653194bf00d Mon Sep 17 00:00:00 2001 From: dpgilbert <dpgilbert@4ea69e1a-61f1-4043-bf83-b5c94c648137> Date: Thu, 20 Nov 2003 01:03:26 +0000 Subject: [PATCH] more fine tuning on scsi "not ready", (default action is to exit) git-svn-id: https://smartmontools.svn.sourceforge.net/svnroot/smartmontools/trunk@1266 4ea69e1a-61f1-4043-bf83-b5c94c648137 --- sm5/scsicmds.c | 31 ++++++++++++++++++++----------- sm5/scsicmds.cpp | 31 ++++++++++++++++++++----------- sm5/scsiprint.c | 17 +++++++++++++---- sm5/scsiprint.cpp | 17 +++++++++++++---- 4 files changed, 66 insertions(+), 30 deletions(-) diff --git a/sm5/scsicmds.c b/sm5/scsicmds.c index 3eddcddc7..155d3a744 100644 --- a/sm5/scsicmds.c +++ b/sm5/scsicmds.c @@ -46,7 +46,7 @@ #include "utility.h" #include "extern.h" -const char *scsicmds_c_cvsid="$Id: scsicmds.c,v 1.64 2003/11/19 06:09:37 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; +const char *scsicmds_c_cvsid="$Id: scsicmds.c,v 1.65 2003/11/20 01:02:27 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; /* for passing global control variables */ extern smartmonctrl *con; @@ -143,7 +143,7 @@ const char * scsi_get_opcode_name(UINT8 opcode) void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, struct scsi_sense_disect * out) { - memset(out, 0, sizeof(out)); + memset(out, 0, sizeof(struct scsi_sense_disect)); if ((SCSI_STATUS_CHECK_CONDITION == io_buf->scsi_status) && (io_buf->resp_sense_len > 7)) { out->error_code = (io_buf->sensep[0] & 0x7f); @@ -157,9 +157,17 @@ void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, static int scsiSimpleSenseFilter(const struct scsi_sense_disect * sinfo) { - if (SCSI_SK_NOT_READY == sinfo->sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { + if (SCSI_SK_NOT_READY == sinfo->sense_key) { + if (SCSI_ASC_NO_MEDIUM == sinfo->asc) + return SIMPLE_ERR_NO_MEDIUM; + else if (SCSI_ASC_NOT_READY == sinfo->asc) { + if (0x1 == sinfo->ascq) + return SIMPLE_ERR_BECOMING_READY; + else + return SIMPLE_ERR_NOT_READY; + } else + return SIMPLE_ERR_NOT_READY; + } else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { if (SCSI_ASC_UNKNOWN_OPCODE == sinfo->asc) return SIMPLE_ERR_BAD_OPCODE; else if (SCSI_ASC_UNKNOWN_FIELD == sinfo->asc) @@ -187,6 +195,10 @@ const char * scsiErrString(int scsiErr) return "badly formed scsi parameters"; case SIMPLE_ERR_BAD_RESP: return "scsi response fails sanity test"; + case SIMPLE_ERR_NO_MEDIUM: + return "no medium present"; + case SIMPLE_ERR_BECOMING_READY: + return "device will be ready soon"; default: return "unknown error"; } @@ -680,17 +692,14 @@ int scsiTestUnitReady(int device) status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { + + if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { /* power on reset, media changed, ok ... try again */ status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_BAD_FIELD; } - return 0; + return scsiSimpleSenseFilter(&sinfo); } /* Offset into mode sense (6 or 10 byte) response that actual mode page diff --git a/sm5/scsicmds.cpp b/sm5/scsicmds.cpp index 941e2dae3..44177840c 100644 --- a/sm5/scsicmds.cpp +++ b/sm5/scsicmds.cpp @@ -46,7 +46,7 @@ #include "utility.h" #include "extern.h" -const char *scsicmds_c_cvsid="$Id: scsicmds.cpp,v 1.64 2003/11/19 06:09:37 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; +const char *scsicmds_c_cvsid="$Id: scsicmds.cpp,v 1.65 2003/11/20 01:02:27 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID; /* for passing global control variables */ extern smartmonctrl *con; @@ -143,7 +143,7 @@ const char * scsi_get_opcode_name(UINT8 opcode) void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, struct scsi_sense_disect * out) { - memset(out, 0, sizeof(out)); + memset(out, 0, sizeof(struct scsi_sense_disect)); if ((SCSI_STATUS_CHECK_CONDITION == io_buf->scsi_status) && (io_buf->resp_sense_len > 7)) { out->error_code = (io_buf->sensep[0] & 0x7f); @@ -157,9 +157,17 @@ void scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf, static int scsiSimpleSenseFilter(const struct scsi_sense_disect * sinfo) { - if (SCSI_SK_NOT_READY == sinfo->sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { + if (SCSI_SK_NOT_READY == sinfo->sense_key) { + if (SCSI_ASC_NO_MEDIUM == sinfo->asc) + return SIMPLE_ERR_NO_MEDIUM; + else if (SCSI_ASC_NOT_READY == sinfo->asc) { + if (0x1 == sinfo->ascq) + return SIMPLE_ERR_BECOMING_READY; + else + return SIMPLE_ERR_NOT_READY; + } else + return SIMPLE_ERR_NOT_READY; + } else if (SCSI_SK_ILLEGAL_REQUEST == sinfo->sense_key) { if (SCSI_ASC_UNKNOWN_OPCODE == sinfo->asc) return SIMPLE_ERR_BAD_OPCODE; else if (SCSI_ASC_UNKNOWN_FIELD == sinfo->asc) @@ -187,6 +195,10 @@ const char * scsiErrString(int scsiErr) return "badly formed scsi parameters"; case SIMPLE_ERR_BAD_RESP: return "scsi response fails sanity test"; + case SIMPLE_ERR_NO_MEDIUM: + return "no medium present"; + case SIMPLE_ERR_BECOMING_READY: + return "device will be ready soon"; default: return "unknown error"; } @@ -680,17 +692,14 @@ int scsiTestUnitReady(int device) status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_NOT_READY; - else if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { + + if (SCSI_SK_UNIT_ATTENTION == sinfo.sense_key) { /* power on reset, media changed, ok ... try again */ status = _testunitready(device, &sinfo); if (0 != status) return status; - if (SCSI_SK_NOT_READY == sinfo.sense_key) - return SIMPLE_ERR_BAD_FIELD; } - return 0; + return scsiSimpleSenseFilter(&sinfo); } /* Offset into mode sense (6 or 10 byte) response that actual mode page diff --git a/sm5/scsiprint.c b/sm5/scsiprint.c index c0fcb28d5..5323b0f2a 100644 --- a/sm5/scsiprint.c +++ b/sm5/scsiprint.c @@ -40,7 +40,7 @@ #define GBUF_SIZE 65535 -const char* scsiprint_c_cvsid="$Id: scsiprint.c,v 1.67 2003/11/19 07:50:39 ballen4705 Exp $" +const char* scsiprint_c_cvsid="$Id: scsiprint.c,v 1.68 2003/11/20 01:03:26 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID SCSIPRINT_H_CVSID SMARTCTL_H_CVSID UTILITY_H_CVSID; // control block which points to external global control variables @@ -605,6 +605,7 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) int err, iec_err, len, val; int is_tape = 0; int peri_dt = 0; + int returnval=0; memset(gBuf, 0, 36); if ((err = scsiStdInquiry(device, gBuf, 36))) { @@ -688,14 +689,22 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) if ((err = scsiTestUnitReady(device))) { if (SIMPLE_ERR_NOT_READY == err) { QUIETON(con); - pout("device is NOT READY (media absent, spun down, etc)\n"); + pout("device is NOT READY (e.g. spun down, busy)\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_NO_MEDIUM == err) { + QUIETON(con); + pout("NO MEDIUM present on device\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_BECOMING_READY == err) { + QUIETON(con); + pout("device becoming ready (wait)\n"); QUIETOFF(con); } else { QUIETON(con); pout("device Test Unit Ready [%s]\n", scsiErrString(err)); QUIETOFF(con); } - return 0; + failuretest(MANDATORY_CMD, returnval|=FAILID); } if (iec_err) { @@ -816,7 +825,7 @@ int scsiPrintMain(int fd) { int checkedSupportedLogPages = 0; UINT8 peripheral_type = 0; - int returnval=0; + int returnval = 0; int res, durationSec; if (scsiGetDriveInfo(fd, &peripheral_type, con->driveinfo)) { diff --git a/sm5/scsiprint.cpp b/sm5/scsiprint.cpp index a2544dec6..5993dafa4 100644 --- a/sm5/scsiprint.cpp +++ b/sm5/scsiprint.cpp @@ -40,7 +40,7 @@ #define GBUF_SIZE 65535 -const char* scsiprint_c_cvsid="$Id: scsiprint.cpp,v 1.67 2003/11/19 07:50:39 ballen4705 Exp $" +const char* scsiprint_c_cvsid="$Id: scsiprint.cpp,v 1.68 2003/11/20 01:03:26 dpgilbert Exp $" EXTERN_H_CVSID SCSICMDS_H_CVSID SCSIPRINT_H_CVSID SMARTCTL_H_CVSID UTILITY_H_CVSID; // control block which points to external global control variables @@ -605,6 +605,7 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) int err, iec_err, len, val; int is_tape = 0; int peri_dt = 0; + int returnval=0; memset(gBuf, 0, 36); if ((err = scsiStdInquiry(device, gBuf, 36))) { @@ -688,14 +689,22 @@ static int scsiGetDriveInfo(int device, UINT8 * peripheral_type, int all) if ((err = scsiTestUnitReady(device))) { if (SIMPLE_ERR_NOT_READY == err) { QUIETON(con); - pout("device is NOT READY (media absent, spun down, etc)\n"); + pout("device is NOT READY (e.g. spun down, busy)\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_NO_MEDIUM == err) { + QUIETON(con); + pout("NO MEDIUM present on device\n"); + QUIETOFF(con); + } else if (SIMPLE_ERR_BECOMING_READY == err) { + QUIETON(con); + pout("device becoming ready (wait)\n"); QUIETOFF(con); } else { QUIETON(con); pout("device Test Unit Ready [%s]\n", scsiErrString(err)); QUIETOFF(con); } - return 0; + failuretest(MANDATORY_CMD, returnval|=FAILID); } if (iec_err) { @@ -816,7 +825,7 @@ int scsiPrintMain(int fd) { int checkedSupportedLogPages = 0; UINT8 peripheral_type = 0; - int returnval=0; + int returnval = 0; int res, durationSec; if (scsiGetDriveInfo(fd, &peripheral_type, con->driveinfo)) { -- GitLab