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