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