void test_preventallow_warm_reset(void) { int ret; CHECK_FOR_SBC; CHECK_FOR_REMOVABLE; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that Target Warm Reset clears PREVENT MEDIUM REMOVAL"); logging(LOG_VERBOSE, "Set the PREVENT flag"); ret = preventallow(iscsic, tgt_lun, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Try to eject the medium"); ret = startstopunit_preventremoval(iscsic, tgt_lun, 0, 0, 0, 0, 1, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Verify we can still access the media."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Perform warm reset on target"); ret = iscsi_task_mgmt_target_warm_reset_sync(iscsic); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Wait until all unit attentions clear"); while (testunitready(iscsic, tgt_lun) != 0); logging(LOG_VERBOSE, "Try to eject the medium"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 0, 1, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Verify we can not access the media."); ret = testunitready_nomedium(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Load the medium"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 0, 1, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Clear PREVENT and load medium in case target failed"); logging(LOG_VERBOSE, "Test we can clear PREVENT flag"); ret = preventallow(iscsic, tgt_lun, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Load the medium"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 0, 1, 1); CU_ASSERT_EQUAL(ret, 0); }
void test_preventallow_cold_reset(void) { int ret; CHECK_FOR_SBC; CHECK_FOR_REMOVABLE; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that Target Warm Reset clears PREVENT MEDIUM REMOVAL"); if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PREVENTALLOW test is " "only supported for iSCSI backends"; logging(LOG_NORMAL, "%s", err); CU_PASS(err); return; } logging(LOG_VERBOSE, "Set the PREVENT flag"); PREVENTALLOW(sd, 1); logging(LOG_VERBOSE, "Try to eject the medium"); STARTSTOPUNIT(sd, 0, 0, 0, 0, 1, 0, EXPECT_REMOVAL_PREVENTED); logging(LOG_VERBOSE, "Verify we can still access the media."); TESTUNITREADY(sd, EXPECT_STATUS_GOOD); logging(LOG_VERBOSE, "Perform cold reset on target"); ret = iscsi_task_mgmt_target_cold_reset_sync(sd->iscsi_ctx); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Wait until all unit attentions clear"); while (testunitready(sd, EXPECT_STATUS_GOOD) != 0) ; logging(LOG_VERBOSE, "Try to eject the medium"); STARTSTOPUNIT(sd, 0, 0, 0, 0, 1, 0, EXPECT_STATUS_GOOD); logging(LOG_VERBOSE, "Verify we can not access the media."); TESTUNITREADY(sd, EXPECT_NO_MEDIUM); logging(LOG_VERBOSE, "Load the medium"); STARTSTOPUNIT(sd, 0, 0, 0, 0, 1, 0, EXPECT_STATUS_GOOD); logging(LOG_VERBOSE, "Clear PREVENT and load medium in case target failed"); logging(LOG_VERBOSE, "Test we can clear PREVENT flag"); PREVENTALLOW(sd, 0); logging(LOG_VERBOSE, "Load the medium"); STARTSTOPUNIT(sd, 0, 0, 0, 0, 1, 1, EXPECT_STATUS_GOOD); }
void test_iscsi_cmdsn_toolow(void) { int ret; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test sending invalid iSCSI CMDSN"); logging(LOG_VERBOSE, "CMDSN MUST be in the range EXPCMDSN and MAXCMDSN"); logging(LOG_VERBOSE, "RFC3720:3.2.2.1 CMDSN < EXPCMDSN must be silently ignored by the target"); logging(LOG_VERBOSE, "Send a TESTUNITREADY with CMDSN == EXPCMDSN-1. Should be ignored by the target."); iscsic->use_immediate_data = ISCSI_IMMEDIATE_DATA_NO; iscsic->target_max_recv_data_segment_length = block_size; local_iscsi_queue_pdu = my_iscsi_queue_pdu; change_cmdsn = 1; /* we don't want autoreconnect since some targets will incorrectly * drop the connection on this condition. */ iscsi_set_noautoreconnect(iscsic, 1); iscsi_set_timeout(iscsic, 3); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, -1); if (ret == -1) { logging(LOG_VERBOSE, "[SUCCESS] We did not receive a reply"); } else { logging(LOG_VERBOSE, "[FAILURE] We got a response from the target but SMDSN was outside of the window."); } iscsi_set_noautoreconnect(iscsic, 0); logging(LOG_VERBOSE, "Send a TESTUNITREADY with CMDSN == EXPCMDSN. should work again"); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); }
void test_mandatory_sbc(void) { int ret; //unsigned char buf[4096]; //struct unmap_list list[1]; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test support for all mandatory opcodes on SBC devices"); CHECK_FOR_SBC; logging(LOG_VERBOSE, "Test INQUIRY."); ret = inquiry(sd, NULL, 0, 0, 255, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test READCAPACITY10."); ret = readcapacity10(sd, NULL, 0, 0, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); if (sbc3_support) { logging(LOG_VERBOSE, "Test READCAPACITY16. The device claims SBC-3 support."); ret = readcapacity16(sd, NULL, 15, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); } logging(LOG_VERBOSE, "Test READ10."); ret = read10(sd, NULL, 0, block_size, block_size, 0, 0, 0, 0, 0, NULL, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); if (sbc3_support) { logging(LOG_VERBOSE, "Test READ16. the device claims SBC-3 support."); ret = read16(sd, 0, block_size, block_size, 0, 0, 0, 0, 0, NULL, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); } logging(LOG_VERBOSE, "Test TESTUNITREADY."); ret = testunitready(sd, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); }
int T0360_startstopunit_simple(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; int ret, lun; printf("0360_startstopunit_simple:\n"); printf("===================\n"); if (show_info) { printf("Test basic STARTSTOPUNIT functionality.\n"); printf("1, Verify we can eject removable the media with IMMED==1\n"); printf("2, Verify we can load the media back again with IMMED==1\n"); printf("3, Verify we can eject removable the media with IMMED==0\n"); printf("4, Verify we can load the media back again with IMMED==0\n"); printf("\n"); return 0; } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); ret = -2; goto finished; } ret = 0; if (inq->rmb) { printf("Media is removable. STARTSTOPUNIT should work\n"); } else { printf("Media is not removable. STARTSTOPUNIT should fail\n"); } printf("STARTSTOPUNIT try to eject the media with IMMED==1 ... "); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); if (inq->rmb) { printf("Medium is removable. Check with TESTUNITREADY that was removed.\n"); ret = testunitready_nomedium(iscsi, lun); if (ret != 0) { goto finished; } } else { printf("Medium is not removable. Check with TESTUNITREADY that medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } } printf("STARTSTOPUNIT try to mount the media again with IMMED==1 ... "); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } printf("STARTSTOPUNIT try to eject the media with IMMED==0 ... "); task = iscsi_startstopunit_sync(iscsi, lun, 0, 0, 0, 0, 1, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); if (inq->rmb) { printf("Medium is removable. Check with TESTUNITREADY that was removed.\n"); ret = testunitready_nomedium(iscsi, lun); if (ret != 0) { goto finished; } } else { printf("Medium is not removable. Check with TESTUNITREADY that medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } } printf("STARTSTOPUNIT try to mount the media again with IMMED==0 ... "); task = iscsi_startstopunit_sync(iscsi, lun, 0, 0, 0, 0, 1, 1); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } finished: iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
void test_preventallow_2_itnexuses(void) { int ret; struct scsi_device sd2; CHECK_FOR_SBC; CHECK_FOR_REMOVABLE; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test that PREVENT MEDIUM REMOVAL are seen on other nexuses as well"); if (sd->iscsi_ctx == NULL) { const char *err = "[SKIPPED] This PREVENTALLOW test is " "only supported for iSCSI backends"; logging(LOG_NORMAL, "%s", err); CU_PASS(err); return; } logging(LOG_VERBOSE, "Set the PREVENT flag"); ret = preventallow(sd, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Try to eject the medium"); ret = startstopunit(sd, 0, 0, 0, 0, 1, 0, EXPECT_REMOVAL_PREVENTED); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Verify we can still access the media."); ret = testunitready(sd, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Create a second connection to the target"); memset(&sd2, 0, sizeof(sd2)); sd2.iscsi_ctx = iscsi_context_login(initiatorname2, sd->iscsi_url, &sd->iscsi_lun); if (sd2.iscsi_ctx == NULL) { logging(LOG_VERBOSE, "Failed to login to target"); return; } logging(LOG_VERBOSE, "Try to eject the medium on the second connection"); ret = startstopunit(&sd2, 0, 0, 0, 0, 1, 0, EXPECT_REMOVAL_PREVENTED); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Logout the second connection from target"); iscsi_logout_sync(sd2.iscsi_ctx); iscsi_destroy_context(sd2.iscsi_ctx); logging(LOG_VERBOSE, "Clear PREVENT and load medium in case target failed"); logging(LOG_VERBOSE, "Test we can clear PREVENT flag"); ret = preventallow(sd, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Load the medium"); ret = startstopunit(sd, 0, 0, 0, 0, 1, 1, EXPECT_STATUS_GOOD); CU_ASSERT_EQUAL(ret, 0); }
int T0362_startstopunit_noloej(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; int ret, lun; printf("0362_startstopunit_noloej:\n"); printf("===================\n"); if (show_info) { printf("Test STARTSTOPUNIT and LOEJ==0 will never eject/load media.\n"); printf("1, LOEJ==0 IMMED==0 NO_FLUSH==0 START==0 will not eject the media\n"); printf("2, LOEJ==0 IMMED==0 NO_FLUSH==0 START==1 will not eject the media\n"); printf("3, LOEJ==0 IMMED==1 NO_FLUSH==0 START==0 will not eject the media\n"); printf("4, LOEJ==0 IMMED==1 NO_FLUSH==0 START==1 will not eject the media\n"); printf("5, LOEJ==0 IMMED==0 NO_FLUSH==1 START==0 will not eject the media\n"); printf("6, LOEJ==0 IMMED==0 NO_FLUSH==1 START==1 will not eject the media\n"); printf("7, LOEJ==0 IMMED==1 NO_FLUSH==1 START==0 will not eject the media\n"); printf("8, LOEJ==0 IMMED==1 NO_FLUSH==1 START==1 will not eject the media\n"); printf("\n"); return 0; } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); ret = -2; goto finished; } ret = 0; if (!removable) { printf("Media is not removable. SKIPPING tests\n"); ret = -2; goto finished; } printf("STARTSTOP LOEJ==0 IMMED==0 NO_FLUSH==0 START==0 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 0, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); printf("STARTSTOP LOEJ==0 IMMED==0 NO_FLUSH==0 START==1 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 0, 0, 0, 0, 0, 1); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); printf("STARTSTOP LOEJ==0 IMMED==1 NO_FLUSH==0 START==0 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); printf("STARTSTOP LOEJ==0 IMMED==1 NO_FLUSH==0 START==1 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 0, 1); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); printf("STARTSTOP LOEJ==0 IMMED==0 NO_FLUSH==1 START==0 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 0, 0, 0, 1, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); printf("STARTSTOP LOEJ==0 IMMED==0 NO_FLUSH==1 START==1 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 0, 0, 0, 1, 0, 1); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); printf("STARTSTOP LOEJ==0 IMMED==1 NO_FLUSH==1 START==0 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 1, 0, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); printf("STARTSTOP LOEJ==0 IMMED==1 NO_FLUSH==1 START==1 does not eject media ... "); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 1, 0, 1); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } /* in case the previous command did eject the media */ iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); finished: iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
int T0361_startstopunit_pwrcnd(const char *initiator, const char *url) { struct iscsi_context *iscsi; struct scsi_task *task; int ret, i, lun; printf("0361_startstopunit_pwrcnd:\n"); printf("===================\n"); if (show_info) { printf("Test STARTSTOPUNIT POWERCONDITION functionality.\n"); printf("1, If PC != 0 we can not eject the media\n"); printf("2, Try to remount the media\n"); printf("\n"); return 0; } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } if (!data_loss) { printf("--dataloss flag is not set. Skipping test\n"); ret = -2; goto finished; } ret = 0; if (inq->rmb) { printf("Media is removable. STARTSTOPUNIT should work\n"); } else { printf("Media is not removable. STARTSTOPUNIT should fail\n"); } for (i = 1; i < 16; i++) { printf("Try to eject media with PC == %d ... ", i); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, i, 0, 1, 0); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } } printf("Try to mount the media again ... "); task = iscsi_startstopunit_sync(iscsi, lun, 1, 0, 0, 0, 1, 1); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send STARTSTOPUNIT command: %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("STARTSTOPUNIT 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"); printf("Check with TESTUNITREADY that the medium is still present.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } finished: iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); return ret; }
void test_startstopunit_simple(void) { int ret; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test basic STARTSTOPUNIT"); logging(LOG_VERBOSE, "Test we can eject removable the media with IMMED==1"); if (inq->rmb) { logging(LOG_VERBOSE, "Media is not removable. STARTSTOPUNIT should fail"); } else { logging(LOG_VERBOSE, "Media is removable. STARTSTOPUNIT should work"); } ret = startstopunit(iscsic, tgt_lun, 1, 0, 0, 0, 1, 0); if (!inq->rmb) { CU_ASSERT_NOT_EQUAL(ret, 0); return; } CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is ejected."); ret = testunitready_nomedium(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test we can load the removable the media with IMMED==1"); ret = startstopunit(iscsic, tgt_lun, 1, 0, 0, 0, 1, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Verify we can read from the media."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test we can eject removable the media with IMMED==1"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 0, 1, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is ejected."); ret = testunitready_nomedium(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test we can load the removable the media with IMMED==1"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 0, 1, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Verify we can access the media again."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); }
int T0422_reserve6_logout(const char *initiator, const char *url) { struct iscsi_context *iscsi = NULL, *iscsi2 = NULL; struct scsi_task *task; int ret, lun; printf("0422_reserve6_logout:\n"); printf("=====================\n"); if (show_info) { printf("Test that a RESERVE6 is dropped when the session is logged out\n"); printf(" If device does not support RESERVE6, just skip the test.\n"); printf("1, Reserve the device from the first initiator.\n"); printf("2, Verify we can access the LUN from the first initiator.\n"); printf("3, Verify we can NOT access the LUN from the second initiator.\n"); printf("4, Logout the first initiator.\n"); printf("5, Verify we can access the LUN from the second initiator.\n"); printf("\n"); return 0; } iscsi = iscsi_context_login(initiator, url, &lun); if (iscsi == NULL) { printf("Failed to login to target\n"); return -1; } iscsi2 = iscsi_context_login(initiatorname2, url, &lun); if (iscsi2 == NULL) { printf("Failed to login to target\n"); return -1; } ret = 0; printf("Send RESERVE6 from the first initiator ... "); task = iscsi_reserve6_sync(iscsi, lun); if (task == NULL) { printf("[FAILED]\n"); printf("Failed to send RESERVE6 command : %s\n", iscsi_get_error(iscsi)); ret = -1; goto finished; } 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("RESERVE6 Not Supported\n"); ret = -2; scsi_free_scsi_task(task); goto finished; } if (task->status != SCSI_STATUS_GOOD) { printf("[FAILED]\n"); printf("RESERVE6 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"); printf("Verify we can access the LUN from the first initiator.\n"); ret = testunitready(iscsi, lun); if (ret != 0) { goto finished; } printf("Verify we can NOT access the LUN from the second initiator.\n"); ret = testunitready_conflict(iscsi2, lun); if (ret != 0) { goto finished; } printf("Logout the first initiator ... "); iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); iscsi = NULL; printf("[OK]\n"); printf("Verify we can access the LUN from the second initiator.\n"); ret = testunitready(iscsi2, lun); if (ret != 0) { goto finished; } finished: if (iscsi2 != NULL) { iscsi_logout_sync(iscsi2); iscsi_destroy_context(iscsi2); } if (iscsi != NULL) { iscsi_logout_sync(iscsi); iscsi_destroy_context(iscsi); } return ret; }
void test_startstopunit_noloej(void) { int ret; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test STARTSTOPUNIT LOEJ==0"); if (!inq->rmb) { logging(LOG_VERBOSE, "[SKIPPED] LUN is not removable. " "Skipping test."); return; } logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==0 NO_FLUSH==0 START==0"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 0, 0, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==0 NO_FLUSH==0 START==1"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 0, 0, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==1 NO_FLUSH==0 START==0"); ret = startstopunit(iscsic, tgt_lun, 1, 0, 0, 0, 0, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==1 NO_FLUSH==0 START==1"); ret = startstopunit(iscsic, tgt_lun, 1, 0, 0, 0, 0, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==0 NO_FLUSH==1 START==0"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 1, 0, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==0 NO_FLUSH==1 START==1"); ret = startstopunit(iscsic, tgt_lun, 0, 0, 0, 1, 0, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==1 NO_FLUSH==1 START==0"); ret = startstopunit(iscsic, tgt_lun, 1, 0, 0, 1, 0, 0); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test that media is not ejected when LOEJ==0 IMMED==1 NO_FLUSH==1 START==1"); ret = startstopunit(iscsic, tgt_lun, 1, 0, 0, 1, 0, 1); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "Test TESTUNITREADY that medium is not ejected."); ret = testunitready(iscsic, tgt_lun); CU_ASSERT_EQUAL(ret, 0); logging(LOG_VERBOSE, "In case the target did eject the medium, load it again."); startstopunit(iscsic, tgt_lun, 1, 0, 0, 0, 1, 1); }