| # 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 |
| |