SG_READCAP(8) | SG3_UTILS | SG_READCAP(8) |
sg_readcap - send SCSI READ CAPACITY command
sg_readcap [--16] [--brief] [--help] [--hex] [--lba=LBA] [--long] [--pmi] [--raw] [--readonly] [--verbose] [--version] [--zbc] DEVICE
sg_readcap [-16] [-b] [-h] [-H] [-lba=LBA] [-pmi] [-r] [-R] [-v] [-V] [-z] DEVICE
The normal action of the SCSI READ CAPACITY command is to fetch the number of blocks (and block size) from the DEVICE.
The SCSI READ CAPACITY command (both 10 and 16 byte cdbs) actually yield the block address of the last block and the block size. The number of blocks is thus one plus the block address of the last block (as blocks are counted origin zero (i.e. starting at block zero)). This is the source of many "off by one" errors.
The READ CAPACITY(16) response provides additional information not found in the READ CAPACITY(10) response. This includes protection and logical block provisioning information, plus the number of logical blocks per physical block. So even though the media size may not exceed what READ CAPACITY(10) can show, it may still be useful to examine the response to READ CAPACITY(16). Sadly there are horrible SCSI command set implementations in the wild that crash when the READ CAPACITY(16) command is sent to them.
Device capacity is the product of the number of blocks by the block size. This utility outputs this figure in bytes, MiB (1048576 bytes per MiB), GB (1000000000 bytes per GB) and, if large enough, TB (1000 GB).
If sg_readcap is called without the --long option then the 10 byte cdb version (i.e. READ CAPACITY (10)) is sent to the DEVICE. If the number of blocks in the response is reported as 0xffffffff (i.e. (2**32 - 1) ) and the --hex option has not been given, then READ CAPACITY (16) is called and its response is output.
This utility supports two command line syntaxes, the preferred one is shown first in the synopsis and explained in this section. A later section on the old command line syntax outlines the second group of 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.
The response to READ CAPACITY(16) contains a LBPRZ bit in the SBC-3 standard (ANSI INCITS 514-2014). There was also a LBPRZ bit with the same meaning in the Logical block provisioning VPD page (0xb2). Then somewhat confusingly T10 expanded the LBPRZ bit to a 3 bit field in SBC-4 draft revision 7, but only in the LB provisioning VPD page. The reason for the expansion was to report a new "provisioning initialization pattern" state (when an unmapped logical block is read). The new state has been assigned LBPRZ=2 in the VPD page and it re-uses LBPRZ=0 in the READ CAPACITY(16) response. LBPRZ=1 retains the same meaning for both variants, namely that a block of zeroes will be returned when an unmapped logical block is read.
The exit status of sg_readcap is 0 when it is successful. Otherwise see the sg3_utils(8) man page.
The options in this section were the only ones available prior to sg3_utils version 1.23 . Since then this utility defaults to the newer command line options which can be overridden by using --old (or -O) as the first option. See the ENVIRONMENT VARIABLES section for another way to force the use of these older command line options.
Since sg3_utils version 1.23 the environment variable SG3_UTILS_OLD_OPTS can be given. When it is present this utility will expect the older command line options. So the presence of this environment variable is equivalent to using --old (or -O) as the first command line option.
Written by Douglas Gilbert
Copyright © 1999-2020 Douglas Gilbert
This software is distributed under the GPL version 2. There is NO warranty;
not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sg_inq(sg3_utils)
January 2020 | sg3_utils-1.45 |