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_SUPPORTED_VPD_PAGES = 0x00,
|
||||||
SCSI_INQUIRY_PAGECODE_UNIT_SERIAL_NUMBER = 0x80,
|
SCSI_INQUIRY_PAGECODE_UNIT_SERIAL_NUMBER = 0x80,
|
||||||
SCSI_INQUIRY_PAGECODE_DEVICE_IDENTIFICATION = 0x83,
|
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);
|
EXTERN const char *scsi_inquiry_pagecode_to_str(int pagecode);
|
||||||
@@ -306,6 +307,27 @@ struct scsi_inquiry_block_device_characteristics {
|
|||||||
int medium_rotation_rate;
|
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);
|
EXTERN struct scsi_task *scsi_cdb_inquiry(int evpd, int page_code, int alloc_len);
|
||||||
|
|
||||||
struct scsi_inquiry_unit_serial_number {
|
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 *)
|
inq->medium_rotation_rate = ntohs(*(uint16_t *)
|
||||||
&task->datain.data[4]);
|
&task->datain.data[4]);
|
||||||
return inq;
|
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;
|
return NULL;
|
||||||
|
|||||||
@@ -27,6 +27,18 @@
|
|||||||
const char *initiator = "iqn.2010-11.ronnie:iscsi-inq";
|
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)
|
void inquiry_block_device_characteristics(struct scsi_inquiry_block_device_characteristics *inq)
|
||||||
{
|
{
|
||||||
printf("Medium Rotation Rate:%dRPM\n", inq->medium_rotation_rate);
|
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:
|
case SCSI_INQUIRY_PAGECODE_BLOCK_DEVICE_CHARACTERISTICS:
|
||||||
inquiry_block_device_characteristics(inq);
|
inquiry_block_device_characteristics(inq);
|
||||||
break;
|
break;
|
||||||
|
case SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING:
|
||||||
|
inquiry_logical_block_provisioning(inq);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Usupported pagecode:0x%02x\n", pc);
|
fprintf(stderr, "Usupported pagecode:0x%02x\n", pc);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user