diff --git a/Makefile.am b/Makefile.am index 645ae68..a00b09f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -268,6 +268,7 @@ bin_iscsi_test_cu_SOURCES = test-tool/iscsi-test-cu.c \ test-tool/test_testunitready_simple.c \ test-tool/test_unmap_simple.c \ test-tool/test_unmap_0blocks.c \ + test-tool/test_unmap_vpd.c \ test-tool/test_verify10_simple.c \ test-tool/test_verify10_beyond_eol.c \ test-tool/test_verify10_0blocks.c \ diff --git a/test-tool/iscsi-test-cu.c b/test-tool/iscsi-test-cu.c index 6c84642..cb7fdb4 100644 --- a/test-tool/iscsi-test-cu.c +++ b/test-tool/iscsi-test-cu.c @@ -246,6 +246,7 @@ static CU_TestInfo tests_startstopunit[] = { static CU_TestInfo tests_unmap[] = { { (char *)"UnmapSimple", test_unmap_simple }, + { (char *)"UnmapVPD", test_unmap_vpd }, { (char *)"UnmapZeroBlocks", test_unmap_0blocks }, CU_TEST_INFO_NULL }; diff --git a/test-tool/iscsi-test-cu.h b/test-tool/iscsi-test-cu.h index af961a5..3cfd7c5 100644 --- a/test-tool/iscsi-test-cu.h +++ b/test-tool/iscsi-test-cu.h @@ -154,6 +154,7 @@ void test_testunitready_simple(void); void test_unmap_simple(void); void test_unmap_0blocks(void); +void test_unmap_vpd(void); void test_verify10_simple(void); void test_verify10_beyond_eol(void); diff --git a/test-tool/test_unmap_vpd.c b/test-tool/test_unmap_vpd.c new file mode 100644 index 0000000..600dc9b --- /dev/null +++ b/test-tool/test_unmap_vpd.c @@ -0,0 +1,79 @@ +/* + Copyright (C) 2013 Ronnie Sahlberg + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . +*/ + +#include + +#include + +#include "iscsi.h" +#include "scsi-lowlevel.h" +#include "iscsi-support.h" +#include "iscsi-test-cu.h" + + +void +test_unmap_vpd(void) +{ + int ret; + struct unmap_list list[1]; + + CHECK_FOR_SBC; + + logging(LOG_VERBOSE, LOG_BLANK_LINE); + logging(LOG_VERBOSE, "Test UNMAP availability is consistent with VPD settings"); + + + logging(LOG_VERBOSE, "Check if UNMAP is available."); + list[0].lba = 0; + list[0].num = 0; + ret = unmap(iscsic, tgt_lun, 0, list, 1); + + if (ret != 0) { + logging(LOG_VERBOSE, "UNMAP is not available. Verify that VPD " + "settings reflect this."); + + logging(LOG_VERBOSE, "Verify that LBPU is clear."); + if (inq_lbp && inq_lbp->lbpu) { + logging(LOG_NORMAL, "[FAILED] UNMAP is not implemented " + "but LBPU is set"); + CU_FAIL("[FAILED] UNMAP is unavailable but LBPU==1"); + } else { + logging(LOG_VERBOSE, "[SUCCESS] LBPU is clear."); + } + } else { + logging(LOG_VERBOSE, "UNMAP is available. Verify that VPD " + "settings reflect this."); + + logging(LOG_VERBOSE, "Verify that LBPME is set."); + if (rc16 && rc16->lbpme) { + logging(LOG_VERBOSE, "[SUCCESS] LBPME is set."); + } else { + logging(LOG_NORMAL, "[FAILED] UNMAP is implemented " + "but LBPME is not set"); + CU_FAIL("[FAILED] UNMAP is available but LBPME==0"); + } + + logging(LOG_VERBOSE, "Verify that LBPU is set."); + if (inq_lbp && inq_lbp->lbpu) { + logging(LOG_VERBOSE, "[SUCCESS] LBPU is set."); + } else { + logging(LOG_NORMAL, "[FAILED] UNMAP is implemented " + "but LBPU is not set"); + CU_FAIL("[FAILED] UNMAP is available but LBPU==0"); + } + } +}