|
|
b7ad53 |
diff -Nur libstoragemgmt-1.4.0-old/c_binding/libsg.c libstoragemgmt-1.4.0/c_binding/libsg.c
|
|
|
b7ad53 |
--- libstoragemgmt-1.4.0-old/c_binding/libsg.c 2017-02-14 20:32:40.000000000 +0800
|
|
|
b7ad53 |
+++ libstoragemgmt-1.4.0/c_binding/libsg.c 2017-11-02 14:55:07.995067999 +0800
|
|
|
b7ad53 |
@@ -132,6 +132,16 @@
|
|
|
b7ad53 |
uint8_t supported_vpd_list_begin;
|
|
|
b7ad53 |
};
|
|
|
b7ad53 |
|
|
|
b7ad53 |
+/*
|
|
|
b7ad53 |
+ * SAT-4 rev 06 Table 188 - ATA Information VPD page
|
|
|
b7ad53 |
+ *
|
|
|
b7ad53 |
+ */
|
|
|
b7ad53 |
+#define _T10_SAT_ATA_INFO_VPD_PAGE_MAX_LEN 572
|
|
|
b7ad53 |
+
|
|
|
b7ad53 |
+/*
|
|
|
b7ad53 |
+ * SBC-4 rev 14 Table 261 - Block Device Characteristics VPD page
|
|
|
b7ad53 |
+ */
|
|
|
b7ad53 |
+#define _T10_SBC_VPD_BLK_DEV_CHA_MAX_LEN 64
|
|
|
b7ad53 |
|
|
|
b7ad53 |
struct _sg_t10_sense_header {
|
|
|
b7ad53 |
uint8_t response_code : 7;
|
|
|
b7ad53 |
@@ -252,6 +262,7 @@
|
|
|
b7ad53 |
char strerr_buff[_LSM_ERR_MSG_LEN];
|
|
|
b7ad53 |
uint8_t sense_key = _T10_SPC_SENSE_KEY_NO_SENSE;
|
|
|
b7ad53 |
char sense_err_msg[_LSM_ERR_MSG_LEN];
|
|
|
b7ad53 |
+ ssize_t data_len = 0;
|
|
|
b7ad53 |
|
|
|
b7ad53 |
assert(err_msg != NULL);
|
|
|
b7ad53 |
assert(fd >= 0);
|
|
|
b7ad53 |
@@ -259,22 +270,33 @@
|
|
|
b7ad53 |
|
|
|
b7ad53 |
memset(sense_err_msg, 0, _LSM_ERR_MSG_LEN);
|
|
|
b7ad53 |
|
|
|
b7ad53 |
+ switch(page_code) {
|
|
|
b7ad53 |
+ case _SG_T10_SPC_VPD_ATA_INFO:
|
|
|
b7ad53 |
+ data_len = _T10_SAT_ATA_INFO_VPD_PAGE_MAX_LEN;
|
|
|
b7ad53 |
+ break;
|
|
|
b7ad53 |
+ case _SG_T10_SBC_VPD_BLK_DEV_CHA:
|
|
|
b7ad53 |
+ data_len = _T10_SBC_VPD_BLK_DEV_CHA_MAX_LEN;
|
|
|
b7ad53 |
+ break;
|
|
|
b7ad53 |
+ default:
|
|
|
b7ad53 |
+ data_len = _SG_T10_SPC_VPD_MAX_LEN;
|
|
|
b7ad53 |
+ }
|
|
|
b7ad53 |
+
|
|
|
b7ad53 |
/* SPC-5 Table 142 - INQUIRY command */
|
|
|
b7ad53 |
cdb[0] = INQUIRY; /* OPERATION CODE */
|
|
|
b7ad53 |
cdb[1] = 1; /* EVPD */
|
|
|
b7ad53 |
/* VPD INQUIRY requires EVPD == 1 */;
|
|
|
b7ad53 |
cdb[2] = page_code & UINT8_MAX; /* PAGE CODE */
|
|
|
b7ad53 |
- cdb[3] = (_SG_T10_SPC_VPD_MAX_LEN >> 8 )& UINT8_MAX;
|
|
|
b7ad53 |
+ cdb[3] = (data_len >> 8 )& UINT8_MAX;
|
|
|
b7ad53 |
/* ALLOCATION LENGTH, MSB */
|
|
|
b7ad53 |
- cdb[4] = _SG_T10_SPC_VPD_MAX_LEN & UINT8_MAX;
|
|
|
b7ad53 |
+ cdb[4] = data_len & UINT8_MAX;
|
|
|
b7ad53 |
/* ALLOCATION LENGTH, LSB */
|
|
|
b7ad53 |
cdb[5] = 0; /* CONTROL */
|
|
|
b7ad53 |
/* We have no use case need for handling auto contingent allegiance(ACA)
|
|
|
b7ad53 |
* yet.
|
|
|
b7ad53 |
*/
|
|
|
b7ad53 |
|
|
|
b7ad53 |
- ioctl_errno = _sg_io(fd, cdb, _T10_SPC_INQUIRY_CMD_LEN, data,
|
|
|
b7ad53 |
- _SG_T10_SPC_VPD_MAX_LEN, sense_data, _SG_IO_RECV_DATA);
|
|
|
b7ad53 |
+ ioctl_errno = _sg_io(fd, cdb, _T10_SPC_INQUIRY_CMD_LEN, data, data_len,
|
|
|
b7ad53 |
+ sense_data, _SG_IO_RECV_DATA);
|
|
|
b7ad53 |
|
|
|
b7ad53 |
if (ioctl_errno != 0) {
|
|
|
b7ad53 |
if (page_code == _SG_T10_SPC_VPD_SUP_VPD_PGS) {
|