Blob Blame History Raw
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) {