Commit 78e0c621deca08e5f802383dbe75fd20b258ea4e

Authored by Boaz Harrosh
Committed by James Bottomley
1 parent 98f3aea2bd

[SCSI] osd: Documentation for OSD library

Add osd.txt to Documentation/scsi/

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Reviewed-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>

Showing 1 changed file with 198 additions and 0 deletions Side-by-side Diff

Documentation/scsi/osd.txt
  1 +The OSD Standard
  2 +================
  3 +OSD (Object-Based Storage Device) is a T10 SCSI command set that is designed
  4 +to provide efficient operation of input/output logical units that manage the
  5 +allocation, placement, and accessing of variable-size data-storage containers,
  6 +called objects. Objects are intended to contain operating system and application
  7 +constructs. Each object has associated attributes attached to it, which are
  8 +integral part of the object and provide metadata about the object. The standard
  9 +defines some common obligatory attributes, but user attributes can be added as
  10 +needed.
  11 +
  12 +See: http://www.t10.org/ftp/t10/drafts/osd2/ for the latest draft for OSD 2
  13 +or search the web for "OSD SCSI"
  14 +
  15 +OSD in the Linux Kernel
  16 +=======================
  17 +osd-initiator:
  18 + The main component of OSD in Kernel is the osd-initiator library. Its main
  19 +user is intended to be the pNFS-over-objects layout driver, which uses objects
  20 +as its back-end data storage. Other clients are the other osd parts listed below.
  21 +
  22 +osd-uld:
  23 + This is a SCSI ULD that registers for OSD type devices and provides a testing
  24 +platform, both for the in-kernel initiator as well as connected targets. It
  25 +currently has no useful user-mode API, though it could have if need be.
  26 +
  27 +exofs:
  28 + Is an OSD based Linux file system. It uses the osd-initiator and osd-uld,
  29 +to export a usable file system for users.
  30 +See Documentation/filesystems/exofs.txt for more details
  31 +
  32 +osd target:
  33 + There are no current plans for an OSD target implementation in kernel. For all
  34 +needs, a user-mode target that is based on the scsi tgt target framework is
  35 +available from Ohio Supercomputer Center (OSC) at:
  36 +http://www.open-osd.org/bin/view/Main/OscOsdProject
  37 +There are several other target implementations. See http://open-osd.org for more
  38 +links.
  39 +
  40 +Files and Folders
  41 +=================
  42 +This is the complete list of files included in this work:
  43 +include/scsi/
  44 + osd_initiator.h Main API for the initiator library
  45 + osd_types.h Common OSD types
  46 + osd_sec.h Security Manager API
  47 + osd_protocol.h Wire definitions of the OSD standard protocol
  48 + osd_attributes.h Wire definitions of OSD attributes
  49 +
  50 +drivers/scsi/osd/
  51 + osd_initiator.c OSD-Initiator library implementation
  52 + osd_uld.c The OSD scsi ULD
  53 + osd_ktest.{h,c} In-kernel test suite (called by osd_uld)
  54 + osd_debug.h Some printk macros
  55 + Makefile For both in-tree and out-of-tree compilation
  56 + Kconfig Enables inclusion of the different pieces
  57 + osd_test.c User-mode application to call the kernel tests
  58 +
  59 +The OSD-Initiator Library
  60 +=========================
  61 +osd_initiator is a low level implementation of an osd initiator encoder.
  62 +But even though, it should be intuitive and easy to use. Perhaps over time an
  63 +higher lever will form that automates some of the more common recipes.
  64 +
  65 +init/fini:
  66 +- osd_dev_init() associates a scsi_device with an osd_dev structure
  67 + and initializes some global pools. This should be done once per scsi_device
  68 + (OSD LUN). The osd_dev structure is needed for calling osd_start_request().
  69 +
  70 +- osd_dev_fini() cleans up before a osd_dev/scsi_device destruction.
  71 +
  72 +OSD commands encoding, execution, and decoding of results:
  73 +
  74 +struct osd_request's is used to iteratively encode an OSD command and carry
  75 +its state throughout execution. Each request goes through these stages:
  76 +
  77 +a. osd_start_request() allocates the request.
  78 +
  79 +b. Any of the osd_req_* methods is used to encode a request of the specified
  80 + type.
  81 +
  82 +c. osd_req_add_{get,set}_attr_* may be called to add get/set attributes to the
  83 + CDB. "List" or "Page" mode can be used exclusively. The attribute-list API
  84 + can be called multiple times on the same request. However, only one
  85 + attribute-page can be read, as mandated by the OSD standard.
  86 +
  87 +d. osd_finalize_request() computes offsets into the data-in and data-out buffers
  88 + and signs the request using the provided capability key and integrity-
  89 + check parameters.
  90 +
  91 +e. osd_execute_request() may be called to execute the request via the block
  92 + layer and wait for its completion. The request can be executed
  93 + asynchronously by calling the block layer API directly.
  94 +
  95 +f. After execution, osd_req_decode_sense() can be called to decode the request's
  96 + sense information.
  97 +
  98 +g. osd_req_decode_get_attr() may be called to retrieve osd_add_get_attr_list()
  99 + values.
  100 +
  101 +h. osd_end_request() must be called to deallocate the request and any resource
  102 + associated with it. Note that osd_end_request cleans up the request at any
  103 + stage and it must always be called after a successful osd_start_request().
  104 +
  105 +osd_request's structure:
  106 +
  107 +The OSD standard defines a complex structure of IO segments pointed to by
  108 +members in the CDB. Up to 3 segments can be deployed in the IN-Buffer and up to
  109 +4 in the OUT-Buffer. The ASCII illustration below depicts a secure-read with
  110 +associated get+set of attributes-lists. Other combinations very on the same
  111 +basic theme. From no-segments-used up to all-segments-used.
  112 +
  113 +|________OSD-CDB__________|
  114 +| |
  115 +|read_len (offset=0) -|---------\
  116 +| | |
  117 +|get_attrs_list_length | |
  118 +|get_attrs_list_offset -|----\ |
  119 +| | | |
  120 +|retrieved_attrs_alloc_len| | |
  121 +|retrieved_attrs_offset -|----|----|-\
  122 +| | | | |
  123 +|set_attrs_list_length | | | |
  124 +|set_attrs_list_offset -|-\ | | |
  125 +| | | | | |
  126 +|in_data_integ_offset -|-|--|----|-|-\
  127 +|out_data_integ_offset -|-|--|--\ | | |
  128 +\_________________________/ | | | | | |
  129 + | | | | | |
  130 +|_______OUT-BUFFER________| | | | | | |
  131 +| Set attr list |</ | | | | |
  132 +| | | | | | |
  133 +|-------------------------| | | | | |
  134 +| Get attr descriptors |<---/ | | | |
  135 +| | | | | |
  136 +|-------------------------| | | | |
  137 +| Out-data integrity |<------/ | | |
  138 +| | | | |
  139 +\_________________________/ | | |
  140 + | | |
  141 +|________IN-BUFFER________| | | |
  142 +| In-Data read |<--------/ | |
  143 +| | | |
  144 +|-------------------------| | |
  145 +| Get attr list |<----------/ |
  146 +| | |
  147 +|-------------------------| |
  148 +| In-data integrity |<------------/
  149 +| |
  150 +\_________________________/
  151 +
  152 +A block device request can carry bidirectional payload by means of associating
  153 +a bidi_read request with a main write-request. Each in/out request is described
  154 +by a chain of BIOs associated with each request.
  155 +The CDB is of a SCSI VARLEN CDB format, as described by OSD standard.
  156 +The OSD standard also mandates alignment restrictions at start of each segment.
  157 +
  158 +In the code, in struct osd_request, there are two _osd_io_info structures to
  159 +describe the IN/OUT buffers above, two BIOs for the data payload and up to five
  160 +_osd_req_data_segment structures to hold the different segments allocation and
  161 +information.
  162 +
  163 +Important: We have chosen to disregard the assumption that a BIO-chain (and
  164 +the resulting sg-list) describes a linear memory buffer. Meaning only first and
  165 +last scatter chain can be incomplete and all the middle chains are of PAGE_SIZE.
  166 +For us, a scatter-gather-list, as its name implies and as used by the Networking
  167 +layer, is to describe a vector of buffers that will be transferred to/from the
  168 +wire. It works very well with current iSCSI transport. iSCSI is currently the
  169 +only deployed OSD transport. In the future we anticipate SAS and FC attached OSD
  170 +devices as well.
  171 +
  172 +The OSD Testing ULD
  173 +===================
  174 +TODO: More user-mode control on tests.
  175 +
  176 +Authors, Mailing list
  177 +=====================
  178 +Please communicate with us on any deployment of osd, whether using this code
  179 +or not.
  180 +
  181 +Any problems, questions, bug reports, lonely OSD nights, please email:
  182 + OSD Dev List <osd-dev@open-osd.org>
  183 +
  184 +More up-to-date information can be found on:
  185 +http://open-osd.org
  186 +
  187 +Boaz Harrosh <bharrosh@panasas.com>
  188 +Benny Halevy <bhalevy@panasas.com>
  189 +
  190 +References
  191 +==========
  192 +Weber, R., "SCSI Object-Based Storage Device Commands",
  193 +T10/1355-D ANSI/INCITS 400-2004,
  194 +http://www.t10.org/ftp/t10/drafts/osd/osd-r10.pdf
  195 +
  196 +Weber, R., "SCSI Object-Based Storage Device Commands -2 (OSD-2)"
  197 +T10/1729-D, Working Draft, rev. 3
  198 +http://www.t10.org/ftp/t10/drafts/osd2/osd2r03.pdf