diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2018-06-16 03:47:09 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2018-06-16 03:47:09 +0000 |
commit | 11f6f1f439415e57696f473b1475f190018741c7 (patch) | |
tree | 257a3b14baae2b5f3860e04bdbfde2ca0f4715e2 /src/sg_persist.c | |
parent | e05f7acda57fbbbad555df38fef89aa70447b590 (diff) | |
download | sg3_utils-11f6f1f439415e57696f473b1475f190018741c7.tar.gz |
rescan-scsi-bus.sh: add --ignore-rev; sg_persist: add RLR_C bit to Read capabilities; sg_pt_freebsd+win32: fix SNTL error crashes
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@778 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src/sg_persist.c')
-rw-r--r-- | src/sg_persist.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/src/sg_persist.c b/src/sg_persist.c index 0158bb5e..919aad6f 100644 --- a/src/sg_persist.c +++ b/src/sg_persist.c @@ -33,7 +33,7 @@ #include "sg_unaligned.h" #include "sg_pr2serr.h" -static const char * version_str = "0.65 20180523"; +static const char * version_str = "0.66 20180615"; #define PRIN_RKEY_SA 0x0 @@ -71,9 +71,9 @@ struct opts_t { int prin_sa; int prout_sa; int verbose; - unsigned int alloc_len; - unsigned int param_rtp; - unsigned int prout_type; + uint32_t alloc_len; + uint32_t param_rtp; + uint32_t prout_type; uint64_t param_rk; uint64_t param_sark; uint8_t transportid_arr[MX_TIDS * MX_TID_LEN]; @@ -276,13 +276,12 @@ prin_work(int sg_fd, const struct opts_t * op) uint8_t * bp; uint8_t * pr_buff = NULL; uint8_t * free_pr_buff = NULL; - int pr_buff_sz = MX_ALLOC_LEN; - pr_buff = sg_memalign(pr_buff_sz, 0 /* page aligned */, &free_pr_buff, + pr_buff = sg_memalign(op->alloc_len, 0 /* page aligned */, &free_pr_buff, false); if (NULL == pr_buff) { pr2serr("%s: unable to allocate %d bytes on heap\n", __func__, - pr_buff_sz); + op->alloc_len); return sg_convert_errno(ENOMEM); } res = sg_ll_persistent_reserve_in(sg_fd, op->prin_sa, pr_buff, @@ -319,6 +318,8 @@ prin_work(int sg_fd, const struct opts_t * op) hex2stdout(pr_buff, 8, 1); else { printf("Report capabilities response:\n"); + printf(" Replace Lost Reservation Capable(RLR_C): %d\n", + !!(pr_buff[2] & 0x80)); /* added spc4r26 */ printf(" Compatible Reservation Handling(CRH): %d\n", !!(pr_buff[2] & 0x10)); printf(" Specify Initiator Ports Capable(SIP_C): %d\n", @@ -334,17 +335,17 @@ prin_work(int sg_fd, const struct opts_t * op) if (pr_buff[3] & 0x80) { printf(" Support indicated in Type mask:\n"); printf(" %s: %d\n", pr_type_strs[7], - !!(pr_buff[4] & 0x80)); + !!(pr_buff[4] & 0x80)); /* WR_EX_AR */ printf(" %s: %d\n", pr_type_strs[6], - !!(pr_buff[4] & 0x40)); + !!(pr_buff[4] & 0x40)); /* EX_AC_RO */ printf(" %s: %d\n", pr_type_strs[5], - !!(pr_buff[4] & 0x20)); + !!(pr_buff[4] & 0x20)); /* WR_EX_RO */ printf(" %s: %d\n", pr_type_strs[3], - !!(pr_buff[4] & 0x8)); + !!(pr_buff[4] & 0x8)); /* EX_AC */ printf(" %s: %d\n", pr_type_strs[1], - !!(pr_buff[4] & 0x2)); + !!(pr_buff[4] & 0x2)); /* WR_EX */ printf(" %s: %d\n", pr_type_strs[8], - !!(pr_buff[5] & 0x1)); + !!(pr_buff[5] & 0x1)); /* EX_AC_AR */ } } } else { @@ -357,10 +358,10 @@ prin_work(int sg_fd, const struct opts_t * op) printf(" PR generation=0x%x, ", pr_gen); if (add_len <= 0) printf("Additional length=%d\n", add_len); - if (add_len > (pr_buff_sz - 8)) { + if ((uint32_t)add_len > (op->alloc_len - 8)) { printf("Additional length too large=%d, truncate\n", add_len); - hex2stdout((pr_buff + 8), pr_buff_sz - 8, 1); + hex2stdout((pr_buff + 8), op->alloc_len - 8, 1); } else { printf("Additional length=%d\n", add_len); hex2stdout((pr_buff + 8), add_len, 1); @@ -477,16 +478,15 @@ prout_work(int sg_fd, struct opts_t * op) int res = 0; uint8_t * pr_buff = NULL; uint8_t * free_pr_buff = NULL; - int pr_buff_sz = MX_ALLOC_LEN; char b[64]; char bb[80]; t_arr_len = compact_transportid_array(op); - pr_buff = sg_memalign(pr_buff_sz, 0 /* page aligned */, &free_pr_buff, + pr_buff = sg_memalign(op->alloc_len, 0 /* page aligned */, &free_pr_buff, false); if (NULL == pr_buff) { pr2serr("%s: unable to allocate %d bytes on heap\n", __func__, - pr_buff_sz); + op->alloc_len); return sg_convert_errno(ENOMEM); } sg_put_unaligned_be64(op->param_rk, pr_buff + 0); @@ -537,14 +537,13 @@ prout_reg_move_work(int sg_fd, struct opts_t * op) int res = 0; uint8_t * pr_buff = NULL; uint8_t * free_pr_buff = NULL; - int pr_buff_sz = MX_ALLOC_LEN; t_arr_len = compact_transportid_array(op); - pr_buff = sg_memalign(pr_buff_sz, 0 /* page aligned */, &free_pr_buff, + pr_buff = sg_memalign(op->alloc_len, 0 /* page aligned */, &free_pr_buff, false); if (NULL == pr_buff) { pr2serr("%s: unable to allocate %d bytes on heap\n", __func__, - pr_buff_sz); + op->alloc_len); return sg_convert_errno(ENOMEM); } sg_put_unaligned_be64(op->param_rk, pr_buff + 0); |