diff --git a/test-tool/iscsi-support.c b/test-tool/iscsi-support.c index d73a7e5..bbc2bbd 100644 --- a/test-tool/iscsi-support.c +++ b/test-tool/iscsi-support.c @@ -4848,6 +4848,7 @@ int writesame10(struct iscsi_context *iscsi, int lun, uint32_t lba, uint32_t datalen, int num, int anchor, int unmap_flag, int wrprotect, int group, unsigned char *data) { struct scsi_task *task; + uint64_t realdatalen; logging(LOG_VERBOSE, "Send WRITESAME10 LBA:%d blocks:%d " "wrprotect:%d anchor:%d unmap:%d group:%d", @@ -4874,6 +4875,26 @@ writesame10(struct iscsi_context *iscsi, int lun, uint32_t lba, uint32_t datalen scsi_free_scsi_task(task); return -2; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB) { + if (inq_bl->wsnz == 1 && datalen == 0) { + logging(LOG_NORMAL, "[SKIPPED] Target does not support WRITESAME10 with NUMBER OF LOGICAL BLOCKS == 0"); + scsi_free_scsi_task(task); + return -3; + } + + if (datalen == 0) { + realdatalen = num_blocks; + } else { + realdatalen = datalen; + } + if (inq_bl->max_ws_len > 0 && realdatalen > inq_bl->max_ws_len) { + logging(LOG_NORMAL, "[SKIPPED] Number of WRITESAME10 logical blocks to be written exceeds MAXIMUM WRITE SAME LENGTH"); + scsi_free_scsi_task(task); + return -4; + } + } if (task->status != SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITESAME10 command: " "failed with sense. %s", iscsi_get_error(iscsi)); @@ -5100,6 +5121,7 @@ int writesame16(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t datalen, int num, int anchor, int unmap_flag, int wrprotect, int group, unsigned char *data) { struct scsi_task *task; + uint64_t realdatalen; logging(LOG_VERBOSE, "Send WRITESAME16 LBA:%" PRIu64 " blocks:%d " "wrprotect:%d anchor:%d unmap:%d group:%d", @@ -5126,6 +5148,26 @@ writesame16(struct iscsi_context *iscsi, int lun, uint64_t lba, uint32_t datalen scsi_free_scsi_task(task); return -2; } + if (task->status == SCSI_STATUS_CHECK_CONDITION + && task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST + && task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_FIELD_IN_CDB) { + if (inq_bl->wsnz == 1 && datalen == 0) { + logging(LOG_NORMAL, "[SKIPPED] Target does not support WRITESAME16 with NUMBER OF LOGICAL BLOCKS == 0"); + scsi_free_scsi_task(task); + return -3; + } + + if (datalen == 0) { + realdatalen = num_blocks; + } else { + realdatalen = datalen; + } + if (inq_bl->max_ws_len > 0 && realdatalen > inq_bl->max_ws_len) { + logging(LOG_NORMAL, "[SKIPPED] Number of WRITESAME16 logical blocks to be written exceeds MAXIMUM WRITE SAME LENGTH"); + scsi_free_scsi_task(task); + return -4; + } + } if (task->status != SCSI_STATUS_GOOD) { logging(LOG_NORMAL, "[FAILED] WRITESAME16 command: " "failed with sense. %s", iscsi_get_error(iscsi)); diff --git a/test-tool/test_writesame10_0blocks.c b/test-tool/test_writesame10_0blocks.c index 66c1594..8f8fd2a 100644 --- a/test-tool/test_writesame10_0blocks.c +++ b/test-tool/test_writesame10_0blocks.c @@ -44,8 +44,13 @@ test_writesame10_0blocks(void) if (ret == -2) { CU_PASS("[SKIPPED] Target does not support WRITESAME10. Skipping test"); return; + } else if (ret == -3) { + CU_PASS("[SKIPPED] Target does not support WRITESAME10 with NUMBER OF LOGICAL BLOCKS == 0"); + } else if (ret == -4) { + CU_PASS("[SKIPPED] Number of WRITESAME10 logical blocks to be written exceeds MAXIMUM WRITE SAME LENGTH"); + } else { + CU_ASSERT_EQUAL(ret, 0); } - CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITESAME10 0-blocks one block past end-of-LUN"); ret = writesame10_lbaoutofrange(iscsic, tgt_lun, num_blocks + 1, diff --git a/test-tool/test_writesame16_0blocks.c b/test-tool/test_writesame16_0blocks.c index 1108847..4f8a74b 100644 --- a/test-tool/test_writesame16_0blocks.c +++ b/test-tool/test_writesame16_0blocks.c @@ -40,8 +40,13 @@ test_writesame16_0blocks(void) logging(LOG_NORMAL, "[SKIPPED] WRITESAME16 is not implemented."); CU_PASS("[SKIPPED] Target does not support WRITESAME16. Skipping test"); return; + } else if (ret == -3) { + CU_PASS("[SKIPPED] Target does not support WRITESAME16 with NUMBER OF LOGICAL BLOCKS == 0"); + } else if (ret == -4) { + CU_PASS("[SKIPPED] Number of WRITESAME16 logical blocks to be written exceeds MAXIMUM WRITE SAME LENGTH"); + } else { + CU_ASSERT_EQUAL(ret, 0); } - CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks one block past end-of-LUN"); ret = writesame16_lbaoutofrange(iscsic, tgt_lun, num_blocks + 1,