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:
@@ -32,12 +32,11 @@ int T0293_write10_0blocks(const char *initiator, const char *url, int data_loss,
|
||||
printf("0293_write10_0blocks:\n");
|
||||
printf("====================\n");
|
||||
if (show_info) {
|
||||
printf("Test that WRITE10 works correctly when writing 0 number of blocks.\n");
|
||||
printf("1, Read at LBA:0 should work.\n");
|
||||
printf("2, Read at LBA:end-of-lun should work.\n");
|
||||
printf("3, Read at LBA:end-of-lun+1 should fail.\n");
|
||||
printf("4, Read at LBA:2^63 should fail (only on LUNs < 2TB).\n");
|
||||
printf("5, Read at LBA:-1 should fail (only on LUNs < 2TB).\n");
|
||||
printf("Test that WRITE10 works correctly when transfer length is 0 blocks.\n");
|
||||
printf("1, Write at LBA:0 should work.\n");
|
||||
printf("2, Write at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n");
|
||||
printf("3, Write at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n");
|
||||
printf("4, Write at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n");
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -80,11 +79,11 @@ int T0293_write10_0blocks(const char *initiator, const char *url, int data_loss,
|
||||
}
|
||||
|
||||
|
||||
printf("WRITE10 0blocks at LBA:0 ");
|
||||
printf("WRITE10 0blocks at LBA:0 ... ");
|
||||
task = iscsi_write10_sync(iscsi, lun, 0, NULL, 0, block_size, 0, 0, 0, 0, 0);
|
||||
if (task == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("Failed to send write10 command: %s\n", iscsi_get_error(iscsi));
|
||||
printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
goto test2;
|
||||
}
|
||||
@@ -95,72 +94,81 @@ int T0293_write10_0blocks(const char *initiator, const char *url, int data_loss,
|
||||
scsi_free_scsi_task(task);
|
||||
goto test2;
|
||||
}
|
||||
scsi_free_scsi_task(task);
|
||||
printf("[OK]\n");
|
||||
|
||||
|
||||
test2:
|
||||
printf("WRITE10 0blocks at LBA:<end-of-disk> ");
|
||||
task = iscsi_write10_sync(iscsi, lun, num_blocks, NULL, 0, block_size, 0, 0, 0, 0, 0);
|
||||
if (task == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("Failed to send write10 command: %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
printf("WRITE10 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;
|
||||
}
|
||||
if (task->status != SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("WRITE10 command: failed with sense. %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
goto test3;
|
||||
}
|
||||
printf("[OK]\n");
|
||||
|
||||
|
||||
test3:
|
||||
printf("WRITE10 0blocks at LBA:<beyond end-of-disk> ");
|
||||
task = iscsi_write10_sync(iscsi, lun, num_blocks + 1, NULL, 0, block_size, 0, 0, 0, 0, 0);
|
||||
if (task == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("Failed to send write10 command: %s\n", iscsi_get_error(iscsi));
|
||||
printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
goto test4;
|
||||
goto test3;
|
||||
}
|
||||
if (task->status == SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("WRITE10 command: Should fail when writing 0blocks beyond end\n");
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
goto test4;
|
||||
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("WRITE10 failed but ascq was wrong. 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");
|
||||
|
||||
test4:
|
||||
printf("WRITE10 0blocks at LBA 2^31 ... ");
|
||||
test3:
|
||||
printf("WRITE10 0blocks at LBA:2^31 ... ");
|
||||
if (num_blocks > 0x80000000) {
|
||||
printf("[SKIPPED]\n");
|
||||
printf("LUN is too big, skipping test\n");
|
||||
goto test5;
|
||||
goto test4;
|
||||
}
|
||||
task = iscsi_write10_sync(iscsi, lun, 0x80000000, NULL, 0, block_size, 0, 0, 0, 0, 0);
|
||||
if (task == NULL) {
|
||||
printf("[FAILED]\n");
|
||||
printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
goto test5;
|
||||
goto test4;
|
||||
}
|
||||
if (task->status == SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("WRITE10 command: Should fail when writing 0blocks at 2^31\n");
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
goto test5;
|
||||
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("WRITE10 failed but ascq was wrong. 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");
|
||||
|
||||
|
||||
test5:
|
||||
printf("WRITE10 0blocks at LBA -1 ... ");
|
||||
test4:
|
||||
printf("WRITE10 0blocks at LBA:-1 ... ");
|
||||
if (num_blocks > 0x80000000) {
|
||||
printf("[SKIPPED]\n");
|
||||
printf("LUN is too big, skipping test\n");
|
||||
goto test5;
|
||||
}
|
||||
@@ -169,19 +177,29 @@ test5:
|
||||
printf("[FAILED]\n");
|
||||
printf("Failed to send WRITE10 command: %s\n", iscsi_get_error(iscsi));
|
||||
ret = -1;
|
||||
goto test6;
|
||||
goto test5;
|
||||
}
|
||||
if (task->status == SCSI_STATUS_GOOD) {
|
||||
printf("[FAILED]\n");
|
||||
printf("WRITE10 command: Should fail when writing 0blocks at -1\n");
|
||||
ret = -1;
|
||||
scsi_free_scsi_task(task);
|
||||
goto test6;
|
||||
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("WRITE10 failed but ascq was wrong. 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");
|
||||
|
||||
|
||||
test6:
|
||||
test5:
|
||||
|
||||
finished:
|
||||
iscsi_logout_sync(iscsi);
|
||||
|
||||
Reference in New Issue
Block a user