Add support for INQUIRY LOGICAL_BLOCK_PROVISIONING page
Signed-off-by: Ronnie Sahlberg <ronniesahlberg@gmail.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user