| .TH SG_WRITE_SAME "8" "November 2012" "sg3_utils\-1.35" SG3_UTILS |
| .SH NAME |
| sg_write_same \- send the SCSI WRITE SAME command |
| .SH SYNOPSIS |
| .B sg_write_same |
| [\fI\-\-10\fR] [\fI\-\-16\fR] [\fI\-\-32\fR] [\fI\-\-anchor\fR] |
| [\fI\-\-grpnum=GN\fR] [\fI\-\-help\fR] [\fI\-\-in=IF\fR] |
| [\fI\-\-lba=LBA\fR] [\fI\-\-lbdata\fR] [\fI\-\-num=NUM\fR] |
| [\fI\-\-pbdata\fR] [\fI\-\-timeout=TO\fR] [\fI\-\-unmap\fR] |
| [\fI\-\-verbose\fR] [\fI\-\-version\fR] [\fI\-\-wrprotect=WPR\fR] |
| [\fI\-\-xferlen=LEN\fR] \fIDEVICE\fR |
| .SH DESCRIPTION |
| .\" Add any additional description here |
| Send the SCSI WRITE SAME (10, 16 or 32 byte) command to \fIDEVICE\fR. This |
| command writes the given block \fINUM\fR times to consecutive blocks on |
| the \fIDEVICE\fR starting at logical block address \fILBA\fR. |
| .PP |
| The length of the block to be written multiple times is obtained from either |
| the \fILEN\fR argument, or the length of the given input file \fIIF\fR, |
| or by calling READ CAPACITY(16) on \fIDEVICE\fR. The contents of the |
| block to be written are obtained from the input file \fIIF\fR or |
| zeroes are used. If READ CAPACITY(16) is called (which implies \fIIF\fR |
| was not given) and the PROT_EN bit is set then an extra 8 bytes (i.e. |
| more than the logical block size) of 0xff are sent. If READ CAPACITY(16) |
| fails then READ CAPACITY(10) is used to determine the block size. |
| .PP |
| If neither \fI\-\-10\fR, \fI\-\-16\fR nor \fI\-\-32\fR is given then |
| WRITE SAME(10) is sent unless one of the following conditions is met. |
| If \fILBA\fR (plus \fINUM\fR) exceeds 32 bits, \fINUM\fR exceeds 65535, |
| or the \fI\-\-unmap\fR option is given then WRITE SAME(16) is sent. |
| The \fI\-\-10\fR, \fI\-\-16\fR and \fI\-\-32\fR options are mutually |
| exclusive. |
| .PP |
| In SBC\-3 revision 26 the UNMAP and ANCHOR bits were added to the |
| WRITE SAME (10) command. Since the UNMAP bit has been in WRITE SAME (16) |
| and WRITE SAME (32) since SBC\-3 revision 18, the lower of the two (i.e. |
| WRITE SAME (16)) is the default when the \fI\-\-unmap\fR option is given. |
| To send WRITE SAME (10) use the \fI\-\-10\fR option. |
| .PP |
| .B Take care: |
| The WRITE SAME(10, 16 and 32) commands interpret a \fINUM\fR of zero |
| as write to the end of \fIDEVICE\fR. This utility defaults \fINUM\fR to |
| 1 . The WRITE SAME commands have no IMMED bit so if \fINUM\fR is |
| large (or zero) then an invocation of this utility could take a long |
| time, potentially as long as a FORMAT UNIT command. In such situations |
| the command timeout value \fITO\fR may need to be increased from its |
| default value of 60 seconds. In SBC\-3 revision 26 the WSNZ (write same |
| no zero) bit was added to the Block Limits VPD page [0xB0]. If set the |
| WRITE SAME commands will not accept a \fINUM\fR of zero. The same |
| SBC\-3 revision added the "Maximum Write Same Length" field to the Block |
| Limits VPD page. |
| .PP |
| The Logical Block Provisioning VPD page [0xB2] contains the LBWS and |
| LBW10 bits. If LBWS is set then WRITE SAME (16) supports the UNMAP bit. |
| If LBWS10 is set then WRITE SAME (10) supports the UNMAP bit. If either |
| LBWS or LBWS10 is set and the WRITE SAME (32) is supported then WRITE |
| SAME (32) supports the UNMAP bit. This is as of SBC\-3 revision 26. |
| .PP |
| As a precaution against an accidental 'sg_write_same /dev/sda' (for example) |
| overwriting LBA 0 on /dev/sda with zeroes, at least one of the |
| \fI\-\-in=IF\fR, \fI\-\-lba=LBA\fR or \fI\-\-num=NUM\fR options must be |
| given. Obviously this utility can destroy a lot of user data so check the |
| options carefully. |
| .SH OPTIONS |
| Arguments to long options are mandatory for short options as well. |
| .TP |
| \fB\-R\fR, \fB\-\-10\fR |
| send a SCSI WRITE SAME (10) command to \fIDEVICE\fR. The ability to |
| set the \fI\-\-unmap\fR (and \fI\-\-anchor\fR) options to this command |
| was added in SBC\-3 revision 26. |
| .TP |
| \fB\-S\fR, \fB\-\-16\fR |
| send a SCSI WRITE SAME (16) command to \fIDEVICE\fR. |
| .TP |
| \fB\-T\fR, \fB\-\-32\fR |
| send a SCSI WRITE SAME (32) command to \fIDEVICE\fR. |
| .TP |
| \fB\-a\fR, \fB\-\-anchor\fR |
| sets the ANCHOR bit in the cdb. Introduced in SBC\-3 revision 22. |
| That draft requires the \fI\-\-unmap\fR option to also be specified. |
| .TP |
| \fB\-g\fR, \fB\-\-grpnum\fR=\fIGN\fR |
| sets the 'Group number' field to \fIGN\fR. Defaults to a value of zero. |
| \fIGN\fR should be a value between 0 and 31. |
| .TP |
| \fB\-h\fR, \fB\-\-help\fR |
| output the usage message then exit. |
| .TP |
| \fB\-i\fR, \fB\-\-in\fR=\fIIF\fR |
| read data (binary) from file named \fIIF\fR and use it as the data out |
| buffer for the SCSI WRITE SAME command. The length of the data out buffer |
| is \fI\-\-xferlen=LEN\fR or, if that is not given, the length of the \fIIF\fR |
| file. If \fIIF\fR is "\-" then stdin is read. If this option is not given |
| then 0x00 bytes are used as fill with the length of the data out buffer |
| obtained from \fI\-\-xferlen=LEN\fR or by calling READ CAPACITY(16 or 10). |
| If the response to READ CAPACITY(16) has the PROT_EN bit set then data |
| out buffer size is modified accordingly with the last 8 bytes set to 0xff. |
| .TP |
| \fB\-l\fR, \fB\-\-lba\fR=\fILBA\fR |
| where \fILBA\fR is the logical block address to start the WRITE SAME command. |
| Defaults to lba 0 which is a dangerous block to overwrite on a disk that is |
| in use. Assumed to be in decimal unless prefixed with '0x' or has a |
| trailing 'h'. |
| .TP |
| \fB\-L\fR, \fB\-\-lbdata\fR |
| sets the LBDATA bit in the WRITE SAME cdb. |
| .TP |
| \fB\-n\fR, \fB\-\-num\fR=\fINUM\fR |
| where \fINUM\fR is the number of blocks, starting at \fILBA\fR, to write the |
| data out buffer to. The default value for \fINUM\fR is 1. The value corresponds |
| to the 'Number of logical blocks' field in the WRITE SAME cdb. Note that a |
| value of 0 in \fINUM\fR is interpreted as write the data out buffer on every |
| block starting at \fILBA\fR to the end of the \fIDEVICE\fR. |
| .TP |
| \fB\-P\fR, \fB\-\-pbdata\fR |
| sets the PBDATA bit in the WRITE SAME cdb. |
| .TP |
| \fB\-t\fR, \fB\-\-timeout\fR=\fITO\fR |
| where \fITO\fR is the command timeout value in seconds. The default value is |
| 60 seconds. If \fINUM\fR is large (or zero) a WRITE SAME command may require |
| considerably more time than 60 seconds to complete. |
| .TP |
| \fB\-U\fR, \fB\-\-unmap\fR |
| sets the UNMAP bit in the WRITE SAME(10, 16 and 32) cdb. See UNMAP section |
| below. |
| .TP |
| \fB\-v\fR, \fB\-\-verbose\fR |
| increase the degree of verbosity (debug messages). |
| .TP |
| \fB\-V\fR, \fB\-\-version\fR |
| output version string then exit. |
| .TP |
| \fB\-w\fR, \fB\-\-wrprotect\fR=\fIWPR\fR |
| sets the "Write protect" field in the WRITE SAME cdb to \fIWPR\fR. The |
| default value is zero. \fIWPR\fR should be a value between 0 and 7. |
| When \fIWPR\fR is 1 or greater, and the disk's protection type is 1 or |
| greater, then 8 extra bytes of protection information are expected or |
| generated (to place in the commmand's data out buffer). |
| .TP |
| \fB\-x\fR, \fB\-\-xferlen\fR=\fILEN\fR |
| where \fILEN\fR is the data out buffer length. Defaults to the length of |
| the \fIIF\fR file or, if that is not given, then the READ CAPACITY(16 or 10) |
| command is used to find the 'Logical block length in bytes'. That figure |
| may be increased by 8 bytes if the \fIDEVICE\fR's protection type is 1 or |
| greater and the WRPROTECT field (see \fI\-\-wrprotect=WPR\fR) is 1 or |
| greater. If both this option and the \fIIF\fR option are given and |
| \fILEN\fR exceeds the length of the \fIIF\fR file then \fILEN\fR is the |
| data out buffer length with zeroes used as pad bytes. |
| .SH UNMAP |
| Logical block provisioning is a new term introduced in SBC\-3 revision |
| 25 for the ability to mark blocks as unused. It is closely related to the |
| ATA DATA SET MANAGEMENT command with the "Trim" bit set. For large |
| storage arrays, it is a way to provision less physical storage than the |
| READ CAPACITY command reports is available, potentially allocating more |
| physical storage when WRITE commands require it. For flash memory it is |
| a way of potentially saving power (and perhaps access time) when it is |
| known large sections (or almost all) of the flash memory is not in use. |
| .PP |
| Support for logical block provisioning is indicated by the LBPME bit being |
| set in the READ CAPACITY(16) command response (see the sg_readcap utility). |
| That implies at least one of the UNMAP or WRITE SAME(16) commands is |
| implemented. If the UNMAP command is implemented then |
| the "Maximum unmap LBA count" and "Maximum unmap block descriptor count" |
| fields in the Block Limits VPD page should both be greater than zero. The |
| READ CAPACITY(16) command response also contains a LBPRZ bit which if set |
| means that if unmapped blocks are read then zeroes will be returned for the |
| data (and if protection information is active, 0xff bytes are returned for |
| that). In SBC\-3 revision 27 the same LBPRZ bit was added to the Logical |
| Block Provisioning VPD page. |
| .PP |
| In SBC\-3 revision 25 the LBPU and ANC_SUP bits where added to the |
| Logical Block Provisioning VPD page. When LBPU is set it indicates that |
| the device supports the UNMAP command (see the sg_unmap utility). When the |
| ANC_SUP bit is set it indicates the device supports anchored LBAs. |
| .PP |
| When the UNMAP bit is set in the cdb then the data out buffer is also sent. |
| Additionally the data section of that data out buffer should be full of 0x0 |
| bytes while the data protection block, 8 bytes at the end if present, should |
| be set to 0xff bytes. If these conditions are not met and the LBPRZ bit is |
| set then the UNMAP bit is ignored and the data out buffer is written to the |
| \fIDEVICE\fR as if the UNMAP bit was zero. In the absence of the |
| \fI\-\-in=IF\fR option, this utility will attempt build a data out buffer |
| that meets the requirements for the UNMAP bit in the cdb to be acted on by |
| the \fIDEVICE\fR. |
| .PP |
| Logical blocks may also be unmapped by the SCSI UNMAP and FORMAT UNIT |
| commands (see the sg_unmap and sg_format utilities). |
| .SH NOTES |
| Various numeric arguments (e.g. \fILBA\fR) may include multiplicative |
| suffixes or be given in hexadecimal. See the "NUMERIC ARGUMENTS" section |
| in the sg3_utils(8) man page. |
| .PP |
| In Linux at this time the sg driver does not support cdb sizes greater than |
| 16 bytes. Hence a device node like /dev/sg1 which is associated with the |
| sg driver will fail with this utility if the \fI\-\-32\fR option is |
| given (or implied by other options). The bsg driver with device nodes like |
| /dev/bsg/6:0:0:1 does support cdb sizes greater than 16 bytes. |
| .SH EXIT STATUS |
| The exit status of sg_write_same is 0 when it is successful. Otherwise see |
| the sg3_utils(8) man page. |
| .SH EXAMPLES |
| One simple usage is to write blocks of zero from (and including) a given LBA: |
| .PP |
| sg_write_same \-\-lba=0x1234 \-\-num=63 /dev/sdc |
| .PP |
| Since \fI\-\-xferlen=LEN\fR has not been given, then this utility will |
| call the READ CAPACITY command on /dev/sdc to determine the number |
| of bytes in a logical block. Let us assume that is 512 bytes. Since |
| \fI\-\-in=IF\fR is not given a block of zeroes is assumed. So 63 blocks |
| of zeroes (each block containing 512 bytes) will be written from (and |
| including) LBA 0x1234 . Note that only one block of zeroes is passed |
| to the SCSI WRITE SAME command in the data out buffer (as required by |
| SBC\-3). |
| .PP |
| A similar example follows but in this case the blocks |
| are "unmapped" ("trimmed" in ATA speak) rather than zeroed: |
| .PP |
| sg_write_same \-\-unmap \-L 0x1234 \-n 63 /dev/sdc |
| .PP |
| Note that if the LBPRZ bit in the READ CAPACITY(16) response is set (i.e. |
| LPPRZ is an acronym for logical block provisioning read zeroes) then these |
| two examples do the same thing, at least seen from the point of view of |
| subsequent reads. |
| .PP |
| This utility can also be used to write protection information (PI) on disks |
| formatted with a protection type greater than zero. PI is 8 bytes of extra |
| data appended to the user data of a logical block: the first two bytes are a |
| CRC (the "guard"), the next two bytes are the "application tag" and the last |
| four bytes are the "reference tag". With protection types 1 and 2 if the |
| application tag is 0xffff then the guard should not be checked (against the |
| user data). |
| .PP |
| In this example we assume the logical block size (of the user data) is 512 |
| bytes and the disk has been formatted with protection type 1. Since we are |
| going to modify LBA 2468 then we take a copy of it first: |
| .PP |
| dd if=/dev/sdb skip=2468 bs=512 of=2468.bin count=1 |
| .PP |
| The following command line sets the user data to zeroes and the PI to 8 |
| 0xFF bytes on LBA 2468: |
| .PP |
| sg_write_same --lba=2468 /dev/sdb |
| .PP |
| Reading back that block should be successful because the application tag |
| is 0xffff which suppresses the guard (CRC) check (which would otherwise be |
| wrong): |
| .PP |
| dd if=/dev/sdb skip=2468 bs=512 of=/dev/null count=1 |
| .PP |
| Now an attempt is made to create a binary file with zeroes in the user data, |
| 0x0000 in the application tag and 0xff bytes in the other two PI fields. It |
| is awkward to create 0xff bytes in a file (in Unix) as the "tr" command |
| below shows: |
| .PP |
| dd if=/dev/zero bs=1 count=512 of=ud.bin |
| .br |
| tr "\\000" "\\377" < /dev/zero | dd bs=1 of=ff_s.bin count=8 |
| .br |
| cat ud.bin ff_s.bin > lb.bin |
| .br |
| dd if=/dev/zero bs=1 count=2 seek=514 conv=notrunc of=lb.bin |
| .PP |
| The resulting file can be viewed with 'hexdump -C lb.bin' and should |
| contain 520 bytes. Now that file can be written to LBA 2468 as follows: |
| .PP |
| sg_write_same --lba=2468 wrprotect=3 --in=lb.bin /dev/sdb |
| .PP |
| Note the \fI\-\-wrprotect=3\fR rather than being set to 1, since we want |
| the WRITE SAME command to succeed even though the PI data now indicates |
| the user data is corrupted. When an attempt is made to read the LBA, an |
| error should occur: |
| .PP |
| dd if=/dev/sdb skip=2468 bs=512 of=/dev/null count=1 |
| .PP |
| dd errors are not very expressive, if dmesg is checked there should be |
| a line something like this: "[sdb] Add. Sense: Logical block guard check |
| failed". The block can be corrected by doing a "sg_write_same --lba=1234 |
| /dev/sdb" again or restoring the original contents of that LBA: |
| .PP |
| dd if=2468.bin bs=512 seek=2468 of=/dev/sdb conv=notrunc count=1 |
| .PP |
| Hopefully the dd command would never try to truncate the output file when |
| it is a block device. |
| .SH AUTHORS |
| Written by Douglas Gilbert. |
| .SH "REPORTING BUGS" |
| Report bugs to <dgilbert at interlog dot com>. |
| .SH COPYRIGHT |
| Copyright \(co 2009\-2012 Douglas Gilbert |
| .br |
| This software is distributed under a FreeBSD license. There is NO |
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| .SH "SEE ALSO" |
| .B sg_format,sg_get_lba_status,sg_readcap,sg_vpd,sg_unmap(sg3_utils) |