コード例 #1
0
ファイル: test_readonly_sbc.c プロジェクト: bonzini/libiscsi
static void
test_writesame16(void)
{
        logging(LOG_VERBOSE, "Test WRITE_SAME16 fails with WRITE_PROTECTED");
        WRITESAME16(sd, 0, block_size, 1, 0, 0, 0, 0, scratch,
                    EXPECT_WRITE_PROTECTED);

        logging(LOG_VERBOSE, "Test WRITE_SAME16 UNMAP fails with "
                "WRITE_PROTECTED");
        WRITESAME16(sd, 0, block_size, 1, 0, 1, 0, 0, NULL,
                    EXPECT_WRITE_PROTECTED);
}
コード例 #2
0
void
test_writesame16_unmap_until_end(void)
{
        unsigned int i;

        CHECK_FOR_DATALOSS;
        CHECK_FOR_THIN_PROVISIONING;
        CHECK_FOR_LBPWS;
        CHECK_FOR_SBC;

        if (inq_bl->wsnz) {
                logging(LOG_NORMAL, "WRITESAME16 does not support 0-blocks."
                        "WSNZ == 1");
                memset(scratch, 0, block_size);
                WRITESAME16(sd, 0, block_size, 0, 0, 1, 0, 0, scratch,
                            EXPECT_INVALID_FIELD_IN_CDB);
                return;
        }

        logging(LOG_VERBOSE, LOG_BLANK_LINE);
        logging(LOG_VERBOSE, "Test WRITESAME16 of 1-256 blocks at the end of the LUN by setting number-of-blocks==0");
        memset(scratch, 0xa6, 256 * block_size);
        for (i = 1; i <= 256; i++) {
                logging(LOG_VERBOSE, "Write %d blocks of 0xFF", i);
                memset(scratch, 0xff, block_size * i);
                WRITE16(sd, num_blocks - i,
                        i * block_size, block_size, 0, 0, 0, 0, 0, scratch,
                        EXPECT_STATUS_GOOD);

                logging(LOG_VERBOSE, "Unmap %d blocks using WRITESAME16", i);
                memset(scratch, 0, block_size);
                WRITESAME16(sd, num_blocks - i,
                            block_size, 0, 0, 1, 0, 0, scratch,
                            EXPECT_STATUS_GOOD);

                if (rc16->lbprz) {
                        logging(LOG_VERBOSE, "LBPRZ is set. Read the unmapped "
                                "blocks back and verify they are all zero");

                        logging(LOG_VERBOSE, "Read %d blocks and verify they "
                                "are now zero", i);
                        READ16(sd, NULL, num_blocks - i,
                               i * block_size, block_size,
                               0, 0, 0, 0, 0, scratch,
                               EXPECT_STATUS_GOOD);
                        ALL_ZERO(scratch, i * block_size);
                } else {
                        logging(LOG_VERBOSE, "LBPRZ is clear. Skip the read "
                                "and verify zero test");
                }
        }
}
コード例 #3
0
void
test_writesame16_wrprotect(void)
{
        int i;

        /*
         * Try out different non-zero values for WRPROTECT.
         */
        logging(LOG_VERBOSE, LOG_BLANK_LINE);
        logging(LOG_VERBOSE, "Test WRITESAME16 with non-zero WRPROTECT");

        CHECK_FOR_DATALOSS;
        CHECK_FOR_SBC;

        memset(scratch, 0, block_size);
        if (!inq->protect || (rc16 != NULL && !rc16->prot_en)) {
                logging(LOG_VERBOSE, "Device does not support/use protection information. All commands should fail.");
                for (i = 1; i < 8; i++) {
                        WRITESAME16(sd, 0, block_size, 1, 0, 0, i, 0, scratch,
                                    EXPECT_INVALID_FIELD_IN_CDB);
                }
                return;
        }

        logging(LOG_NORMAL, "No tests for devices that support protection information yet.");
}
コード例 #4
0
void
test_writesame16_0blocks(void)
{
        CHECK_FOR_DATALOSS;
        CHECK_FOR_SBC;

        if (!inq_bl) {
                CU_PASS("BlockLimits VPD is not available. Skipping test.\n");
                return;
        }

        logging(LOG_VERBOSE, LOG_BLANK_LINE);
        logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks at LBA==0 (WSNZ=%d)",
                inq_bl->wsnz);
        memset(scratch, 0, block_size);

        if (inq_bl->wsnz) {
                WRITESAME16(sd, 0, block_size, 0, 0, 0, 0, 0, scratch,
                            EXPECT_INVALID_FIELD_IN_CDB);
                logging(LOG_NORMAL, "[SKIPPED] WRITESAME16 does not support 0-blocks.");
                return;
        }


        if (inq_bl->max_ws_len > 0 && num_blocks >= inq_bl->max_ws_len) {
            WRITESAME16(sd, 0, block_size, 0, 0, 0, 0, 0, scratch,
                        EXPECT_INVALID_FIELD_IN_CDB);
        } else {
            WRITESAME16(sd, 0, block_size, 0, 0, 0, 0, 0, scratch,
                        EXPECT_STATUS_GOOD);
        }

        if (inq_bl->max_ws_len > 0) {
            logging(LOG_VERBOSE,
                    "Test WRITESAME16 at MAXIMUM WRITE SAME LENGTH + 1 blocks "
                    "from end-of-LUN");
            CHECK_SIZE((inq_bl->max_ws_len + 1),
                       WRITESAME16(sd, num_blocks - (inq_bl->max_ws_len + 1),
                                   block_size, 0, 0, 0, 0, 0, scratch,
                                   EXPECT_INVALID_FIELD_IN_CDB));
            logging(LOG_VERBOSE,
                    "Test WRITESAME16 at MAXIMUM WRITE SAME LENGTH blocks "
                    "from end-of-LUN");
            CHECK_SIZE(inq_bl->max_ws_len,
                       WRITESAME16(sd, num_blocks - inq_bl->max_ws_len,
                                   block_size, 0, 0, 0, 0, 0, scratch,
                                   EXPECT_STATUS_GOOD));
            logging(LOG_VERBOSE,
                    "Test WRITESAME16 at MAXIMUM WRITE SAME LENGTH - 1 blocks "
                    "from end-of-LUN");
            CHECK_SIZE((inq_bl->max_ws_len - 1),
                       WRITESAME16(sd, num_blocks - (inq_bl->max_ws_len - 1),
                                   block_size, 0, 0, 0, 0, 0, scratch,
                                   EXPECT_STATUS_GOOD));
        } else {
            logging(LOG_VERBOSE, "[SKIPPING] No MAXIMUM WRITE SAME LENGTH - "
                    "skipping MAXIMUM WRITE SAME LENGTH asserts.");
        }

        logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks one block past end-of-LUN");
        WRITESAME16(sd, num_blocks + 1, block_size, 0, 0, 0, 0, 0, scratch,
                    EXPECT_LBA_OOB);

        logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks at LBA==2^63");
        WRITESAME16(sd, 0x8000000000000000ULL,
                    block_size, 0, 0, 0, 0, 0, scratch,
                    EXPECT_LBA_OOB);

        logging(LOG_VERBOSE, "Test WRITESAME16 0-blocks at LBA==-1");
        WRITESAME16(sd, -1, block_size, 0, 0, 0, 0, 0, scratch,
                    EXPECT_LBA_OOB);
}