int T0102_read10_0blocks(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity10 *rc10; int ret, i, lun; uint32_t block_size, num_blocks; iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } /* find the size of the LUN */ task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0); if (task == NULL) { printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("Readcapacity command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } rc10 = scsi_datain_unmarshall(task); if (rc10 == NULL) { printf("failed to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } block_size = rc10->block_size; num_blocks = rc10->lba; scsi_free_scsi_task(task); ret = 0; /* read10 0 blocks one block at lba 0 */ printf("Reading 0 blocks at lba:0 ... "); task = iscsi_read10_sync(iscsi, lun, 0, 0, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 of 0 at lba:0 failed with sense.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); printf("[OK]\n"); /* read10 0 blocks one block beyond the eol */ printf("Reading 0 blocks at one block beyond end ... "); task = iscsi_read10_sync(iscsi, lun, num_blocks + 1, 0, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 of 0 one block beyond end-of-lun failed with sense.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); printf("[OK]\n"); /* read10 0 blocks two blocks beyond the eol */ printf("Reading 0 blocks at two blocks beyond end ... "); task = iscsi_read10_sync(iscsi, lun, num_blocks + 1, 0, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 of 0 two blocks beyond end-of-lun failed with sense.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); printf("[OK]\n"); /* read10 0 at lba -1 */ printf("Reading 0 blocks at lba:-1 ... "); task = iscsi_read10_sync(iscsi, lun, 0xffffff, 0, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 of 0 at lba:-1 failed with sense.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); printf("[OK]\n"); finished: iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
int T0270_verify16_simple(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; int ret, i, lun; unsigned char *buf = NULL; printf("0270_verify16_simple:\n"); printf("=====================\n"); if (show_info) { printf("Test basic VERIFY16 functionality.\n"); printf("1, Read and verify the first 1-256 blocks of the LUN using READ16/VERIFY16.\n"); printf("\n"); return 0; } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } buf = malloc(256 * block_size); if (buf == NULL) { printf("Failed to allocate buffer.\n"); ret = -1; goto finished; } printf("Read first 256 blocks.\n"); task = iscsi_read10_sync(iscsi, lun, 0, 256 * block_size, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } memcpy(buf, task->datain.data, task->datain.size); scsi_free_scsi_task(task); ret = 0; /* verify the first 1 - 256 blocks at the start of the LUN */ printf("Verify first 1-256 blocks.\n"); for (i = 1; i <= 256; i++) { ret = verify16(iscsi, lun, 0, i * block_size, block_size, 0, 1, 1, buf); if (ret != 0) { goto finished; } } finished: free(buf); iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
int T0131_verify10_mismatch(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; int ret, i, lun; unsigned char *buf = NULL; printf("0131_verify10_mismatch:\n"); printf("=======================\n"); if (show_info) { printf("Test basic VERIFY10 functionality.\n"); printf("1, Verify the first 1-256 blocks with a deliberate error detects the mismatch.\n"); printf("\n"); return 0; } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } buf = malloc(256 * block_size); if (buf == NULL) { printf("Failed to allocate buffer.\n"); ret = -1; goto finished; } printf("Read first 256 blocks.\n"); task = iscsi_read10_sync(iscsi, lun, 0, 256 * block_size, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } memcpy(buf, task->datain.data, task->datain.size); scsi_free_scsi_task(task); ret = 0; /* read and verify the first 1 - 256 blocks at the start of the LUN */ printf("Verify first 1-256 blocks with a miscompare.\n"); for (i = 1; i <= 256; i++) { int offset = random() % (i * block_size); /* flip a random byte in the data */ buf[offset] ^= 'X'; ret = verify10_miscompare(iscsi, lun, 0, i * block_size, block_size, 0, 1, 1, buf); if (ret != 0) { goto finished; } /* flip the byte back */ buf[offset] ^= 'X'; } finished: free(buf); iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
int T0100_read10_simple(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity10 *rc10; int ret, i, lun; uint32_t block_size, num_blocks; iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } /* find the size of the LUN */ task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0); if (task == NULL) { printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("Readcapacity command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } rc10 = scsi_datain_unmarshall(task); if (rc10 == NULL) { printf("failed to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } block_size = rc10->block_size; num_blocks = rc10->lba; scsi_free_scsi_task(task); ret = 0; /* read the first 1 - 256 blocks at the start of the LUN */ printf("Reading first 1-256 blocks ... "); for (i=1; i<=256; i++) { task = iscsi_read10_sync(iscsi, lun, 0, i * block_size, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); } printf("[OK]\n"); /* read the last 1 - 256 blocks at the end of the LUN */ printf("Reading last 1-256 blocks ... "); for (i=1; i<=256; i++) { task = iscsi_read10_sync(iscsi, lun, num_blocks +1 - i, i * block_size, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); } printf("[OK]\n"); finished: iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
int T0101_read10_beyond_eol(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity10 *rc10; int ret, i, lun; uint32_t block_size, num_blocks; iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } /* find the size of the LUN */ task = iscsi_readcapacity10_sync(iscsi, lun, 0, 0); if (task == NULL) { printf("Failed to send readcapacity10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("Readcapacity command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } rc10 = scsi_datain_unmarshall(task); if (rc10 == NULL) { printf("failed to unmarshall readcapacity10 data. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } block_size = rc10->block_size; num_blocks = rc10->lba; scsi_free_scsi_task(task); ret = 0; /* read 1-256 blocks, one block beyond the end-of-lun */ printf("Reading last 1-256 blocks one block beyond eol ... "); for (i=1; i<=256; i++) { task = iscsi_read10_sync(iscsi, lun, num_blocks + 2 - i, i * block_size, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 beyond end-of-lun did not fail with sense.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } if (task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST) { printf("[FAILED]\n"); printf("Read10 beyond end-of-lun did not return sense key ILLEGAL_REQUEST.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } if (task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { printf("[FAILED]\n"); printf("Read10 beyond end-of-lun did not return sense ascq LBA OUT OF RANGE.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); } printf("[OK]\n"); /* read 2-256 blocks, all but one block beyond the eol */ printf("Reading 1-255 blocks beyond eol starting at last block ... "); for (i=2; i<=256; i++) { task = iscsi_read10_sync(iscsi, lun, num_blocks, i * block_size, block_size); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send read10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("Read10 beyond end-of-lun did not return sense.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } if (task->sense.key != SCSI_SENSE_ILLEGAL_REQUEST) { printf("[FAILED]\n"); printf("Read10 beyond end-of-lun did not return sense key ILLEGAL_REQUEST.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } if (task->sense.ascq != SCSI_SENSE_ASCQ_LBA_OUT_OF_RANGE) { printf("[FAILED]\n"); printf("Read10 beyond end-of-lun did not return sense ascq LBA OUT OF RANGE.\n"); ret = -1; scsi_free_scsi_task(task); goto finished; } scsi_free_scsi_task(task); } printf("[OK]\n"); finished: iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
int T0102_read10_0blocks(const char *initiator, const char *url, int data_loss _U_, int show_info) { struct iscsi_context *iscsi; struct scsi_task *task; struct scsi_readcapacity16 *rc16; int ret = 0, lun; uint32_t block_size; uint64_t num_blocks; printf("0102_read10_0blocks:\n"); printf("====================\n"); if (show_info) { printf("Test that READ10 works correctly when transfer length is 0 blocks.\n"); printf("1, Read at LBA:0 should work.\n"); printf("2, Read at one block beyond end-of-lun should fail. (only on LUNs with less than 2^31 blocks)\n"); printf("3, Read at LBA:2^31 should fail (only on LUNs with less than 2^31 blocks).\n"); printf("4, Read at LBA:-1 should fail (only on LUNs with less than 2^31 blocks).\n"); printf("\n"); return 0; } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } /* find the size of the LUN */ task = iscsi_readcapacity16_sync(iscsi, lun); if (task == NULL) { printf("Failed to send READCAPACITY16 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("READCAPACITY16 command: failed with sense. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } rc16 = scsi_datain_unmarshall(task); if (rc16 == NULL) { printf("failed to unmarshall READCAPACITY16 data. %s\n", iscsi_get_error(iscsi)); ret = -1; scsi_free_scsi_task(task); goto finished; } block_size = rc16->block_length; num_blocks = rc16->returned_lba; scsi_free_scsi_task(task); printf("READ10 0blocks at LBA:0 ... "); task = iscsi_read10_sync(iscsi, lun, 0, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto test2; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 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: printf("READ10 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; } task = iscsi_read10_sync(iscsi, lun, num_blocks + 1, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto test3; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: Should fail when reading 0blocks beyond end\n"); ret = -1; scsi_free_scsi_task(task); 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("READ10 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"); test3: printf("READ10 0blocks at LBA 2^31 ... "); if (num_blocks > 0x80000000) { printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); goto test4; } task = iscsi_read10_sync(iscsi, lun, 0x80000000, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto test4; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: Should fail when reading 0blocks at 2^31\n"); ret = -1; scsi_free_scsi_task(task); 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("READ10 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"); test4: printf("READ10 0blocks at LBA -1 ... "); if (num_blocks > 0x80000000) { printf("[SKIPPED]\n"); printf("LUN is too big, skipping test\n"); goto test5; } task = iscsi_read10_sync(iscsi, lun, -1, 0, block_size, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send READ10 command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto test5; } if (task->status == SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("READ10 command: Should fail when reading 0blocks at -1\n"); ret = -1; scsi_free_scsi_task(task); 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("READ10 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"); test5: finished: iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }