Blame SOURCES/0001-LocalDisk-Fix-incorrect-VPD-query-for-0x89-and-0xb1.patch

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) {