68 lines
2.4 KiB
Plaintext
68 lines
2.4 KiB
Plaintext
|
|
# sg_compare_and_write.txt
|
||
|
|
# This file provides a usage example of sg_compare_and_write.
|
||
|
|
# sg_compare_and_write accepts a buffer containing 2 logical instances:
|
||
|
|
# - the verify instance: used to match the current content of the LBA range
|
||
|
|
# - the write instance: used to write to the LBA if the verify succeeds
|
||
|
|
#
|
||
|
|
# In case of failure to verify the data, the command will return with check
|
||
|
|
# condition with the sense code set to MISCOMPARE DURING VERIFY OPERATION.
|
||
|
|
#
|
||
|
|
# The following example shows initialization, successful and unsuccessful
|
||
|
|
# compare and write using sg3_utils. I am using caw_buf_zero2one and
|
||
|
|
# caw_buf_one2zero as shown below.
|
||
|
|
|
||
|
|
$ hexdump /tmp/caw_buf_zero2one
|
||
|
|
0000000 0000 0000 0000 0000 0000 0000 0000 0000
|
||
|
|
*
|
||
|
|
0000200 1111 1111 1111 1111 1111 1111 1111 1111
|
||
|
|
*
|
||
|
|
0000400
|
||
|
|
|
||
|
|
$ hexdump /tmp/caw_buf_one2zero
|
||
|
|
0000000 1111 1111 1111 1111 1111 1111 1111 1111
|
||
|
|
*
|
||
|
|
0000200 0000 0000 0000 0000 0000 0000 0000 0000
|
||
|
|
*
|
||
|
|
0000400
|
||
|
|
|
||
|
|
$ sg_map -i -x
|
||
|
|
/dev/sg0 0 0 0 0 0 /dev/sda ATA ST3320613AS CC2H
|
||
|
|
/dev/sg1 3 0 0 0 5 /dev/scd0 HL-DT-ST DVD-RAM GH22NS30 1.01
|
||
|
|
/dev/sg2 5 0 0 0 0 /dev/sdb KMNRIO K2 0000
|
||
|
|
/dev/sg3 5 0 0 1 0 /dev/sdc KMNRIO K2 0000
|
||
|
|
|
||
|
|
# First I zero out the volume to make sure that the first compare and write
|
||
|
|
# will succeed
|
||
|
|
$ sg_write_same --16 -i /dev/zero -n 0x200000 -x 512 /dev/sdc
|
||
|
|
|
||
|
|
$ dd if=/dev/sdc bs=512 count=1 skip=100 2>/dev/null | hexdump
|
||
|
|
0000000 0000 0000 0000 0000 0000 0000 0000 0000
|
||
|
|
*
|
||
|
|
0000200
|
||
|
|
|
||
|
|
$ ./sg_compare_and_write --in=/tmp/caw_buf_zero2one --lba=100 --xferlen=1024 /dev/sdc
|
||
|
|
|
||
|
|
# contents of LBA 100 are a block of ones
|
||
|
|
$ dd if=/dev/sdc bs=512 count=1 skip=100 2>/dev/null | hexdump
|
||
|
|
0000000 1111 1111 1111 1111 1111 1111 1111 1111
|
||
|
|
*
|
||
|
|
0000200
|
||
|
|
|
||
|
|
# We repeat the same compare and write command (zero2one input buffer).
|
||
|
|
# compare and write fails since the verify failed (compared the zero block to
|
||
|
|
# the actual 1 block in LBA 100
|
||
|
|
$ ./sg_compare_and_write --in=/tmp/caw_buf_zero2one --lba=100 --xferlen=1024 /dev/sdc
|
||
|
|
COMPARE AND WRITE: Fixed format, current; Sense key: Miscompare
|
||
|
|
Additional sense: Miscompare during verify operation
|
||
|
|
sg_compare_and_write: SCSI COMPARE AND WRITE failed
|
||
|
|
|
||
|
|
# Now we use the second buffer (one2zero)
|
||
|
|
$ ./sg_compare_and_write --in=/tmp/caw_buf_one2zero --lba=100 --xferlen=1024 /dev/sdc
|
||
|
|
|
||
|
|
# operation succeeded, contents of LBA 100 are back to zero
|
||
|
|
$ dd if=/dev/sdc bs=512 count=1 skip=100 2>/dev/null | hexdump
|
||
|
|
0000000 0000 0000 0000 0000 0000 0000 0000 0000
|
||
|
|
*
|
||
|
|
0000200
|
||
|
|
|