123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- The OSD Standard
- ================
- OSD (Object-Based Storage Device) is a T10 SCSI command set that is designed
- to provide efficient operation of input/output logical units that manage the
- allocation, placement, and accessing of variable-size data-storage containers,
- called objects. Objects are intended to contain operating system and application
- constructs. Each object has associated attributes attached to it, which are
- integral part of the object and provide metadata about the object. The standard
- defines some common obligatory attributes, but user attributes can be added as
- needed.
- See: http://www.t10.org/ftp/t10/drafts/osd2/ for the latest draft for OSD 2
- or search the web for "OSD SCSI"
- OSD in the Linux Kernel
- =======================
- osd-initiator:
- The main component of OSD in Kernel is the osd-initiator library. Its main
- user is intended to be the pNFS-over-objects layout driver, which uses objects
- as its back-end data storage. Other clients are the other osd parts listed below.
- osd-uld:
- This is a SCSI ULD that registers for OSD type devices and provides a testing
- platform, both for the in-kernel initiator as well as connected targets. It
- currently has no useful user-mode API, though it could have if need be.
- exofs:
- Is an OSD based Linux file system. It uses the osd-initiator and osd-uld,
- to export a usable file system for users.
- See Documentation/filesystems/exofs.txt for more details
- osd target:
- There are no current plans for an OSD target implementation in kernel. For all
- needs, a user-mode target that is based on the scsi tgt target framework is
- available from Ohio Supercomputer Center (OSC) at:
- http://www.open-osd.org/bin/view/Main/OscOsdProject
- There are several other target implementations. See http://open-osd.org for more
- links.
- Files and Folders
- =================
- This is the complete list of files included in this work:
- include/scsi/
- osd_initiator.h Main API for the initiator library
- osd_types.h Common OSD types
- osd_sec.h Security Manager API
- osd_protocol.h Wire definitions of the OSD standard protocol
- osd_attributes.h Wire definitions of OSD attributes
- drivers/scsi/osd/
- osd_initiator.c OSD-Initiator library implementation
- osd_uld.c The OSD scsi ULD
- osd_ktest.{h,c} In-kernel test suite (called by osd_uld)
- osd_debug.h Some printk macros
- Makefile For both in-tree and out-of-tree compilation
- Kconfig Enables inclusion of the different pieces
- osd_test.c User-mode application to call the kernel tests
- The OSD-Initiator Library
- =========================
- osd_initiator is a low level implementation of an osd initiator encoder.
- But even though, it should be intuitive and easy to use. Perhaps over time an
- higher lever will form that automates some of the more common recipes.
- init/fini:
- - osd_dev_init() associates a scsi_device with an osd_dev structure
- and initializes some global pools. This should be done once per scsi_device
- (OSD LUN). The osd_dev structure is needed for calling osd_start_request().
- - osd_dev_fini() cleans up before a osd_dev/scsi_device destruction.
- OSD commands encoding, execution, and decoding of results:
- struct osd_request's is used to iteratively encode an OSD command and carry
- its state throughout execution. Each request goes through these stages:
- a. osd_start_request() allocates the request.
- b. Any of the osd_req_* methods is used to encode a request of the specified
- type.
- c. osd_req_add_{get,set}_attr_* may be called to add get/set attributes to the
- CDB. "List" or "Page" mode can be used exclusively. The attribute-list API
- can be called multiple times on the same request. However, only one
- attribute-page can be read, as mandated by the OSD standard.
- d. osd_finalize_request() computes offsets into the data-in and data-out buffers
- and signs the request using the provided capability key and integrity-
- check parameters.
- e. osd_execute_request() may be called to execute the request via the block
- layer and wait for its completion. The request can be executed
- asynchronously by calling the block layer API directly.
- f. After execution, osd_req_decode_sense() can be called to decode the request's
- sense information.
- g. osd_req_decode_get_attr() may be called to retrieve osd_add_get_attr_list()
- values.
- h. osd_end_request() must be called to deallocate the request and any resource
- associated with it. Note that osd_end_request cleans up the request at any
- stage and it must always be called after a successful osd_start_request().
- osd_request's structure:
- The OSD standard defines a complex structure of IO segments pointed to by
- members in the CDB. Up to 3 segments can be deployed in the IN-Buffer and up to
- 4 in the OUT-Buffer. The ASCII illustration below depicts a secure-read with
- associated get+set of attributes-lists. Other combinations very on the same
- basic theme. From no-segments-used up to all-segments-used.
- |________OSD-CDB__________|
- | |
- |read_len (offset=0) -|---------\
- | | |
- |get_attrs_list_length | |
- |get_attrs_list_offset -|----\ |
- | | | |
- |retrieved_attrs_alloc_len| | |
- |retrieved_attrs_offset -|----|----|-\
- | | | | |
- |set_attrs_list_length | | | |
- |set_attrs_list_offset -|-\ | | |
- | | | | | |
- |in_data_integ_offset -|-|--|----|-|-\
- |out_data_integ_offset -|-|--|--\ | | |
- \_________________________/ | | | | | |
- | | | | | |
- |_______OUT-BUFFER________| | | | | | |
- | Set attr list |</ | | | | |
- | | | | | | |
- |-------------------------| | | | | |
- | Get attr descriptors |<---/ | | | |
- | | | | | |
- |-------------------------| | | | |
- | Out-data integrity |<------/ | | |
- | | | | |
- \_________________________/ | | |
- | | |
- |________IN-BUFFER________| | | |
- | In-Data read |<--------/ | |
- | | | |
- |-------------------------| | |
- | Get attr list |<----------/ |
- | | |
- |-------------------------| |
- | In-data integrity |<------------/
- | |
- \_________________________/
- A block device request can carry bidirectional payload by means of associating
- a bidi_read request with a main write-request. Each in/out request is described
- by a chain of BIOs associated with each request.
- The CDB is of a SCSI VARLEN CDB format, as described by OSD standard.
- The OSD standard also mandates alignment restrictions at start of each segment.
- In the code, in struct osd_request, there are two _osd_io_info structures to
- describe the IN/OUT buffers above, two BIOs for the data payload and up to five
- _osd_req_data_segment structures to hold the different segments allocation and
- information.
- Important: We have chosen to disregard the assumption that a BIO-chain (and
- the resulting sg-list) describes a linear memory buffer. Meaning only first and
- last scatter chain can be incomplete and all the middle chains are of PAGE_SIZE.
- For us, a scatter-gather-list, as its name implies and as used by the Networking
- layer, is to describe a vector of buffers that will be transferred to/from the
- wire. It works very well with current iSCSI transport. iSCSI is currently the
- only deployed OSD transport. In the future we anticipate SAS and FC attached OSD
- devices as well.
- The OSD Testing ULD
- ===================
- TODO: More user-mode control on tests.
- Authors, Mailing list
- =====================
- Please communicate with us on any deployment of osd, whether using this code
- or not.
- Any problems, questions, bug reports, lonely OSD nights, please email:
- OSD Dev List <[email protected]>
- More up-to-date information can be found on:
- http://open-osd.org
- Boaz Harrosh <[email protected]>
- References
- ==========
- Weber, R., "SCSI Object-Based Storage Device Commands",
- T10/1355-D ANSI/INCITS 400-2004,
- http://www.t10.org/ftp/t10/drafts/osd/osd-r10.pdf
- Weber, R., "SCSI Object-Based Storage Device Commands -2 (OSD-2)"
- T10/1729-D, Working Draft, rev. 3
- http://www.t10.org/ftp/t10/drafts/osd2/osd2r03.pdf
|