sg_compare_and_write - send the SCSI COMPARE AND WRITE command
sg_compare_and_write [--dpo] [--fua] [--fua_nv] [--grpnum=GN] [--help] --in=IF [--inw=WF] --lba=LBA [--num=NUM] [--quiet] [--timeout=TO] [--verbose] [--version] [--wrprotect=WP] [--xferlen=LEN] DEVICE
COMPARE AND WRITE(8) SG3_UTILS COMPARE AND WRITE(8)
NAME
sg_compare_and_write - send the SCSI COMPARE AND WRITE command
SYNOPSIS
sg_compare_and_write [--dpo] [--fua] [--fua_nv] [--grpnum=GN] [--help]
--in=IF [--inw=WF] --lba=LBA [--num=NUM] [--quiet] [--timeout=TO]
[--verbose] [--version] [--wrprotect=WP] [--xferlen=LEN] DEVICE
DESCRIPTION
Send the SCSI COMPARE AND WRITE command to DEVICE. This utility fetches
a compare buffer and a write buffer from either one or two files. If
the --inw=WF option is given then the compare buffer is fetched from
the file indicated by the --in=IF while the write buffer is fetched
from the file indicated by the --inw=WF. If the --inw=WF option is not
given then the concatenated compare and write buffers are fetched from
the file indicated by the --in=IF option.
Those buffers are expected to each contain NUM blocks of data. The com-
pare starts at logical block address LBA on the DEVICE and if the com-
parison fails (i.e. the provided compare buffer does not equal the data
at LBA on the DEVICE) then the COMPARE AND WRITE command finishes with
a sense key of MISCOMPARE. In this case this utility will complete and
set an exit status of 14 (which happens to be the sense key value of
MISCOMPARE).
If the comparison succeeds then the provided write buffer is stored
starting at LBA for NUM blocks on the DEVICE.
The actual number of bytes transferred in the data-out buffer of the
COMPARE AND WRITE command may need to be given by the user with the
--xferlen=LEN option. LEN defaults to (2 * NUM * 512) which is 1024 for
the default NUM of 1. If the block size is other than 512 then the user
will need to use --xferlen=LEN option. If protection information is
given (indicated by a value of WP other than 0 (the default)) then for
a NUM of 1 LEN should be 1040 . Note that the SCSI READ CAPACITY com-
mand is not performed by this utility (e.g. to find the block size).
The T10 definition of the SCSI COMPARE AND WRITE command requires that
the DEVICE implement the compare and optional write as an uninterrupted
series of actions. Depending on some other DEVICE settings a verify
operation may occur prior to the compare.
When a mismatch occurs between the compare buffer and the blocks start-
ing at LBA read from the DEVICE the sense buffer containing the MISCOM-
PARE sense key causes several messages to be sent to stderr (including
the offset of the first byte mismatch). To suppress these messages use
the --quiet option. With or without the --quiet option the exit status
will be set to 14.
This command is defined in SBC-3 whose most recent revision is 36.
SBC-3 and other SCSI documents can be found at http://www.t10.org .
OPTIONS
Arguments to long options are mandatory for short options as well. The
options are arranged in alphabetical order based on the long option
name.
-d, --dpo
Set the DPO bit in the COMPARE AND WRITE CDB
-f, --fua
Set the FUA bit in the COMPARE AND WRITE CDB
-F, --fua_nv
Set the FUA_NV bit in the COMPARE AND WRITE CDB. This bit was
removed in SBC-3 revision 35d and its position marked as
"reserved".
-g, --grpnum=GN
where GN is the value to be placed in the group number field in
the COMPARE AND WRITE CDB.
-h, --help
output the usage message then exit.
-i, --in=IF
read data (binary) from file named IF. This will either be the
combined compare and write buffers (when the --inw=WF option is
not given) or just the compare buffer (when the --inw=WF option
is given). If IF is '-' then stdin (e.g. a pipe) is read.
-C, --inc=IF
The same as the --in option.
-D, --inw=WF
read data (binary) from file named WF. This will the write buf-
fer that will become the second half of the data-out buffer sent
to the DEVICE associated with the COMPARE AND WRITE command.
Note that when this option is given then the --in=IF is expected
to hold the associated compare buffer.
-l, --lba=LBA
where LBA is the logical block address to start the COMPARE AND
WRITE command. Assumed to be in decimal unless prefixed with
'0x' or has a trailing 'h'.
-n, --num=NUM
where NUM is the number of blocks, starting at LBA, to read and
compare with the verify instance. And given a match, the NUM of
blocks to write starting LBA. The default value for NUM is 1.
-q, --quiet
suppress the sense buffer messages associated with a MISCOMPARE
sense key that would otherwise be sent to stderr. Still set the
exit status to 14 which is the sense key value indicating a MIS-
COMPARE.
-t, --timeout=TO
where TO is the command timeout value in seconds. The default
value is 60 seconds. If NUM is large (or zero) a WRITE SAME com-
mand may require considerably more time than 60 seconds to com-
plete.
-v, --verbose
increase the degree of verbosity (debug messages).
-V, --version
output version string then exit.
-w, --wrprotect=WP
set the WRPROTECT field in the cdb to WP. The default value is 0
which implies no protection information is sent (along with the
user data) by this utility.
-x, --xferlen=LEN
where LEN is the data out buffer length in byte. It defaults to
(2 * NUM * 512) bytes. If the DEVICE block size is other than
512 bytes or WP is non-zero (implying additional protection
information) then this default will be incorrect; the use must
supply the correct value for LEN
ATTRIBUTES
See attributes(7) for descriptions of the following attributes:
+---------------+--------------------------+
|ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+---------------+--------------------------+
|Availability | system/storage/sg3_utils |
+---------------+--------------------------+
|Stability | Pass-through uncommitted |
+---------------+--------------------------+
NOTES
Various numeric arguments (e.g. LBA) may include multiplicative suf-
fixes or be given in hexadecimal. See the "NUMERIC ARGUMENTS" section
in the sg3_utils(8) man page.
Source code for open source software components in Oracle Solaris can
be found at https://www.oracle.com/downloads/opensource/solaris-source-
code-downloads.html.
This software was built from source available at
https://github.com/oracle/solaris-userland. The original community
source was downloaded from http://sg.danny.cz/sg/p/sg3_utils-1.46.tgz.
Further information about this software can be found on the open source
community website at http://sg.danny.cz/sg/sg3_utils.html.
EXAMPLES
Before overwriting the first two blocks of whatever (SCSI) storage
device that is chosen, take a small backup. The logical block size is
assumed to be 512 bytes. Take a copy (in backup01.bin) of the first two
blocks::
# sg_dd if=/dev/sg1 bs=512 of=backup01.bin count=2
2+0 records in
2+0 records out
WARNING: if /dev/sg1 corresponds to a disk on your system that contains
currently mounted file systems, do _not_ continue. If you can, unmount
all file systems on that disk. If that is not possible, use another
disk with no mounted file systems on it. In Linux the scsi_debug driver
is a good candidate for experimentation.
Now fill the first block with 0xff bytes:
# sg_dd iflag=ff bs=512 of=/dev/sg1 count=1
1+0 records in
1+0 records out
and the second block with 0x0 bytes:
# sg_dd iflag=00 bs=512 seek=1 of=/dev/sg1 count=1
1+0 records in
1+0 records out
Now copy those two blocks into a file:
# sg_dd if=/dev/sg1 bs=512 of=ff00.bin count=2
2+0 records in
2+0 records out
Now we can do a compare and write command. It is told to compare the
first block (i.e. LBA 0) with the first block in the given file (i.e.
ff00.bin). If they are equal (they should be both full of 0xff bytes).
Since the compare succeeds, it will write the second block in ff00.bin
over LBA 0:
# sg_compare_and_write --in=ff00.bin --lba=0 --num=1 /dev/sg1
No news is good news. Now if we do that command again:
# sg_compare_and_write --in=ff00.bin --lba=0 --num=1 /dev/sg1
Miscompare at byte offset: 0 [0x0]
sg_compare_and_write failed: Miscompare
This is expected. The first sg_compare_and_write ended up writing 0x0
bytes over LBA 0x0. The second sg_compare_and_write command compares
LBA 0x0 with 0xff bytes and fails immediately (i.e. at byte offset: 0).
Now we will overwrite the first 3 bytes of ff00.bin with 0x0:
# sg_dd bs=1 iflag=00 of=ff00.bin count=3
3+0 records in
3+0 records out
Notice the 'bs=1' operand. The dd utility (and thus sg_dd) is very use-
ful for doing small binary edits on a file. Now if we do that sg_com-
pare_and_write again, it still fails but with a small difference:
# sg_compare_and_write --in=ff00.bin --lba=0 --num=1 /dev/sg1
Miscompare at byte offset: 3 [0x3]
sg_compare_and_write failed: Miscompare
So the bytes at offset 0, 1, and 2 compared equal but not the byte at
offset 3. The SCSI COMPARE AND WRITE will stop on the first micompared
byte.
EXIT STATUS
The exit status of sg_compare_and_write is 0 when it is successful. If
the compare step fails then the exit status is 14. For other exit sta-
tus values see the EXIT STATUS section in the sg3_utils(8) man page.
Earlier versions of this utility set an exit status of 98 when there
was a MISCOMPARE.
AUTHORS
Written by Shahar Salzman. Maintained by Douglas Gilbert. Additions by
Eric Seppanen.
REPORTING BUGS
Report bugs to shahar.salzman@kaminario.com or dgilbert@interlog.com
COPYRIGHT
Copyright (C) 2012-2020 Kaminario Technologies LTD
Redistribution and use in source and binary forms, with or without mod-
ification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the <organization> nor the names of its contribu-
tors may be used to endorse or promote products derived from this soft-
ware without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTIC-
ULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Kaminario Technologies
LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSI-
NESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
SEE ALSO
sg_xcopy, sg_receive_copy_results(sg3_utils)
sg3_utils-1.46 November 2020 COMPARE AND WRITE(8)