diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2021-08-30 21:15:57 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2021-08-30 21:15:57 +0000 |
commit | d4485d5b472462f2ee34bb18f1cef77d2c883b8e (patch) | |
tree | 6a3709bf6a6ef5ed2895c24c852281f3b3ee0580 /lib | |
parent | 5fbd329cbcb0078fc787467703a2581935405b7e (diff) | |
download | sg3_utils-d4485d5b472462f2ee34bb18f1cef77d2c883b8e.tar.gz |
improve transport error handling. To fix report of a BAD_TARGET transport error but the utility still continued. introduce SG_LIB_TRANSPORT_ERROR [35] exit status
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@910 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sg_cmds_basic.c | 38 | ||||
-rw-r--r-- | lib/sg_cmds_basic2.c | 101 | ||||
-rw-r--r-- | lib/sg_cmds_extra.c | 272 | ||||
-rw-r--r-- | lib/sg_cmds_mmc.c | 36 | ||||
-rw-r--r-- | lib/sg_io_linux.c | 11 | ||||
-rw-r--r-- | lib/sg_lib.c | 18 | ||||
-rw-r--r-- | lib/sg_lib_data.c | 20 | ||||
-rw-r--r-- | lib/sg_pt_linux.c | 5 |
8 files changed, 327 insertions, 174 deletions
diff --git a/lib/sg_cmds_basic.c b/lib/sg_cmds_basic.c index 899caae1..844018c3 100644 --- a/lib/sg_cmds_basic.c +++ b/lib/sg_cmds_basic.c @@ -42,7 +42,7 @@ #endif -static const char * const version_str = "1.98 20210601"; +static const char * const version_str = "1.99 20210830"; #define SENSE_BUFF_LEN 64 /* Arbitrary, could be larger */ @@ -434,9 +434,12 @@ sg_ll_inquiry_com(struct sg_pt_base * ptvp, int sg_fd, bool cmddt, bool evpd, resid = get_scsi_pt_resid(ptvp); if (residp) *residp = resid; - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -653,9 +656,12 @@ sg_ll_test_unit_ready_com(struct sg_pt_base * ptvp, int sg_fd, int pack_id, set_scsi_pt_packet_id(ptvp, pack_id); res = do_scsi_pt(ptvp, -1, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, tur_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { if (progress) { int slen = get_scsi_pt_sense_len(ptvp); @@ -768,9 +774,12 @@ sg_ll_request_sense_com(struct sg_pt_base * ptvp, int sg_fd, bool desc, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, -1, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, rq_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -860,9 +869,12 @@ sg_ll_report_luns_com(struct sg_pt_base * ptvp, int sg_fd, int select_report, res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, report_luns_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: diff --git a/lib/sg_cmds_basic2.c b/lib/sg_cmds_basic2.c index ba06920e..06bbda62 100644 --- a/lib/sg_cmds_basic2.c +++ b/lib/sg_cmds_basic2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2020 Douglas Gilbert. + * Copyright (c) 1999-2021 Douglas Gilbert. * All rights reserved. * Use of this source code is governed by a BSD-style * license that can be found in the BSD_LICENSE file. @@ -121,9 +121,12 @@ sg_ll_sync_cache_10(int sg_fd, bool sync_nv, bool immed, int group, set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b)); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -174,9 +177,12 @@ sg_ll_readcap_16(int sg_fd, bool pmi, uint64_t llba, void * resp, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -224,9 +230,12 @@ sg_ll_readcap_10(int sg_fd, bool pmi, unsigned int lba, void * resp, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -279,9 +288,12 @@ sg_ll_mode_sense6(int sg_fd, bool dbd, int pc, int pg_code, int sub_pg_code, res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); resid = get_scsi_pt_resid(ptvp); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -379,9 +391,12 @@ sg_ll_mode_sense10_v2(int sg_fd, bool llbaa, bool dbd, int pc, int pg_code, resid = get_scsi_pt_resid(ptvp); if (residp) *residp = resid; - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -463,9 +478,12 @@ sg_ll_mode_select6_v2(int sg_fd, bool pf, bool rtd, bool sp, void * paramp, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -531,9 +549,12 @@ sg_ll_mode_select10_v2(int sg_fd, bool pf, bool rtd, bool sp, void * paramp, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -829,9 +850,12 @@ sg_ll_log_sense_v2(int sg_fd, bool ppc, bool sp, int pc, int pg_code, resid = get_scsi_pt_resid(ptvp); if (residp) *residp = resid; - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -908,9 +932,12 @@ sg_ll_log_select(int sg_fd, bool pcr, bool sp, int pc, int pg_code, set_scsi_pt_data_out(ptvp, paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -985,9 +1012,12 @@ sg_ll_start_stop_unit_com(struct sg_pt_base * ptvp, int sg_fd, bool immed, } res = do_scsi_pt(ptvp, -1, START_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1065,9 +1095,12 @@ sg_ll_prevent_allow(int sg_fd, int prevent, bool noisy, int verbose) set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b)); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: diff --git a/lib/sg_cmds_extra.c b/lib/sg_cmds_extra.c index e55e8075..cbcc8444 100644 --- a/lib/sg_cmds_extra.c +++ b/lib/sg_cmds_extra.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2020 Douglas Gilbert. + * Copyright (c) 1999-2021 Douglas Gilbert. * All rights reserved. * Use of this source code is governed by a BSD-style * license that can be found in the BSD_LICENSE file. @@ -150,9 +150,12 @@ sg_ll_get_lba_status16(int sg_fd, uint64_t start_llba, uint8_t rt, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, alloc_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -226,9 +229,12 @@ sg_ll_get_lba_status32(int sg_fd, uint64_t start_llba, uint32_t scan_len, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, alloc_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -296,9 +302,12 @@ sg_ll_report_tgt_prt_grp2(int sg_fd, void * resp, int mx_resp_len, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -360,9 +369,12 @@ sg_ll_set_tgt_prt_grp(int sg_fd, void * paramp, int param_len, bool noisy, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -412,9 +424,12 @@ sg_ll_report_referrals(int sg_fd, uint64_t start_llba, bool one_seg, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -512,9 +527,12 @@ sg_ll_send_diag_com(struct sg_pt_base * ptvp, int sg_fd, int st_code, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, -1, tmout, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -616,9 +634,12 @@ sg_ll_receive_diag_com(struct sg_pt_base * ptvp, int sg_fd, bool pcv, resid = get_scsi_pt_resid(ptvp); if (residp) *residp = resid; - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -722,9 +743,12 @@ sg_ll_read_defect10(int sg_fd, bool req_plist, bool req_glist, int dl_format, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -782,9 +806,12 @@ sg_ll_read_media_serial_num(int sg_fd, void * resp, int mx_resp_len, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -845,9 +872,12 @@ sg_ll_report_id_info(int sg_fd, int itype, void * resp, int max_resp_len, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, max_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -911,9 +941,12 @@ sg_ll_set_id_info(int sg_fd, int itype, void * paramp, int param_len, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1004,9 +1037,12 @@ sg_ll_format_unit_v2(int sg_fd, int fmtpinfo, bool longlist, bool fmtdata, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, tmout, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1059,9 +1095,12 @@ sg_ll_reassign_blocks(int sg_fd, bool longlba, bool longlist, void * paramp, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1111,9 +1150,12 @@ sg_ll_persistent_reserve_in(int sg_fd, int rq_servact, void * resp, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1180,9 +1222,12 @@ sg_ll_persistent_reserve_out(int sg_fd, int rq_servact, int rq_scope, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1256,9 +1301,12 @@ sg_ll_read_long10(int sg_fd, bool pblock, bool correct, unsigned int lba, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, xfer_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1346,9 +1394,12 @@ sg_ll_read_long16(int sg_fd, bool pblock, bool correct, uint64_t llba, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, xfer_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1437,9 +1488,12 @@ sg_ll_write_long10(int sg_fd, bool cor_dis, bool wr_uncor, bool pblock, set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, xfer_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1517,9 +1571,12 @@ sg_ll_write_long16(int sg_fd, bool cor_dis, bool wr_uncor, bool pblock, set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, xfer_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1602,9 +1659,12 @@ sg_ll_verify10(int sg_fd, int vrprotect, bool dpo, int bytchk, set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, data_out_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1681,9 +1741,12 @@ sg_ll_verify16(int sg_fd, int vrprotect, bool dpo, int bytchk, uint64_t llba, set_scsi_pt_data_out(ptvp, (uint8_t *)data_out, data_out_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1921,9 +1984,12 @@ sg_ll_read_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -1994,9 +2060,12 @@ sg_ll_write_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -2071,9 +2140,12 @@ sg_ll_write_buffer_v2(int sg_fd, int mode, int m_specific, int buffer_id, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, timeout_secs, vb); ret = sg_cmds_process_resp(ptvp, "Write buffer", res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -2137,9 +2209,12 @@ sg_ll_unmap_v2(int sg_fd, bool anchor, int group_num, int timeout_secs, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, tmout, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -2183,9 +2258,12 @@ sg_ll_read_block_limits(int sg_fd, void * resp, int mx_resp_len, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -2250,9 +2328,12 @@ sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, b, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -2309,9 +2390,12 @@ sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, bool noisy, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, vb); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -2386,9 +2470,12 @@ sg_ll_3party_copy_out(int sg_fd, int sa, unsigned int list_id, int group_num, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, tmout, vb); ret = sg_cmds_process_resp(ptvp, cname, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: @@ -2490,9 +2577,12 @@ sg_ll_pre_fetch_x(int sg_fd, bool do_seek10, bool cdb16, bool immed, } } ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, vb, &s_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (s_cat) { case SG_LIB_CAT_RECOVERED: case SG_LIB_CAT_NO_SENSE: diff --git a/lib/sg_cmds_mmc.c b/lib/sg_cmds_mmc.c index c1dabd74..e3629559 100644 --- a/lib/sg_cmds_mmc.c +++ b/lib/sg_cmds_mmc.c @@ -84,9 +84,12 @@ sg_ll_set_cd_speed(int sg_fd, int rot_control, int drv_read_speed, set_scsi_pt_sense(ptvp, sense_b, sizeof(sense_b)); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_NOT_READY: case SG_LIB_CAT_UNIT_ATTENTION: @@ -157,9 +160,12 @@ sg_ll_get_config(int sg_fd, int rt, int starting, void * resp, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_INVALID_OP: case SG_LIB_CAT_ILLEGAL_REQ: @@ -250,9 +256,12 @@ sg_ll_get_performance(int sg_fd, int data_type, unsigned int starting_lba, set_scsi_pt_data_in(ptvp, (uint8_t *)resp, mx_resp_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_INVALID_OP: case SG_LIB_CAT_ILLEGAL_REQ: @@ -332,9 +341,12 @@ sg_ll_set_streaming(int sg_fd, int type, void * paramp, int param_len, set_scsi_pt_data_out(ptvp, (uint8_t *)paramp, param_len); res = do_scsi_pt(ptvp, sg_fd, DEF_PT_TIMEOUT, verbose); ret = sg_cmds_process_resp(ptvp, cdb_s, res, noisy, verbose, &sense_cat); - if (-1 == ret) - ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); - else if (-2 == ret) { + if (-1 == ret) { + if (get_scsi_pt_transport_err(ptvp)) + ret = SG_LIB_TRANSPORT_ERROR; + else + ret = sg_convert_errno(get_scsi_pt_os_err(ptvp)); + } else if (-2 == ret) { switch (sense_cat) { case SG_LIB_CAT_NOT_READY: case SG_LIB_CAT_INVALID_OP: diff --git a/lib/sg_io_linux.c b/lib/sg_io_linux.c index 25ccb47d..9bd4b7eb 100644 --- a/lib/sg_io_linux.c +++ b/lib/sg_io_linux.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2020 Douglas Gilbert. + * Copyright (c) 1999-2021 Douglas Gilbert. * All rights reserved. * Use of this source code is governed by a BSD-style * license that can be found in the BSD_LICENSE file. @@ -24,7 +24,7 @@ #include "sg_pr2serr.h" -/* Version 1.11 20200401 */ +/* Version 1.12 20210830 */ void @@ -43,7 +43,7 @@ static const char * linux_host_bytes[] = { "DID_RESET", "DID_BAD_INTR", "DID_PASSTHROUGH", "DID_SOFT_ERROR", "DID_IMM_RETRY", "DID_REQUEUE", "DID_TRANSPORT_DISRUPTED", "DID_TRANSPORT_FAILFAST", "DID_TARGET_FAILURE", "DID_NEXUS_FAILURE", - "DID_ALLOC_FAILURE", "DID_MEDIUM_ERROR", + "DID_ALLOC_FAILURE", "DID_MEDIUM_ERROR", "DID_TRANSPORT_MARGINAL", }; void @@ -57,8 +57,9 @@ sg_print_host_status(int host_status) pr2ws("[%s] ", linux_host_bytes[host_status]); } -/* DRIVER_* are Linux SCSI result (a 32 bit variable) bits 24:27 */ - +/* DRIVER_* are Linux SCSI result (a 32 bit variable) bits 24:27 . + * These where made obsolete around lk 5.12.0 . Only DRIVER_SENSE [0x8] is + * defined in scsi/sg.h for backward comaptibility */ static const char * linux_driver_bytes[] = { "DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA", "DRIVER_ERROR", "DRIVER_INVALID", "DRIVER_TIMEOUT", "DRIVER_HARD", diff --git a/lib/sg_lib.c b/lib/sg_lib.c index c5eeeddc..02102a1c 100644 --- a/lib/sg_lib.c +++ b/lib/sg_lib.c @@ -245,22 +245,6 @@ sg_print_command(const uint8_t * cdbp) sg_print_command_len(cdbp, 0); } -/* SCSI Status values */ -static const struct sg_lib_simple_value_name_t sstatus_str_arr[] = { - {0x0, "Good"}, - {0x2, "Check Condition"}, - {0x4, "Condition Met"}, - {0x8, "Busy"}, - {0x10, "Intermediate (obsolete)"}, - {0x14, "Intermediate-Condition Met (obsolete)"}, - {0x18, "Reservation Conflict"}, - {0x22, "Command terminated (obsolete)"}, - {0x28, "Task Set Full"}, - {0x30, "ACA Active"}, - {0x40, "Task Aborted"}, - {0xffff, NULL}, -}; - bool sg_scsi_status_is_good(int sstatus) { @@ -299,7 +283,7 @@ sg_get_scsi_status_str(int scsi_status, int buff_len, char * buff) return; } scsi_status &= 0x7e; /* sanitize as much as possible */ - for (sstatus_p = sstatus_str_arr; sstatus_p->name; ++sstatus_p) { + for (sstatus_p = sg_lib_sstatus_str_arr; sstatus_p->name; ++sstatus_p) { if (scsi_status == sstatus_p->value) break; } diff --git a/lib/sg_lib_data.c b/lib/sg_lib_data.c index ff89ac79..a132d1cb 100644 --- a/lib/sg_lib_data.c +++ b/lib/sg_lib_data.c @@ -19,7 +19,7 @@ #include "sg_lib_data.h" -const char * sg_lib_version_str = "2.81 20210526"; +const char * sg_lib_version_str = "2.82 20210830"; /* spc6r05, sbc5r01, zbc2r10 */ @@ -34,6 +34,22 @@ int sg_lib_pdt_decay_arr[32] = { 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, PDT_WLUN, PDT_UNKNOWN }; +/* SCSI Status values */ +struct sg_lib_simple_value_name_t sg_lib_sstatus_str_arr[] = { + {0x0, "Good"}, + {0x2, "Check Condition"}, + {0x4, "Condition Met"}, + {0x8, "Busy"}, + {0x10, "Intermediate (obsolete)"}, + {0x14, "Intermediate-Condition Met (obsolete)"}, + {0x18, "Reservation Conflict"}, + {0x22, "Command terminated (obsolete)"}, + {0x28, "Task Set Full"}, + {0x30, "ACA Active"}, + {0x40, "Task Aborted"}, + {0xffff, NULL}, +}; + #ifdef SG_SCSI_STRINGS struct sg_lib_value_name_t sg_lib_normal_opcodes[] = { {0, 0, "Test Unit Ready"}, @@ -1805,6 +1821,8 @@ struct sg_value_2names_t sg_exit_str_arr[] = { {31, "Contradict", "command line options contradict or select bad mode"}, {32, "Logic error", "unexpected situation, contact author"}, {33, "SCSI command timeout", NULL}, /* OS timed out command */ + {34, "Windows error number", "doesn't fit in 7 bits"}, + {35, "Transport error", "driver or interconnect error"}, {36, "No errors (false)", NULL}, {40, "Aborted command, protection error", NULL}, {41, "Aborted command, protection error with Info field", NULL}, diff --git a/lib/sg_pt_linux.c b/lib/sg_pt_linux.c index cd9083d0..c6fb9755 100644 --- a/lib/sg_pt_linux.c +++ b/lib/sg_pt_linux.c @@ -7,7 +7,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -/* sg_pt_linux version 1.52 20210423 */ +/* sg_pt_linux version 1.53 20210830 */ #include <stdio.h> @@ -71,8 +71,11 @@ static const char * linux_host_bytes[] = { "DID_NEXUS_FAILURE (reservation conflict)", "DID_ALLOC_FAILURE", "DID_MEDIUM_ERROR", + "DID_TRANSPORT_MARGINAL", /*0x14 */ }; +/* These where made obsolete around lk 5.12.0 . Only DRIVER_SENSE [0x8] is + * defined in scsi/sg.h for backward comaptibility */ static const char * linux_driver_bytes[] = { "DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA", "DRIVER_ERROR", "DRIVER_INVALID", "DRIVER_TIMEOUT", "DRIVER_HARD", |