diff --git a/include/scsi-lowlevel.h b/include/scsi-lowlevel.h index 688a0f0..c8b8b37 100644 --- a/include/scsi-lowlevel.h +++ b/include/scsi-lowlevel.h @@ -284,7 +284,8 @@ enum scsi_inquiry_pagecode { SCSI_INQUIRY_PAGECODE_SUPPORTED_VPD_PAGES = 0x00, SCSI_INQUIRY_PAGECODE_UNIT_SERIAL_NUMBER = 0x80, SCSI_INQUIRY_PAGECODE_DEVICE_IDENTIFICATION = 0x83, - SCSI_INQUIRY_PAGECODE_BLOCK_DEVICE_CHARACTERISTICS = 0xB1 + SCSI_INQUIRY_PAGECODE_BLOCK_DEVICE_CHARACTERISTICS = 0xB1, + SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING = 0xB2 }; EXTERN const char *scsi_inquiry_pagecode_to_str(int pagecode); @@ -306,6 +307,27 @@ struct scsi_inquiry_block_device_characteristics { int medium_rotation_rate; }; +enum scsi_inquiry_provisioning_type { + PROVISIONING_TYPE_NONE = 0, + PROVISIONING_TYPE_RESOURCE = 1, + PROVISIONING_TYPE_THIN = 2 +}; + +struct scsi_inquiry_logical_block_provisioning { + enum scsi_inquiry_peripheral_qualifier periperal_qualifier; + enum scsi_inquiry_peripheral_device_type periperal_device_type; + enum scsi_inquiry_pagecode pagecode; + + int threshold_exponent; + int lbpu; + int lbpws; + int lbpws10; + int lbprz; + int anc_sup; + int dp; + enum scsi_inquiry_provisioning_type provisioning_type; +}; + EXTERN struct scsi_task *scsi_cdb_inquiry(int evpd, int page_code, int alloc_len); struct scsi_inquiry_unit_serial_number { diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index 465e445..7f7a38b 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -509,6 +509,29 @@ scsi_inquiry_datain_unmarshall(struct scsi_task *task) inq->medium_rotation_rate = ntohs(*(uint16_t *) &task->datain.data[4]); return inq; + } else if (task->params.inquiry.page_code + == SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING) { + struct scsi_inquiry_logical_block_provisioning *inq; + + inq = scsi_malloc(task, + sizeof(struct scsi_inquiry_logical_block_provisioning)); + if (inq == NULL) { + return NULL; + } + inq->periperal_qualifier = (task->datain.data[0]>>5)&0x07; + inq->periperal_device_type = task->datain.data[0]&0x1f; + inq->pagecode = task->datain.data[1]; + + inq->threshold_exponent = task->datain.data[4]; + inq->lbpu = !!(task->datain.data[5] & 0x80); + inq->lbpws = !!(task->datain.data[5] & 0x40); + inq->lbpws10 = !!(task->datain.data[5] & 0x20); + inq->lbprz = !!(task->datain.data[5] & 0x04); + inq->anc_sup = !!(task->datain.data[5] & 0x02); + inq->dp = !!(task->datain.data[5] & 0x01); + inq->provisioning_type = task->datain.data[6] & 0x07; + + return inq; } return NULL; diff --git a/src/iscsi-inq.c b/src/iscsi-inq.c index 21b62e8..9b123f9 100644 --- a/src/iscsi-inq.c +++ b/src/iscsi-inq.c @@ -27,6 +27,18 @@ const char *initiator = "iqn.2010-11.ronnie:iscsi-inq"; +void inquiry_logical_block_provisioning(struct scsi_inquiry_logical_block_provisioning *inq) +{ + printf("Threshold Exponent:%d\n", inq->threshold_exponent); + printf("lbpu:%d\n", inq->lbpu); + printf("lbpws:%d\n", inq->lbpws); + printf("lbpws10:%d\n", inq->lbpws10); + printf("lbprz:%d\n", inq->lbprz); + printf("anc_sup:%d\n", inq->anc_sup); + printf("dp:%d\n", inq->dp); + printf("provisioning type:%d\n", inq->provisioning_type); +} + void inquiry_block_device_characteristics(struct scsi_inquiry_block_device_characteristics *inq) { printf("Medium Rotation Rate:%dRPM\n", inq->medium_rotation_rate); @@ -142,6 +154,9 @@ void do_inquiry(struct iscsi_context *iscsi, int lun, int evpd, int pc) case SCSI_INQUIRY_PAGECODE_BLOCK_DEVICE_CHARACTERISTICS: inquiry_block_device_characteristics(inq); break; + case SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING: + inquiry_logical_block_provisioning(inq); + break; default: fprintf(stderr, "Usupported pagecode:0x%02x\n", pc); }