TESTS: Fix all 0block tests

Remove the test for accessing 0blocks (transfer length==0) at the end of the device since they were invalid.

SBC says that :
   If the LBA plus the transfer length exceeds the capacity
   of the medium, then the device server shall terminate the
   command with CHECK CONDITION status with the sense key
   set to ILLEGAL REQUEST and the additional sense code
   set to LOGICAL BLOCK ADDRESS OUT OF RANGE.

This means that if TL==0  then a LBA that is the first LBA beyond the end of
device is actually valid.

Improve output for error conditions and harminize all tests
This commit is contained in:
Ronnie Sahlberg
2012-09-10 19:08:57 -07:00
parent 9d15c1ea40
commit ed1c3e1129
10 changed files with 632 additions and 396 deletions

View File

@@ -25,15 +25,18 @@ int T0243_prefetch10_0blocks(const char *initiator, const char *url, int data_lo
struct iscsi_context *iscsi;
struct scsi_task *task;
struct scsi_readcapacity16 *rc16;
int ret, i, lun;
int ret, lun;
uint64_t num_blocks;
printf("0243_prefetch10_0blocks:\n");
printf("===================\n");
if (show_info) {
printf("Test PREFETCH10 when prefetching 0 blocks.\n");
printf("1, Verify we can prefetch 0 blocks at LBA 0.\n");
printf("2, Verify prefetch of 0 blocks past EOL fails.\n");
printf("Test that PREFETCH10 works correctly when transfer length is 0 blocks.\n");
printf("Transfer Length == 0 means to PREFETCH until the end of the LUN.\n");
printf("1, Prefetch at LBA:0 should work.\n");
printf("2, Prefetch at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n");
printf("3, Prefetch at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n");
printf("4, Prefetch at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n");
printf("\n");
return 0;
}
@@ -69,66 +72,118 @@ int T0243_prefetch10_0blocks(const char *initiator, const char *url, int data_lo
ret = 0;
/* prefetch 0 blocks at the start of the LUN */
printf("Prefetching 0 blocks at LBA==0 ... ");
for (i = 1; i <= 256; i++) {
task = iscsi_prefetch10_sync(iscsi, lun, 0, 0, 0, 0);
if (task == NULL) {
printf("[FAILED]\n");
printf("Failed to send prefetch10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto test2;
}
if (task->status == SCSI_STATUS_CHECK_CONDITION
&& task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST
&& task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) {
printf("[SKIPPED]\n");
printf("Opcode is not implemented on target\n");
scsi_free_scsi_task(task);
ret = -2;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("Prefetch10 command: failed with sense. %s\n", iscsi_get_error(iscsi));
ret = -1;
scsi_free_scsi_task(task);
goto test2;
}
scsi_free_scsi_task(task);
/* prefetch 0blocks at the start of the LUN */
printf("PREFETCH10 0blocks at LBA==0 ... ");
task = iscsi_prefetch10_sync(iscsi, lun, 0, 0, 0, 0);
if (task == NULL) {
printf("[FAILED]\n");
printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto test2;
}
if (task->status == SCSI_STATUS_CHECK_CONDITION
&& task->sense.key == SCSI_SENSE_ILLEGAL_REQUEST
&& task->sense.ascq == SCSI_SENSE_ASCQ_INVALID_OPERATION_CODE) {
printf("[SKIPPED]\n");
printf("Opcode is not implemented on target\n");
scsi_free_scsi_task(task);
ret = -2;
goto finished;
}
if (task->status != SCSI_STATUS_GOOD) {
printf("[FAILED]\n");
printf("PREFETCH10 command: failed with sense. %s\n", iscsi_get_error(iscsi));
ret = -1;
scsi_free_scsi_task(task);
goto test2;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
test2:
test2:
/* Prefetch 0 blocks beyond end of the LUN */
printf("Prefetching 0 blocks beyond eol... ");
printf("PREFETCH10 0blocks at one block beyond <end-of-LUN> ... ");
if (num_blocks > 0x80000000) {
printf("[SKIPPED]\n");
printf("LUN is too big, skipping test\n");
goto test3;
}
for (i = 1; i < 256; i++) {
task = iscsi_prefetch10_sync(iscsi, lun, num_blocks + 1, 0, 0, 0);
if (task == NULL) {
printf("[FAILED]\n");
printf("Failed to send prefetch10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto test3;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE.\n");
ret = -1;
scsi_free_scsi_task(task);
goto test3;
}
scsi_free_scsi_task(task);
task = iscsi_prefetch10_sync(iscsi, lun, num_blocks + 1, 0, 0, 0);
if (task == NULL) {
printf("[FAILED]\n");
printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto test3;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi));
ret = -1;
scsi_free_scsi_task(task);
goto test3;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
test3:
/* Prefetch 0blocks at LBA:2^31 */
printf("PREFETCH10 0blocks at LBA:2^31 ... ");
if (num_blocks > 0x80000000) {
printf("[SKIPPED]\n");
printf("LUN is too big, skipping test\n");
goto test4;
}
task = iscsi_prefetch10_sync(iscsi, lun, 0x80000000, 0, 0, 0);
if (task == NULL) {
printf("[FAILED]\n");
printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto test4;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi));
ret = -1;
scsi_free_scsi_task(task);
goto test4;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
test4:
/* Prefetch 0blocks at LBA:-1 */
printf("PREFETCH10 0blocks at LBA:-1 ... ");
if (num_blocks > 0x80000000) {
printf("[SKIPPED]\n");
printf("LUN is too big, skipping test\n");
goto test5;
}
task = iscsi_prefetch10_sync(iscsi, lun, 0xffffffff, 0, 0, 0);
if (task == NULL) {
printf("[FAILED]\n");
printf("Failed to send PREFETCH10 command: %s\n", iscsi_get_error(iscsi));
ret = -1;
goto test5;
}
if (task->status != SCSI_STATUS_CHECK_CONDITION
|| task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST
|| task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) {
printf("[FAILED]\n");
printf("PREFETCH10 failed but with the wrong sense code. It should have failed with ILLEGAL_REQUEST/LBA_OUT_OF_RANGE. Sense:%s\n", iscsi_get_error(iscsi));
ret = -1;
scsi_free_scsi_task(task);
goto test5;
}
scsi_free_scsi_task(task);
printf("[OK]\n");
test5:
finished:
iscsi_logout_sync(iscsi);