diff --git a/test-tool/test_writeatomic16_vpd.c b/test-tool/test_writeatomic16_vpd.c index 0076360..1faff9b 100644 --- a/test-tool/test_writeatomic16_vpd.c +++ b/test-tool/test_writeatomic16_vpd.c @@ -31,7 +31,8 @@ test_writeatomic16_vpd(void) int ret; struct scsi_inquiry_block_limits *bl; struct scsi_task *bl_task = NULL; - unsigned char *buf = alloca(block_size); + int gran; + unsigned char *buf; logging(LOG_VERBOSE, LOG_BLANK_LINE); logging(LOG_VERBOSE, "Test WRITEATOMIC16 VPD data"); @@ -60,26 +61,16 @@ test_writeatomic16_vpd(void) logging(LOG_VERBOSE, "Check if WRITEATOMIC16 is supported"); - memset(buf, 0x00, block_size); - ret = writeatomic16(sd, 0, block_size, + if (bl->atomic_gran) { + gran = bl->atomic_gran; + } else { + gran = 1; + } + buf = alloca(block_size * gran); + memset(buf, 0x00, block_size * gran); + ret = writeatomic16(sd, 0, block_size * gran, block_size, 0, 0, 0, 0, buf, EXPECT_STATUS_GOOD); - - if (ret == 0) { - logging(LOG_VERBOSE, "WRITEATOMIC16 IS supported by the target."); - logging(LOG_VERBOSE, "Verify that MAXIMUM_ATOMIC_TRANSFER_LENGTH is non-zero"); - if (!bl->max_atomic_xfer_len) { - logging(LOG_VERBOSE, "[WARNING] MAXIMUM_ATOMIC_TRANSFER_LENGTH is zero but target supports ATOMICWRITE16"); - CU_FAIL("[WARNING] MAXIMUM_ATOMIC_TRANSFER_LENGTH is zero but target supports ATOMICWRITE16"); - - } - - logging(LOG_VERBOSE, "Verify that MAXIMUM_ATOMIC_TRANSFER_LENGTH is less than or equal to MAXIMUM_TRANSFER_LENGTH"); - if (bl->max_atomic_xfer_len > bl->max_xfer_len) { - logging(LOG_VERBOSE, "[FAILED] MAXIMUM_ATOMIC_TRANSFER_LENGTH is greater than MAXIMUM_TRANSFER_LENGTH"); - CU_FAIL("[FAILED] MAXIMUM_ATOMIC_TRANSFER_LENGTH is greater than MAXIMUM_TRANSFER_LENGTH"); - } - } if (ret == -2) { logging(LOG_VERBOSE, "WRITEATOMIC16 is NOT supported by the target."); @@ -100,6 +91,48 @@ test_writeatomic16_vpd(void) logging(LOG_VERBOSE, "ATOMIC_GRANULARITY is non-zero but target does not support ATOMICWRITE16"); CU_FAIL("ATOMIC_GRANULARITY is non-zero but target does not support ATOMICWRITE16"); } + goto finished; + } + + logging(LOG_VERBOSE, "WRITEATOMIC16 IS supported by the target."); + logging(LOG_VERBOSE, "Verify that MAXIMUM_ATOMIC_TRANSFER_LENGTH is non-zero"); + if (!bl->max_atomic_xfer_len) { + logging(LOG_VERBOSE, "[WARNING] MAXIMUM_ATOMIC_TRANSFER_LENGTH is zero but target supports ATOMICWRITE16"); + CU_FAIL("[WARNING] MAXIMUM_ATOMIC_TRANSFER_LENGTH is zero but target supports ATOMICWRITE16"); + } + + logging(LOG_VERBOSE, "Verify that MAXIMUM_ATOMIC_TRANSFER_LENGTH is less than or equal to MAXIMUM_TRANSFER_LENGTH"); + if (bl->max_atomic_xfer_len > bl->max_xfer_len) { + logging(LOG_VERBOSE, "[FAILED] MAXIMUM_ATOMIC_TRANSFER_LENGTH is greater than MAXIMUM_TRANSFER_LENGTH"); + CU_FAIL("[FAILED] MAXIMUM_ATOMIC_TRANSFER_LENGTH is greater than MAXIMUM_TRANSFER_LENGTH"); + } + + logging(LOG_VERBOSE, "Check handling on misaligned writes"); + if (bl->atomic_align < 2) { + logging(LOG_VERBOSE, "[SKIPPED] No alignment restrictions on this LUN"); + } else { + logging(LOG_VERBOSE, "Atomic Write at LBA 1 should fail due to misalignment"); + ret = writeatomic16(sd, 1, block_size * gran, + block_size, 0, 0, 0, 0, buf, + EXPECT_INVALID_FIELD_IN_CDB); + if (ret) { + logging(LOG_VERBOSE, "[FAILED] Misaligned write did NOT fail with INVALID_FIELD_IN_CDB"); + CU_FAIL("[FAILED] Misaligned write did NOT fail with INVALID_FIELD_IN_CDB"); + } + } + + logging(LOG_VERBOSE, "Check handling on invalid granularity"); + if (bl->atomic_gran < 2) { + logging(LOG_VERBOSE, "[SKIPPED] No granularity restrictions on this LUN"); + } else { + logging(LOG_VERBOSE, "Atomic Write of 1 block should fail due to invalid granularity"); + ret = writeatomic16(sd, 0, block_size, + block_size, 0, 0, 0, 0, buf, + EXPECT_INVALID_FIELD_IN_CDB); + if (ret) { + logging(LOG_VERBOSE, "[FAILED] Misgranularity write did NOT fail with INVALID_FIELD_IN_CDB"); + CU_FAIL("[FAILED] Misgranularity write did NOT fail with INVALID_FIELD_IN_CDB"); + } }