diff --git a/include/iscsi.h b/include/iscsi.h index 26cef0f..95898eb 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -837,7 +837,9 @@ iscsi_release6_task(struct iscsi_context *iscsi, int lun, EXTERN struct scsi_task * iscsi_report_supported_opcodes_task(struct iscsi_context *iscsi, int lun, - int return_timeouts, int maxsize, + int rctd, int options, + int opcode, int sa, + uint32_t alloc_len, iscsi_command_cb cb, void *private_data); /* @@ -1011,7 +1013,9 @@ iscsi_release6_sync(struct iscsi_context *iscsi, int lun); EXTERN struct scsi_task * iscsi_report_supported_opcodes_sync(struct iscsi_context *iscsi, int lun, - int return_timeouts, int maxsize); + int rctd, int options, + int opcode, int sa, + uint32_t alloc_len); /* * These functions are used when the application wants to specify its own buffers to read the data diff --git a/include/scsi-lowlevel.h b/include/scsi-lowlevel.h index c7a40ba..5693129 100644 --- a/include/scsi-lowlevel.h +++ b/include/scsi-lowlevel.h @@ -943,7 +943,7 @@ EXTERN struct scsi_task *scsi_cdb_writesame10(int wrprotect, int anchor, int unm EXTERN struct scsi_task *scsi_cdb_writesame16(int wrprotect, int anchor, int unmap, uint64_t lba, int group, uint32_t num_blocks); EXTERN struct scsi_task *scsi_cdb_prefetch10(uint32_t lba, int num_blocks, int immed, int group); EXTERN struct scsi_task *scsi_cdb_prefetch16(uint64_t lba, int num_blocks, int immed, int group); -EXTERN struct scsi_task *scsi_cdb_report_supported_opcodes(int report_timeouts, uint32_t alloc_len); +EXTERN struct scsi_task *scsi_cdb_report_supported_opcodes(int rctd, int options, enum scsi_opcode opcode, int sa, uint32_t alloc_len); void *scsi_malloc(struct scsi_task *task, size_t size); diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index 9aa02d1..18a705f 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -1633,13 +1633,16 @@ iscsi_release6_task(struct iscsi_context *iscsi, int lun, } struct scsi_task * -iscsi_report_supported_opcodes_task(struct iscsi_context *iscsi, - int lun, int return_timeouts, int maxsize, +iscsi_report_supported_opcodes_task(struct iscsi_context *iscsi, int lun, + int rctd, int options, + int opcode, int sa, + uint32_t alloc_len, iscsi_command_cb cb, void *private_data) { struct scsi_task *task; - task = scsi_cdb_report_supported_opcodes(return_timeouts, maxsize); + task = scsi_cdb_report_supported_opcodes(rctd, options, opcode, sa, + alloc_len); if (task == NULL) { iscsi_set_error(iscsi, "Out-of-memory: Failed to create " "Maintenance In/Read Supported Op Codes cdb."); diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index 1f51f32..3c02ace 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -895,7 +895,7 @@ scsi_maintenancein_datain_unmarshall(struct scsi_task *task) * MAINTENANCE In / Read Supported Op Codes */ struct scsi_task * -scsi_cdb_report_supported_opcodes(int return_timeouts, uint32_t alloc_len) +scsi_cdb_report_supported_opcodes(int rctd, int options, enum scsi_opcode opcode, int sa, uint32_t alloc_len) { struct scsi_task *task; @@ -907,12 +907,16 @@ scsi_cdb_report_supported_opcodes(int return_timeouts, uint32_t alloc_len) memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_MAINTENANCE_IN; task->cdb[1] = SCSI_REPORT_SUPPORTED_OP_CODES; - task->cdb[2] = SCSI_REPORT_SUPPORTING_OPS_ALL; + task->cdb[2] = options & 0x07; - if (return_timeouts) { + if (rctd) { task->cdb[2] |= 0x80; } + task->cdb[3] = opcode; + + scsi_set_uint32(&task->cdb[4], sa); + scsi_set_uint32(&task->cdb[6], alloc_len); task->cdb_size = 12; diff --git a/lib/sync.c b/lib/sync.c index 3b2bb8c..0be3306 100644 --- a/lib/sync.c +++ b/lib/sync.c @@ -1031,13 +1031,16 @@ iscsi_release6_sync(struct iscsi_context *iscsi, int lun) } struct scsi_task * -iscsi_report_supported_opcodes_sync(struct iscsi_context *iscsi, int lun, int return_timeouts, int maxsize) +iscsi_report_supported_opcodes_sync(struct iscsi_context *iscsi, int lun, + int rctd, int options, + int opcode, int sa, + uint32_t alloc_len) { struct iscsi_sync_state state; memset(&state, 0, sizeof(state)); - if (iscsi_report_supported_opcodes_task(iscsi, lun, return_timeouts, maxsize, scsi_sync_cb, &state) == NULL) { + if (iscsi_report_supported_opcodes_task(iscsi, lun, rctd, options, opcode, sa, alloc_len, scsi_sync_cb, &state) == NULL) { iscsi_set_error(iscsi, "Failed to send MaintenanceIn:" "Report Supported Opcodes command"); return NULL; diff --git a/test-tool/0430_report_all_supported_ops.c b/test-tool/0430_report_all_supported_ops.c index 2f688cd..e91b450 100644 --- a/test-tool/0430_report_all_supported_ops.c +++ b/test-tool/0430_report_all_supported_ops.c @@ -53,7 +53,9 @@ int T0430_report_all_supported_ops(const char *initiator, const char *url) printf("See if Report Supported Opcodes is supported... "); /* See how big data is */ - task = iscsi_report_supported_opcodes_sync(iscsi, lun, 0, 4); + task = iscsi_report_supported_opcodes_sync(iscsi, lun, + 0, SCSI_REPORT_SUPPORTING_OPS_ALL, 0, 0, + 4); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send Report Supported Opcodes command : %s\n", @@ -84,7 +86,9 @@ int T0430_report_all_supported_ops(const char *initiator, const char *url) if (full_size > task->datain.size) { scsi_free_scsi_task(task); /* we need more data for the full list */ - if ((task = iscsi_report_supported_opcodes_sync(iscsi, lun, 0, full_size)) == NULL) { + if ((task = iscsi_report_supported_opcodes_sync(iscsi, lun, + 0, SCSI_REPORT_SUPPORTING_OPS_ALL, 0, 0, + full_size)) == NULL) { printf("[FAILED]\n"); printf("REPORT SUPPORTED OPCODES failed : %s\n", iscsi_get_error(iscsi)); ret = -1; @@ -115,7 +119,9 @@ int T0430_report_all_supported_ops(const char *initiator, const char *url) /*Report All Supported Operations including timeout info.*/ printf("See if Report Supported Opcodes with Timeouts is supported... "); /* See how big data is */ - task = iscsi_report_supported_opcodes_sync(iscsi, lun, 1, 4); + task = iscsi_report_supported_opcodes_sync(iscsi, lun, + 1, SCSI_REPORT_SUPPORTING_OPS_ALL, 0, 0, + 4); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send Report Supported Opcodes command : %s\n", @@ -148,7 +154,9 @@ int T0430_report_all_supported_ops(const char *initiator, const char *url) scsi_free_scsi_task(task); /* we need more data for the full list */ - if ((task = iscsi_report_supported_opcodes_sync(iscsi, lun, 1, full_size)) == NULL) { + if ((task = iscsi_report_supported_opcodes_sync(iscsi, lun, + 1, SCSI_REPORT_SUPPORTING_OPS_ALL, 0, 0, + full_size)) == NULL) { printf("[FAILED]\n"); printf("REPORT SUPPORTED OPCODES failed : %s\n", iscsi_get_error(iscsi)); ret = -1;