From 20722411abb810f281a58d2e4411f8617def253f Mon Sep 17 00:00:00 2001 From: Roland Dreier Date: Fri, 8 Feb 2013 15:18:39 -0800 Subject: [PATCH] --- yaml --- r: 358911 b: refs/heads/master c: bb992e72f9b751fceb04afeb7736b6a3e50effcf h: refs/heads/master i: 358909: a76cebf3412615fa0e6175b1a6e3bd27e62e4a65 358907: d00f8c64d763d4e983e4773b30778ba999935b23 358903: 17480015ec88af595b3d284f93be7a0d64de60c1 358895: 9ccb0048f5215f5a880b57817516db1237309a7a 358879: ab96524c74f82f5e241c13934a4a7d399e0936fd 358847: de3ad5dbcec85345d83af39ce075a1098a2d80a8 358783: 1f60830daa845b611128f27e2fa501d0ac884970 358655: 482920315328fb154cb930a0215dab03b0158cd1 358399: 13c6cfdfa75cf1bfd490bdc5a20e4b167ca7ae78 v: v3 --- [refs] | 2 +- trunk/drivers/target/target_core_iblock.c | 11 ++++++++++- trunk/drivers/target/target_core_transport.c | 10 ++++++++++ trunk/include/target/target_core_base.h | 1 + 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 585ad7200683..3e1c173fcf6d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 33633676df0d16d0685f2fbc571143801bc16e3b +refs/heads/master: bb992e72f9b751fceb04afeb7736b6a3e50effcf diff --git a/trunk/drivers/target/target_core_iblock.c b/trunk/drivers/target/target_core_iblock.c index 2f74e17ad3e6..facee5f74fa4 100644 --- a/trunk/drivers/target/target_core_iblock.c +++ b/trunk/drivers/target/target_core_iblock.c @@ -391,10 +391,19 @@ iblock_execute_unmap(struct se_cmd *cmd) sense_reason_t ret = 0; int dl, bd_dl, err; + /* We never set ANC_SUP */ + if (cmd->t_task_cdb[1]) + return TCM_INVALID_CDB_FIELD; + + if (cmd->data_length == 0) { + target_complete_cmd(cmd, SAM_STAT_GOOD); + return 0; + } + if (cmd->data_length < 8) { pr_warn("UNMAP parameter list length %u too small\n", cmd->data_length); - return TCM_INVALID_PARAMETER_LIST; + return TCM_PARAMETER_LIST_LENGTH_ERROR; } buf = transport_kmap_data_sg(cmd); diff --git a/trunk/drivers/target/target_core_transport.c b/trunk/drivers/target/target_core_transport.c index 96b64d57ebbb..2030b608136d 100644 --- a/trunk/drivers/target/target_core_transport.c +++ b/trunk/drivers/target/target_core_transport.c @@ -1517,6 +1517,7 @@ void transport_generic_request_failure(struct se_cmd *cmd, case TCM_UNSUPPORTED_SCSI_OPCODE: case TCM_INVALID_CDB_FIELD: case TCM_INVALID_PARAMETER_LIST: + case TCM_PARAMETER_LIST_LENGTH_ERROR: case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: case TCM_UNKNOWN_MODE_PAGE: case TCM_WRITE_PROTECTED: @@ -2677,6 +2678,15 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, /* INVALID FIELD IN PARAMETER LIST */ buffer[SPC_ASC_KEY_OFFSET] = 0x26; break; + case TCM_PARAMETER_LIST_LENGTH_ERROR: + /* CURRENT ERROR */ + buffer[0] = 0x70; + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10; + /* ILLEGAL REQUEST */ + buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST; + /* PARAMETER LIST LENGTH ERROR */ + buffer[SPC_ASC_KEY_OFFSET] = 0x1a; + break; case TCM_UNEXPECTED_UNSOLICITED_DATA: /* CURRENT ERROR */ buffer[0] = 0x70; diff --git a/trunk/include/target/target_core_base.h b/trunk/include/target/target_core_base.h index df14dce59191..c4af592f7057 100644 --- a/trunk/include/target/target_core_base.h +++ b/trunk/include/target/target_core_base.h @@ -195,6 +195,7 @@ enum tcm_sense_reason_table { TCM_RESERVATION_CONFLICT = R(0x10), TCM_ADDRESS_OUT_OF_RANGE = R(0x11), TCM_OUT_OF_RESOURCES = R(0x12), + TCM_PARAMETER_LIST_LENGTH_ERROR = R(0x13), #undef R };