From 92b987de52982ebc7e1b750e3b1b74fd2a760b8b Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Sun, 26 May 2013 10:51:19 -0700 Subject: [PATCH] Add helpers for the SANITIZE service actions --- include/iscsi.h | 21 ++++++++++++++ lib/iscsi-command.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ lib/libiscsi.def | 6 ++++ lib/libiscsi.syms | 6 ++++ lib/sync.c | 63 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+) diff --git a/include/iscsi.h b/include/iscsi.h index c40866c..f14d404 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -678,6 +678,18 @@ iscsi_sanitize_task(struct iscsi_context *iscsi, int lun, struct iscsi_data *data, iscsi_command_cb cb, void *private_data); EXTERN struct scsi_task * +iscsi_sanitize_block_erase_task(struct iscsi_context *iscsi, int lun, + int immed, int ause, + iscsi_command_cb cb, void *private_data); +EXTERN struct scsi_task * +iscsi_sanitize_crypto_erase_task(struct iscsi_context *iscsi, int lun, + int immed, int ause, + iscsi_command_cb cb, void *private_data); +EXTERN struct scsi_task * +iscsi_sanitize_exit_failure_mode_task(struct iscsi_context *iscsi, int lun, + int immed, int ause, + iscsi_command_cb cb, void *private_data); +EXTERN struct scsi_task * iscsi_get_lba_status_task(struct iscsi_context *iscsi, int lun, uint64_t starting_lba, uint32_t alloc_len, iscsi_command_cb cb, @@ -953,6 +965,15 @@ iscsi_sanitize_sync(struct iscsi_context *iscsi, int lun, int immed, int ause, int sa, int param_len, struct iscsi_data *data); EXTERN struct scsi_task * +iscsi_sanitize_block_erase_sync(struct iscsi_context *iscsi, int lun, + int immed, int ause); +EXTERN struct scsi_task * +iscsi_sanitize_crypto_erase_sync(struct iscsi_context *iscsi, int lun, + int immed, int ause); +EXTERN struct scsi_task * +iscsi_sanitize_exit_failure_mode_sync(struct iscsi_context *iscsi, int lun, + int immed, int ause); +EXTERN struct scsi_task * iscsi_synchronizecache10_sync(struct iscsi_context *iscsi, int lun, int lba, int num_blocks, int syncnv, int immed); diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index 1308bdf..37d0a42 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -1656,6 +1656,73 @@ iscsi_sanitize_task(struct iscsi_context *iscsi, int lun, return task; } +struct scsi_task * +iscsi_sanitize_block_erase_task(struct iscsi_context *iscsi, int lun, + int immed, int ause, + iscsi_command_cb cb, void *private_data) +{ + struct scsi_task *task; + + task = scsi_cdb_sanitize(immed, ause, SCSI_SANITIZE_BLOCK_ERASE, 0); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "sanitize 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_sanitize_crypto_erase_task(struct iscsi_context *iscsi, int lun, + int immed, int ause, + iscsi_command_cb cb, void *private_data) +{ + struct scsi_task *task; + + task = scsi_cdb_sanitize(immed, ause, SCSI_SANITIZE_CRYPTO_ERASE, 0); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "sanitize 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_sanitize_exit_failure_mode_task(struct iscsi_context *iscsi, int lun, + int immed, int ause, + iscsi_command_cb cb, void *private_data) +{ + struct scsi_task *task; + + task = scsi_cdb_sanitize(immed, ause, + SCSI_SANITIZE_EXIT_FAILURE_MODE, 0); + if (task == NULL) { + iscsi_set_error(iscsi, "Out-of-memory: Failed to create " + "sanitize 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_report_supported_opcodes_task(struct iscsi_context *iscsi, int lun, int rctd, int options, diff --git a/lib/libiscsi.def b/lib/libiscsi.def index caec7f6..816fefd 100644 --- a/lib/libiscsi.def +++ b/lib/libiscsi.def @@ -63,6 +63,12 @@ iscsi_report_supported_opcodes_task iscsi_reconnect iscsi_sanitize_sync iscsi_sanitize_task +iscsi_sanitize_block_erase_sync +iscsi_sanitize_block_erase_task +iscsi_sanitize_crypto_erase_sync +iscsi_sanitize_crypto_erase_task +iscsi_sanitize_exit_failure_mode_sync +iscsi_sanitize_exit_failure_mode_task iscsi_set_noautoreconnect iscsi_set_reconnect_max_retries iscsi_set_timeout diff --git a/lib/libiscsi.syms b/lib/libiscsi.syms index f5bafdc..8ba48eb 100644 --- a/lib/libiscsi.syms +++ b/lib/libiscsi.syms @@ -61,6 +61,12 @@ iscsi_report_supported_opcodes_task iscsi_reconnect iscsi_sanitize_sync iscsi_sanitize_task +iscsi_sanitize_block_erase_sync +iscsi_sanitize_block_erase_task +iscsi_sanitize_crypto_erase_sync +iscsi_sanitize_crypto_erase_task +iscsi_sanitize_exit_failure_mode_sync +iscsi_sanitize_exit_failure_mode_task iscsi_set_noautoreconnect iscsi_set_reconnect_max_retries iscsi_set_timeout diff --git a/lib/sync.c b/lib/sync.c index a67c426..f69dbf5 100644 --- a/lib/sync.c +++ b/lib/sync.c @@ -503,6 +503,69 @@ iscsi_sanitize_sync(struct iscsi_context *iscsi, int lun, return state.task; } +struct scsi_task * +iscsi_sanitize_block_erase_sync(struct iscsi_context *iscsi, int lun, + int immed, int ause) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_sanitize_block_erase_task(iscsi, lun, + immed, ause, + scsi_sync_cb, &state) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Sanitize command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + +struct scsi_task * +iscsi_sanitize_crypto_erase_sync(struct iscsi_context *iscsi, int lun, + int immed, int ause) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_sanitize_crypto_erase_task(iscsi, lun, + immed, ause, + scsi_sync_cb, &state) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Sanitize command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + +struct scsi_task * +iscsi_sanitize_exit_failure_mode_sync(struct iscsi_context *iscsi, int lun, + int immed, int ause) +{ + struct iscsi_sync_state state; + + memset(&state, 0, sizeof(state)); + + if (iscsi_sanitize_exit_failure_mode_task(iscsi, lun, + immed, ause, + scsi_sync_cb, &state) == NULL) { + iscsi_set_error(iscsi, + "Failed to send Sanitize command"); + return NULL; + } + + event_loop(iscsi, &state); + + return state.task; +} + struct scsi_task * iscsi_get_lba_status_sync(struct iscsi_context *iscsi, int lun, uint64_t starting_lba, uint32_t alloc_len) {