aboutsummaryrefslogtreecommitdiff
path: root/lib/sg_cmds_basic.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2015-12-20 16:23:44 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2015-12-20 16:23:44 +0000
commit9fbc884d5e7900d4edab95d18dc16d5ca8caa5b5 (patch)
treebeedd798f77493980f389ccc4ef58a3489cfbbaf /lib/sg_cmds_basic.c
parente359da1369caf436878cd05386b83b54359ecce1 (diff)
downloadsg3_utils-9fbc884d5e7900d4edab95d18dc16d5ca8caa5b5.tar.gz
rescan-scsi-bus.sh: updates from Suse; sg_lib: add 'sense' categories for SCSI statuses; pr2serr() rework; drop SUGGEST_*
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@654 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib/sg_cmds_basic.c')
-rw-r--r--lib/sg_cmds_basic.c51
1 files changed, 41 insertions, 10 deletions
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c
index 0ede2d84..2083913a 100644
--- a/lib/sg_cmds_basic.c
+++ b/lib/sg_cmds_basic.c
@@ -176,7 +176,7 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
int pt_res, int mx_di_len, const unsigned char * sbp,
int noisy, int verbose, int * o_sense_cat)
{
- int got, cat, duration, slen, resid, resp_code, sstat;
+ int got, cat, duration, slen, resid, resp_code, sstat, transport_sense;
char b[1024];
if (NULL == leadin)
@@ -213,7 +213,7 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
slen = get_scsi_pt_sense_len(ptvp);
switch ((cat = get_scsi_pt_result_category(ptvp))) {
case SCSI_PT_RESULT_GOOD:
- if (slen > 7) {
+ if (sbp && (slen > 7)) {
resp_code = sbp[0] & 0x7f;
/* SBC referrals can have status=GOOD and sense_key=COMPLETED */
if (resp_code >= 0x70) {
@@ -228,18 +228,44 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
}
if (mx_di_len > 0) {
got = mx_di_len - resid;
- if ((verbose > 1) && (resid > 0))
+ if ((verbose > 1) && (resid != 0))
pr2ws(" %s: pass-through requested %d bytes (data-in) "
"but got %d bytes\n", leadin, mx_di_len, got);
- return got;
+ if (got >= 0)
+ return got;
+ else {
+ if (verbose)
+ pr2ws(" %s: pass-through can't get negative bytes, "
+ "say it got none\n", leadin);
+ return 0;
+ }
} else
return 0;
case SCSI_PT_RESULT_STATUS: /* other than GOOD and CHECK CONDITION */
sstat = get_scsi_pt_status_response(ptvp);
- if ((SAM_STAT_RESERVATION_CONFLICT == sstat) && o_sense_cat) {
- /* treat this SCSI status as "sense" category */
- *o_sense_cat = SG_LIB_CAT_RES_CONFLICT;
- return -2;
+ if (o_sense_cat) {
+ switch (sstat) {
+ case SAM_STAT_RESERVATION_CONFLICT:
+ *o_sense_cat = SG_LIB_CAT_RES_CONFLICT;
+ return -2;
+ case SAM_STAT_CONDITION_MET:
+ *o_sense_cat = SG_LIB_CAT_CONDITION_MET;
+ return -2;
+ case SAM_STAT_BUSY:
+ *o_sense_cat = SG_LIB_CAT_BUSY;
+ return -2;
+ case SAM_STAT_TASK_SET_FULL:
+ *o_sense_cat = SG_LIB_CAT_TS_FULL;
+ return -2;
+ case SAM_STAT_ACA_ACTIVE:
+ *o_sense_cat = SG_LIB_CAT_ACA_ACTIVE;
+ return -2;
+ case SAM_STAT_TASK_ABORTED:
+ *o_sense_cat = SG_LIB_CAT_TASK_ABORTED;
+ return -2;
+ default:
+ break;
+ }
}
if (verbose || noisy) {
sg_get_scsi_status_str(sstat, sizeof(b), b);
@@ -254,8 +280,13 @@ sg_cmds_process_resp(struct sg_pt_base * ptvp, const char * leadin,
get_scsi_pt_transport_err_str(ptvp, sizeof(b), b);
pr2ws("%s: transport: %s\n", leadin, b);
}
- if ((SAM_STAT_CHECK_CONDITION == get_scsi_pt_status_response(ptvp))
- && (slen > 0))
+#ifdef SG_LIB_LINUX
+ transport_sense = (slen > 0);
+#else
+ transport_sense = ((SAM_STAT_CHECK_CONDITION ==
+ get_scsi_pt_status_response(ptvp)) && (slen > 0));
+#endif
+ if (transport_sense)
return sg_cmds_process_helper(leadin, mx_di_len, resid, sbp,
slen, noisy, verbose, o_sense_cat);
else