Provided by: ddpt_0.97-1_amd64 bug

NAME

       ddptctl - helper/auxiliary utility for ddpt

SYNOPSIS

       ddptctl  [--abort]  [--all_toks]  [--block]  [--del_tkn]  [--flexible]  [--help] [--immed]
       [--info]  [--list_id=LID]  [--oir=OIR]  [--poll]  [--pt=GL]  [--readonly]   [--prefer_rcs]
       [--receive]   [--rtf=RTF]   [--rtype=RTYPE]   [--size]  [--timeout=ITO[,CMD]]  [--verbose]
       [--version] [--wut=SL] [DEVICE]

DESCRIPTION

       This utility is a helper/auxiliary for the ddpt  utility  which  copies  data  between  or
       within  SCSI devices (logical units). While ddpt's command line syntax is modelled on that
       of the POSIX dd command, this utility has a more standard Unix command  line  syntax  with
       both short and long variants of each option.

       The  T10  committee defines a family of SCSI commands for offloaded copy. The central (but
       not the only) command is EXTENDED COPY often shortened to XCOPY or xcopy.  There  are  now
       two  generations  of  xcopy,  the  older one is given the suffix "LID1" and the newer one:
       "LID4". There is a subset of XCOPY(LID4) that supports disk to disk copies and is based on
       the  SBC-3 commands: POPULATE TOKEN (PT) and WRITE USING TOKEN (WUT). ODX is a market name
       that has become associated with this subset. This utility can issue PT,  WUT  and  related
       commands, read the Third Party Copy VPD page and perform several other housekeeping tasks.

       The  xcopy  family of commands are described in the SPC-4,5 and SBC-3,4 documents found at
       https://www.t10.org .

       Apart from PT and WUT, other command abbreviations used below are RRTI for the RECEIVE ROD
       TOKEN INFORMATION command and RCS for the RECEIVE COPY STATUS(LID4) command.

OPTIONS

       Arguments to long options are mandatory for short options as well.

       -A, --abort
              this  option  will issue the COPY OPERATION ABORT command with the LID given in the
              --list_id=LID option. If the --list_id=LID option is not given then its default LID
              (257)  is  used.  If  there  is  an xcopy operation ongoing on this I-T nexus (i.e.
              issued by this machine to any LU sharing the same target) using that LID  then  the
              copy  is  aborted. Note there is a sense key (COPY ABORTED) indicating some but not
              all data has been copied due to this action.

       -a, --all_toks
              send the REPORT ALL ROD TOKENS SCSI command to DEVICE and decode the  response.  An
              ODX implementation is not required to support this command.

       -B, --block
              treat DEVICE as a block device when checking its --size. The default action of this
              utility is to treat DEVICE as a SCSI pass-through device.

       -D, --del_tkn
              set the DEL_TKN bit in a WUT command (default: clear the DEL_TKN  bit).   Since  an
              ODX  copy  manager  deletes  the ROD Token when its inactivity time-out is reached,
              this option is typically not needed. It may be useful  for  long-lived  ROD  Tokens
              that are no longer needed.
              To  delete  an  unused  ROD  Token a degenerate scatter list seems to be acceptable
              (e.g. '--wut=0,0 --del_tkn').

       -f, --flexible
              this option currently only effects the parsing  of  sgl_s  in  files  that  are  in
              hexadecimal  plus  they have a leading line with 'HEX' in them. Without this option
              any such line must be invoked with 'H@' before the filename; in other words the 'H'
              in  the  invocation needs to match the HEX in the file. With this option a sgl in a
              file can be invoked with '@' and if a line with HEX is parsed  before  any  LBA,NUM
              pairs  then  it  switches  to hexadecimal mode; so all the parsed LBA,NUM pairs are
              assumed to be in hexadecimal.

       -h, --help
              outputs the usage message summarizing command line options then exits.

       -I, --immed
              set the IMMED bit in the PT or WUT command. When given  the  PT  and  WUT  commands
              return  promptly before the data transfer is complete; then this utility exits. The
              user should then invoke the utility again with the --poll option and the  same  LID
              and  DEVICE  to  await completion and receive the final transfer count. The default
              action of PT and WUT (i.e.  without this option) is to wait  for  completion  (i.e.
              all data transferred or an error occurs) before exiting this utility.

       -i, --info
              when  the  DEVICE  argument  is  given then check its Third Party Copy VPD page and
              print out anything found. Also check if the 3PC bit is set in the standard  INQUIRY
              response.
              If  the  DEVICE argument is not given and the --rtf=RTF option is given then decode
              part of the ROD Token held in the --RTF file.  SPC-4 defines some parts  of  a  ROD
              Token  that  can  be  decoded  but  does  not require the copy manager to set these
              fields; so many fields may appear as zeros. A --RTF file that has been generated by
              the  ddpt utility may contain multiple ROD Tokens, each optionally followed by an 8
              byte "number of bytes represented" integer. They are all decoded,  based  on  --RTF
              file length which should either be a multiple of 512 or 520 bytes.

       -l, --list_id=LID
              LID  is  a  list identifier which is used to associate an originating xcopy command
              (e.g. PT or WUT) with a follow-up command that retrieves associated information  or
              aborts  the  operation.  T10  requires  each active LID to be unique on a given I-T
              nexus. An I-T nexus is the current machine (more precisely a HBA if a  machine  has
              two  or  more)  and  a specific target which will contain one or more logical units
              (LUs) of which DEVICE is one. If  the  DEVICE's  copy  manager  feels  that  rather
              complex  condition has not been met then an error is generated with sense data that
              decodes to "operation in progress". Rather than try to work out who is  doing  what
              elsewhere, try another LID value.
              The default value for LID is 257.

       -O, --oir=OIR
              OIR  is  the  Offset In ROD, a field in the WUT command. It may be be used together
              with the --wut=SL option. Its default value is 0 and  its  units  are  the  logical
              block size of DEVICE.

       -p, --poll
              send  RRTI  (or  RCS)  command  to  the  DEVICE  using  the  LID  (i.e.   from  the
              --list_id=LID option). If a copy status is received  indicating  the  operation  is
              ongoing,  then this SCSI command is sent periodically (as suggested by the previous
              RRTI (or RCS) command or every 500 milliseconds) until some other  copy  status  is
              detected. If the --list_id=LID option is not given then a LID of 257 is assumed.
              If  the originating xcopy command was POPULATE TOKEN and the RRTI command indicates
              that it has completed successfully then the associated ROD Token (returned  in  the
              RRTI  response)  is  written  to the RTF file. If the --rtf=RTF option is not given
              then the ROD token is written to a file called ddptctl_rod_tok.bin in  the  current
              directory.

       -q, --prefer_rcs
              prefers  using the RECEIVE COPY STATUS (RCS) command over the RRTI command which is
              the default. This only should be done following a WUT  command  since  after  a  PT
              command, the RRTI command is needed to fetch the ROD tokane.

       -P, --pt=GL
              send  a POPULATE TOKEN (PT) command with the given gather list. The format of GL is
              given in the NOTES section. If used without the --immed option then  this  utility,
              after  the  PT  command finishes successfully, will call the RRTI command. When the
              RRTI command finishes, potentially with a new ROD Token, this  utility  will  exit.
              Prior  to  that  exit,  if a new ROD Token is available and the --rtf=RTF option is
              given then that ROD Token is written to the RTF file. If the  --rtf=RTF  option  is
              not given then the ROD token is written to a file called ddptctl_rod_tok.bin in the
              current directory.
              If the --immed option is  given  this  utility  will  exit  after  the  PT  command
              finishes.  To  complete the operation this utility should be invoked again with the
              --poll option and the same DEVICE.

       -y, --readonly
              open the DEVICE read-only (e.g. in Unix with the O_RDONLY flag).  The default is to
              open it read-write.

       -R, --receive
              send  the  RRTI  (or  RCS)  SCSI command to the DEVICE using the LID (i.e. from the
              --list_id=LID option). If the --list_id=LID option is not given then a LID  of  257
              is assumed.
              If  the originating xcopy command was POPULATE TOKEN and the RRTI command indicates
              that it has completed successfully then the associated ROD Token (returned  in  the
              RRTI  response)  is  written  to the RTF file. If the --rtf=RTF option is not given
              then the ROD token is written to a file called ddptctl_rod_tok.bin in  the  current
              directory.

       -r, --rtf=RTF
              when  RTF is a file containing an ODX ROD Token or the name of a file the ROD Token
              is to be written to. A ROD Token used by ODX is 512 bytes long. If the RTF file was
              produced  by  the  ddpt  utility  then  it  might contain multiple ROD Tokens, each
              optionally  followed  by  an  8  byte  integer  containing  the  "number  of  bytes
              represented" by the preceding ROD Token.
              If an RTF file with multiple ROD Tokens is given to this utility with --wut=SL then
              only the first ROD Token is used. If an RTF file is being decoded (i.e.  no  DEVICE
              argument given) then all ROD Tokens are decoded.

       -t, --rtype=RTYPE
              where  RTYPE  is  the  ROD Type, a field in the PT command (apart from "zero"). The
              default value (0) indicates that the copy manager (in the  DEVICE)  decides.  RTYPE
              can  be  a  decimal number, a hex number (prefixed by 0x or with a "h" appended) or
              one of "pit-def", "pit-vuln", "pit-pers",  "pit-cow",  "pit-any"  or  "zero".   The
              final  truncated word can be spelt out (e.g. "pit-vulnerable").  The "pit-" lead-in
              stands for "point in time" copy.
              The "zero" is a special case and is not given to a PT command. Instead it causes  a
              special  Block  Device  Zero Token to be created that can be used with the --wut=SL
              option to write blocks of zeros to the given DEVICE.

       -s, --size
              prints the number of blocks and the size  of  each  block  for  the  given  DEVICE.
              Protection  information  is  printed if available. By default uses the pass-through
              interface and the READ CAPACITY command to obtain this information. If the  --block
              option  is  given then the block layer in the OS is query for size information (and
              protection information is not reported).

       -T, --timeout=ITO[,CMD]
              where ITO is the inactivity timeout (units: seconds) given to the PT  command.  The
              default  is 0 in which case the copy manager uses its own default which is shown in
              the Third party Copy VPD page.
              CMD is the SCSI command timeout (units: seconds) applied to SCSI commands issued by
              this utility; default is 0 which is translated to 600 seconds for originating xcopy
              commands (e.g. PT and WUT) and 60 seconds for other commands. Best not  to  trigger
              command timeouts.

       -v, --verbose
              increase the level of verbosity, (i.e. debug output).

       -V, --version
              print the version string and then exit.

       -w, --wut=SL
              send  a  WRITE USING TOKEN (WUT) command with the given scatter list. The format of
              SL is given in the NOTES section. This option  requires  the  --rtf=RTF  option  to
              supply the ROD Token. If used without the --immed option then after the WUT command
              finishes successfully this utility will  call  the  RRTI  command.  When  the  RRTI
              command finishes this utility will exit.
              If  the  --immed  option  is  given  this  utility  will exit after the WUT command
              finishes. To complete the operation this utility should be invoked again  with  the
              --poll option and the same DEVICE.

NOTES

       The  scatter  gather  list  given to the --pt=GL and --wut=SL options in the simplest case
       contains a pair a numbers, separated by a comma. The first number is the starting LBA  and
       the  second  number  is  the number of blocks (no bigger than 32 bits) to read to or write
       from that starting LBA. Another pair of numbers can appear after that forming  the  second
       element  of a scatter gather list. Starting LBAs can be in any order but T10 prohibits any
       logical block appearing more than once in a scatter gather list.

       Scatter gather lists can be placed in a file or read from stdin. A file name referring  to
       a   file   containing   a  scatter  gather  list  must  follow  the  "@"  character  (e.g.
       --pt=@my_sgl.txt"). Reading a list from stdin is indicated by "@-" or "-" (e.g. "--pt=-").
       Scatter  gather  lists in a file have a looser format and can take spaces and tabs as well
       as a comma as separators. Anything from and including a "#" on a line is ignored.

       Both the PT and WUT commands are issued "as is" without checking the Third Party Copy  VPD
       page.  The copy manager may well reject these commands (with exit status 51: invalid field
       in parameter list) if the maximum range descriptors field or the  maximum  token  transfer
       size field are exceeded.

       There    is   a   web   page   discussing   ddptctl   and   ddpt,   XCOPY   and   ODX   at
       https://sg.danny.cz/sg/ddpt_xcopy_odx.html

EXIT STATUS

       The exit status of ddptctl is 0 when it is successful. Otherwise the exit status for  this
       utility is the same as that for ddpt. See the EXIT STATUS section in the ddpt man page.

EXAMPLES

       First  issue  a  PT  command  without the --immed option so RRTI is called to complete the
       operation:

         # ddptctl --pt=0x0,10k,20k,5k --rtf=aa.rt /dev/sdb
         PT completes with a transfer count of 15360 [0x3c00]

       The transfer count (10k + 5k == 15360) indicates the operation was successful and the  ROD
       Token  is  in  the  aa.rt  file.  Now use that ROD Token to write to the same locations on
       /dev/sdc:

         # ddptctl --rtf=aa.rt --wut=0x0,10k,20k,5k /dev/sdc
         WUT completes with a transfer count of 15360 [0x3c00]

       So the copy was successful. Now taking a closer look at the ROD token:

         # ddptctl --info --rtf=aa.rt
         Decoding information from ROD Token:
           ROD type: point in time copy - default [0x800000]
           Copy manager ROD Token identifier: 0x520000710000000c
           Creator Logical Unit descriptor:
             Peripheral Device type: 0x0
             Relative initiator port identifier: 0x0
             designator_type: NAA,  code_set: Binary
             associated with the addressed logical unit
               0x60002ac0000000000000000c00009502
           Number of bytes represented: 0 [0x0]
           Device type specific data (for disk) has block size of 0; unlikely so skip
           Target device descriptor: unexpected designator type [0x0]

       T10 does not require implementations to supply much of the above (only the  ROD  type  and
       the token length) so expect to see some empty fields.

       To see information about /dev/sdb relevant to ODX, try:

         # ddptctl --info /dev/sdb
           /dev/sdb [readcap]: num_blks=209715200 [0xc800000], blk_size=512, 107 GB
         3PC (third party copy) bit set in standard INQUIRY response
          Third Party Copy VPD page:
          Block Device ROD Token Limits:
           Maximum Range Descriptors: 8
           Maximum Inactivity Timeout: 60 seconds
           Default Inactivity Timeout: 30 seconds
           Maximum Token Transfer Size: 524288
           Optimal Transfer Count: 524288

       That  maximum  token  transfer  size  [524288  blocks  each 512 bytes gives 256 MB] is the
       largest size a ROD Token created by /dev/sdb can hold.  Use  that  and  show  the  --immed
       option on the destination:

         # ddptctl --pt=0x0,0x80000 --rtf=aa.rt /dev/sdb
         PT completes with a transfer count of 524288 [0x80000]

         # ddptctl --rtf=aa.rt --wut=0x0,0x80000 --immed /dev/sdc
         Started ODX Write Using Token command in immediate mode.
         User may need --list_id=257 on following invocation with --receive or
         --poll for completion

         # ddptctl --poll --rtf=aa.rt /dev/sdc
         RRTI for Write using token: Operation completed without errors
           transfer count of 524288 [0x80000]

       To  copy  larger  amounts  and/or  with a larger number of scatter gather elements (than 8
       "range descriptors") use one of the four ODX variants in the ddpt utility.

AUTHORS

       Written by Douglas Gilbert.

REPORTING BUGS

       Report bugs to <dgilbert at interlog dot com>.

COPYRIGHT

       Copyright © 2014-2021 Douglas Gilbert
       This software is distributed under a FreeBSD license. There is NO warranty; not  even  for
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

SEE ALSO

       ddpt(8), ddpt_sgl(8)