Add support for READ6
This commit is contained in:
@@ -582,6 +582,34 @@ iscsi_readcapacity10_task(struct iscsi_context *iscsi, int lun, int lba,
|
||||
return task;
|
||||
}
|
||||
|
||||
struct scsi_task *
|
||||
iscsi_read6_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
|
||||
uint32_t datalen, int blocksize,
|
||||
iscsi_command_cb cb, void *private_data)
|
||||
{
|
||||
struct scsi_task *task;
|
||||
|
||||
if (datalen % blocksize != 0) {
|
||||
iscsi_set_error(iscsi, "Datalen:%d is not a multiple of "
|
||||
"the blocksize:%d.", datalen, blocksize);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
task = scsi_cdb_read6(lba, datalen, blocksize);
|
||||
if (task == NULL) {
|
||||
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
|
||||
"read6 cdb.");
|
||||
return NULL;
|
||||
}
|
||||
if (iscsi_scsi_command_async(iscsi, lun, task, cb, NULL,
|
||||
private_data) != 0) {
|
||||
scsi_free_scsi_task(task);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
struct scsi_task *
|
||||
iscsi_read10_task(struct iscsi_context *iscsi, int lun, uint32_t lba,
|
||||
uint32_t datalen, int blocksize,
|
||||
|
||||
@@ -505,6 +505,50 @@ scsi_inquiry_datain_unmarshall(struct scsi_task *task)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* READ6
|
||||
*/
|
||||
struct scsi_task *
|
||||
scsi_cdb_read6(uint32_t lba, uint32_t xferlen, int blocksize)
|
||||
{
|
||||
struct scsi_task *task;
|
||||
int num_blocks;
|
||||
|
||||
num_blocks = xferlen/blocksize;
|
||||
if (num_blocks > 265) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (lba > 0x1fffff) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
task = malloc(sizeof(struct scsi_task));
|
||||
if (task == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(task, 0, sizeof(struct scsi_task));
|
||||
task->cdb[0] = SCSI_OPCODE_READ6;
|
||||
task->cdb_size = 6;
|
||||
|
||||
task->cdb[1] = (lba>>16)&0x1f;
|
||||
task->cdb[2] = (lba>> 8)&0xff;
|
||||
task->cdb[3] = (lba )&0xff;
|
||||
|
||||
if (num_blocks < 256) {
|
||||
task->cdb[4] = num_blocks;
|
||||
}
|
||||
|
||||
task->xfer_dir = SCSI_XFER_READ;
|
||||
task->expxferlen = xferlen;
|
||||
|
||||
task->params.read6.lba = lba;
|
||||
task->params.read6.num_blocks = num_blocks;
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
/*
|
||||
* READ10
|
||||
*/
|
||||
|
||||
20
lib/sync.c
20
lib/sync.c
@@ -216,6 +216,26 @@ iscsi_inquiry_sync(struct iscsi_context *iscsi, int lun, int evpd,
|
||||
return state.task;
|
||||
}
|
||||
|
||||
struct scsi_task *
|
||||
iscsi_read6_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
|
||||
uint32_t datalen, int blocksize)
|
||||
{
|
||||
struct iscsi_sync_state state;
|
||||
|
||||
memset(&state, 0, sizeof(state));
|
||||
|
||||
if (iscsi_read6_task(iscsi, lun, lba, datalen, blocksize,
|
||||
scsi_sync_cb, &state) == NULL) {
|
||||
iscsi_set_error(iscsi,
|
||||
"Failed to send Read6 command");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
event_loop(iscsi, &state);
|
||||
|
||||
return state.task;
|
||||
}
|
||||
|
||||
struct scsi_task *
|
||||
iscsi_read10_sync(struct iscsi_context *iscsi, int lun, uint32_t lba,
|
||||
uint32_t datalen, int blocksize)
|
||||
|
||||
Reference in New Issue
Block a user