Add RESERVE6/RELEASE6 Support.

This commit is contained in:
Jon Grimm
2012-09-27 12:45:06 -05:00
parent 1619d0e404
commit c7d8d2593c
7 changed files with 159 additions and 1 deletions

View File

@@ -732,6 +732,15 @@ iscsi_readtoc_task(struct iscsi_context *iscsi, int lun, int msf, int format,
int track_session, int maxsize, int track_session, int maxsize,
iscsi_command_cb cb, void *private_data); iscsi_command_cb cb, void *private_data);
EXTERN struct scsi_task *
iscsi_reserve6_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data);
EXTERN struct scsi_task *
iscsi_release6_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data);
/* /*
* Sync commands for SCSI * Sync commands for SCSI
*/ */
@@ -889,6 +898,13 @@ EXTERN struct scsi_task *
iscsi_readtoc_sync(struct iscsi_context *iscsi, int lun, int msf, iscsi_readtoc_sync(struct iscsi_context *iscsi, int lun, int msf,
int format, int track_session, int maxsize); int format, int track_session, int maxsize);
EXTERN struct scsi_task *
iscsi_reserve6_sync(struct iscsi_context *iscsi, int lun);
EXTERN struct scsi_task *
iscsi_release6_sync(struct iscsi_context *iscsi, int lun);
/* /*
* This function is used when the application wants to specify its own buffers to read the data * This function is used when the application wants to specify its own buffers to read the data
* from the DATA-IN PDUs into. * from the DATA-IN PDUs into.

View File

@@ -27,6 +27,8 @@ enum scsi_opcode {
SCSI_OPCODE_TESTUNITREADY = 0x00, SCSI_OPCODE_TESTUNITREADY = 0x00,
SCSI_OPCODE_READ6 = 0x08, SCSI_OPCODE_READ6 = 0x08,
SCSI_OPCODE_INQUIRY = 0x12, SCSI_OPCODE_INQUIRY = 0x12,
SCSI_OPCODE_RESERVE6 = 0x16,
SCSI_OPCODE_RELEASE6 = 0x17,
SCSI_OPCODE_MODESENSE6 = 0x1a, SCSI_OPCODE_MODESENSE6 = 0x1a,
SCSI_OPCODE_STARTSTOPUNIT = 0x1b, SCSI_OPCODE_STARTSTOPUNIT = 0x1b,
SCSI_OPCODE_PREVENTALLOW = 0x1e, SCSI_OPCODE_PREVENTALLOW = 0x1e,
@@ -39,7 +41,7 @@ enum scsi_opcode {
SCSI_OPCODE_SYNCHRONIZECACHE10 = 0x35, SCSI_OPCODE_SYNCHRONIZECACHE10 = 0x35,
SCSI_OPCODE_WRITE_SAME10 = 0x41, SCSI_OPCODE_WRITE_SAME10 = 0x41,
SCSI_OPCODE_UNMAP = 0x42, SCSI_OPCODE_UNMAP = 0x42,
SCSI_OPCODE_READTOC = 0x43, SCSI_OPCODE_READTOC = 0x43,
SCSI_OPCODE_READ16 = 0x88, SCSI_OPCODE_READ16 = 0x88,
SCSI_OPCODE_COMPARE_AND_WRITE = 0x89, SCSI_OPCODE_COMPARE_AND_WRITE = 0x89,
SCSI_OPCODE_WRITE16 = 0x8A, SCSI_OPCODE_WRITE16 = 0x8A,
@@ -362,6 +364,15 @@ struct scsi_reportluns_list {
EXTERN struct scsi_task *scsi_reportluns_cdb(int report_type, int alloc_len); EXTERN struct scsi_task *scsi_reportluns_cdb(int report_type, int alloc_len);
/*
* RESERVE6
*/
EXTERN struct scsi_task *scsi_cdb_reserve6(void);
/*
* RELEASE6
*/
EXTERN struct scsi_task *scsi_cdb_release6(void);
/* /*
* READCAPACITY10 * READCAPACITY10
*/ */

View File

@@ -48,6 +48,10 @@ iscsi_readcapacity16_sync
iscsi_readcapacity16_task iscsi_readcapacity16_task
iscsi_readtoc_sync iscsi_readtoc_sync
iscsi_readtoc_task iscsi_readtoc_task
iscsi_reserve6_sync
iscsi_reserve6_task
iscsi_release6_sync
iscsi_release6_task
iscsi_reconnect iscsi_reconnect
iscsi_set_noautoreconnect iscsi_set_noautoreconnect
iscsi_reportluns_sync iscsi_reportluns_sync
@@ -124,6 +128,8 @@ scsi_cdb_read6
scsi_cdb_readcapacity10 scsi_cdb_readcapacity10
scsi_cdb_readcapacity16 scsi_cdb_readcapacity16
scsi_cdb_readtoc scsi_cdb_readtoc
scsi_cdb_reserve6
scsi_cdb_release6
scsi_cdb_serviceactionin16 scsi_cdb_serviceactionin16
scsi_cdb_startstopunit scsi_cdb_startstopunit
scsi_cdb_synchronizecache10 scsi_cdb_synchronizecache10

View File

@@ -46,6 +46,10 @@ iscsi_readcapacity16_sync
iscsi_readcapacity16_task iscsi_readcapacity16_task
iscsi_readtoc_sync iscsi_readtoc_sync
iscsi_readtoc_task iscsi_readtoc_task
iscsi_reserve6_sync
iscsi_reserve6_task
iscsi_release6_sync
iscsi_release6_task
iscsi_reconnect iscsi_reconnect
iscsi_set_noautoreconnect iscsi_set_noautoreconnect
iscsi_reportluns_sync iscsi_reportluns_sync
@@ -122,6 +126,8 @@ scsi_cdb_read6
scsi_cdb_readcapacity10 scsi_cdb_readcapacity10
scsi_cdb_readcapacity16 scsi_cdb_readcapacity16
scsi_cdb_readtoc scsi_cdb_readtoc
scsi_cdb_reserve6
scsi_cdb_release6
scsi_cdb_serviceactionin16 scsi_cdb_serviceactionin16
scsi_cdb_startstopunit scsi_cdb_startstopunit
scsi_cdb_synchronizecache10 scsi_cdb_synchronizecache10

View File

@@ -1499,6 +1499,48 @@ iscsi_readtoc_task(struct iscsi_context *iscsi, int lun, int msf,
return task; return task;
} }
struct scsi_task *
iscsi_reserve6_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data)
{
struct scsi_task *task;
task = scsi_cdb_reserve6();
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"reserve6 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_release6_task(struct iscsi_context *iscsi, int lun,
iscsi_command_cb cb, void *private_data)
{
struct scsi_task *task;
task = scsi_cdb_release6();
if (task == NULL) {
iscsi_set_error(iscsi, "Out-of-memory: Failed to create "
"release6 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 * struct scsi_task *
iscsi_scsi_get_task_from_pdu(struct iscsi_pdu *pdu) iscsi_scsi_get_task_from_pdu(struct iscsi_pdu *pdu)
{ {

View File

@@ -456,6 +456,49 @@ scsi_readtoc_datain_unmarshall(struct scsi_task *task)
return list; return list;
} }
/*
* RESERVE6
*/
struct scsi_task *
scsi_cdb_reserve6(void)
{
struct scsi_task *task;
task = malloc(sizeof(struct scsi_task));
if (task == NULL) {
return NULL;
}
memset(task, 0, sizeof(struct scsi_task));
task->cdb[0] = SCSI_OPCODE_RESERVE6;
task->cdb_size = 6;
task->xfer_dir = SCSI_XFER_NONE;
return task;
}
/*
* RELEASE10
*/
struct scsi_task *
scsi_cdb_release6(void)
{
struct scsi_task *task;
task = malloc(sizeof(struct scsi_task));
if (task == NULL) {
return NULL;
}
memset(task, 0, sizeof(struct scsi_task));
task->cdb[0] = SCSI_OPCODE_RELEASE6;
task->cdb_size = 6;
task->xfer_dir = SCSI_XFER_NONE;
return task;
}
/* /*
* service_action_in unmarshall * service_action_in unmarshall

View File

@@ -840,6 +840,40 @@ iscsi_readtoc_sync(struct iscsi_context *iscsi, int lun, int msf, int format,
return state.task; return state.task;
} }
struct scsi_task *
iscsi_reserve6_sync(struct iscsi_context *iscsi, int lun)
{
struct iscsi_sync_state state;
memset(&state, 0, sizeof(state));
if (iscsi_reserve6_task(iscsi, lun, scsi_sync_cb, &state) == NULL) {
iscsi_set_error(iscsi, "Failed to send RESERVE6 command");
return NULL;
}
event_loop(iscsi, &state);
return state.task;
}
struct scsi_task *
iscsi_release6_sync(struct iscsi_context *iscsi, int lun)
{
struct iscsi_sync_state state;
memset(&state, 0, sizeof(state));
if (iscsi_release6_task(iscsi, lun, scsi_sync_cb, &state) == NULL) {
iscsi_set_error(iscsi, "Failed to send RELEASE6 command");
return NULL;
}
event_loop(iscsi, &state);
return state.task;
}
struct scsi_task * struct scsi_task *
iscsi_scsi_command_sync(struct iscsi_context *iscsi, int lun, iscsi_scsi_command_sync(struct iscsi_context *iscsi, int lun,
struct scsi_task *task, struct iscsi_data *data) struct scsi_task *task, struct iscsi_data *data)