From cfe19486ee3680e9683fda1523b544783eb20e08 Mon Sep 17 00:00:00 2001 From: Ronnie Sahlberg Date: Sat, 9 Apr 2011 11:59:12 +1000 Subject: [PATCH] Add RESERVATION CONFLICT From Richard Sharpe, add support to handle when a target responds with RESERVATION CONFLICT to a scsi i/o --- include/iscsi.h | 9 +++++---- lib/scsi-command.c | 13 ++++++++----- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/iscsi.h b/include/iscsi.h index 983c32c..afd9acf 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -214,10 +214,11 @@ int iscsi_is_logged_in(struct iscsi_context *iscsi); enum scsi_status { - SCSI_STATUS_GOOD = 0, - SCSI_STATUS_CHECK_CONDITION = 2, - SCSI_STATUS_CANCELLED = 0x0f000000, - SCSI_STATUS_ERROR = 0x0f000001 + SCSI_STATUS_GOOD = 0, + SCSI_STATUS_CHECK_CONDITION = 2, + SCSI_STATUS_RESERVATION_CONFLICT = 0x18, + SCSI_STATUS_CANCELLED = 0x0f000000, + SCSI_STATUS_ERROR = 0x0f000001 }; diff --git a/lib/scsi-command.c b/lib/scsi-command.c index 8ceadaa..bad369e 100644 --- a/lib/scsi-command.c +++ b/lib/scsi-command.c @@ -52,12 +52,10 @@ iscsi_scsi_response_cb(struct iscsi_context *iscsi, int status, struct scsi_task *task = command_data; switch (status) { - case SCSI_STATUS_GOOD: - scsi_cbdata->callback(iscsi, SCSI_STATUS_GOOD, task, - scsi_cbdata->private_data); - return; + case SCSI_STATUS_RESERVATION_CONFLICT: case SCSI_STATUS_CHECK_CONDITION: - scsi_cbdata->callback(iscsi, SCSI_STATUS_CHECK_CONDITION, task, + case SCSI_STATUS_GOOD: + scsi_cbdata->callback(iscsi, status, task, scsi_cbdata->private_data); return; default: @@ -397,6 +395,11 @@ iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, pdu->callback(iscsi, SCSI_STATUS_CHECK_CONDITION, task, pdu->private_data); break; + case SCSI_STATUS_RESERVATION_CONFLICT: + iscsi_set_error(iscsi, "RESERVATION CONFLICT"); + pdu->callback(iscsi, SCSI_STATUS_RESERVATION_CONFLICT, + task, pdu->private_data); + break; default: iscsi_set_error(iscsi, "Unknown SCSI status :%d.", status);