20 Oct, 2014

1 commit


03 Oct, 2012

1 commit


24 Jun, 2011

1 commit


31 Mar, 2011

1 commit


26 Oct, 2010

2 commits

  • This is a trivial addition to the SG API that can receive kernel
    pointers. It is only used by the out-of-tree test module. So
    it's immediate need is questionable. For maintenance ease it might
    just get in, as it's very small.

    John.
    do you need this in the Kernel, or is it only for osd_ktest.ko?

    Signed-off-by: John A. Chandy
    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • This patch adds the Scatter-Gather (sg) API to libosd.
    Scatter-gather enables a write/read of multiple none-contiguous
    areas of an object, in a single call. The extents may overlap
    and/or be in any order.

    The Scatter-Gather list is sent to the target in what is called
    a "cdb continuation segment". This is yet another possible segment
    in the osd-out-buffer. It is unlike all other segments in that it
    sits before the actual "data" segment (which until now was always
    first), and that it is signed by itself and not part of the data
    buffer. This is because the cdb-continuation-segment is considered
    a spill-over of the CDB data, and is therefor signed under
    OSD_SEC_CAPKEY and higher.

    TODO: A new osd_finalize_request_ex version should be supplied so
    the @caps received on the network also contains a size parameter
    and can be spilled over into the "cdb continuation segment".

    Thanks to John Chandy for the original
    code, and investigations. And the implementation of SG support
    in the osd-target.

    Original-coded-by: John Chandy
    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     

10 Dec, 2009

1 commit

  • So libosd has decided to sacrifice some code simplicity for the sake of
    a clean API. One of these things is the possibility for users to call
    osd_end_request, in any condition at any state. This opens up some
    problems with calling blk_put_request when out-side of the completion
    callback but calling __blk_put_request when detecting a from-completion
    state.

    The current hack was working just fine until exofs decided to operate on
    all devices in parallel and wait for the sum of the requests, before
    deallocating all osd-requests at once. There are two new possible cases
    1. All request in a group are deallocated as part of the last request's
    async-done, request_queue is locked.
    2. All request in a group where executed asynchronously, but
    de-allocation was delayed to after the async-done, in the context of
    another thread. Async execution but request_queue is not locked.

    The solution I chose was to separate the deallocation of the osd_request
    which has the information users need, from the deallocation of the
    internal(2) requests which impose the locking problem. The internal
    block-requests are freed unconditionally inside the async-done-callback,
    when we know the queue is always locked. If at osd_end_request time we
    still have a bock-request, then we know it did not come from within an
    async-done-callback and we can call the regular blk_put_request.

    The internal requests were used for carrying error information after
    execution. This information is now copied to osd_request members for
    later analysis by user code.

    The external API and behaviour was unchanged, except now it really
    supports what was previously advertised.

    Reported-by: Vineet Agarwal
    Signed-off-by: Boaz Harrosh
    Cc: Stable Tree
    Signed-off-by: James Bottomley

    Boaz Harrosh
     

05 Dec, 2009

4 commits

  • Administer some love to the osd_req_decode_sense function

    * Fix a bad bug with osd_req_decode_sense(). If there was no scsi
    residual, .i.e the request never reached the target, then all the
    osd_sense_info members where garbage.

    * Add grossly missing in/out_resid to osd_sense_info and fill them in
    properly.

    * Define an osd_err_priority enum which divides the possible errors into
    7 categories in ascending severity. Each category is also assigned a
    Linux return code translation.

    Analyze the different osd/scsi/block returned errors and set the
    proper osd_err_priority and Linux return code accordingly.

    * extra check a few situations so not to get stuck with inconsistent
    error view. Example an empty residual with an error code, and other
    places ...

    Lots of libosd's osd_req_decode_sense clients had this logic in some
    form or another. Consolidate all these into one place that should
    actually know about osd returns. Thous translating it to a more
    abstract error.

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • Define an osd_dev_info structure that Uniquely identifies an OSD
    device lun on the network. The identification is built from unique
    target attributes and is the same for all network/SAN machines.

    osduld_info_lookup() - NEW
    New API that will lookup an osd_dev by its osd_dev_info.
    This is used by pNFS-objects for cross network global device
    identification. And by exofs multy-device support, the device
    info is specified in the on-disk exofs device table.

    osduld_device_info() - NEW
    Given an osd_dev handle returns its associated osd_dev_info.
    The ULD fetches this information at startup and hangs it on
    each OSD device. (This is a fast operation that can be called
    at any condition)

    osduld_device_same() - NEW
    With a given osd_dev at one hand and an osd_dev_info
    at another, we would like to know if they are the same
    device.
    Two osd_dev handles can be checked by:
    osduld_device_same(od1, osduld_device_info(od2));

    osd_auto_detect_ver() - REVISED
    Now returns an osd_dev_info structure. Is only called once
    by ULD as before. See added comments for how to use.

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • The true logic of this patch will be clear in the next patch where we
    use the class_find_device() API. When doing so the use of an internal
    kref leaves us a narrow window where a find is started while the actual
    object can go away. Using the device's kobj reference solves this
    problem because now the same kref is used for both operations. (Remove
    and find)

    Core changes
    * Embed a struct device in uld_ structure and use device_register
    instead of devie_create. Set __remove to be the device release
    function.
    * __uld_get/put is just get_/put_device. Now every thing is accounted
    for on the device object. Internal kref is removed.
    * At __remove() we can safely de-allocate the uld_ structure. (The
    function has moved to avoid forward declaration)

    Some cleanups
    * Use class register/unregister is cleaner for this driver now.
    * cdev ref-counting games are no longer necessary

    I have incremented the device version string in case of new bugs.

    Note: Previous bugfix of taking the reference around fput() still
    applies.

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • define a new osd_dev_is_ver1 that operates on devices
    and the old osd_req_is_ver1 uses that new API.

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     

10 Jun, 2009

4 commits

  • This patch was inspired by Al Viro, for simplifying and fixing the
    retrieval of osd-devices by in-kernel users, eg: file systems.
    In-Kernel users, now, go through the same path user-mode does by
    opening a file on the osd char-device and though holding a reference
    to both the device and the Module.

    A file pointer was added to the osd_dev structure which is now
    allocated for each user. The internal osd_dev is no longer exposed
    outside of the uld. I wanted to do that for a long time so each
    libosd user can have his own defaults on the device.

    The API is left the same, so user code need not change.

    It is no longer needed to open/close a file handle on the osd
    char-device from user-mode, before mounting an exofs on it.

    Signed-off-by: Boaz Harrosh
    CC: Al Viro
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • libosd users that need to work with bios, must sometime use
    the request_queue associated with the osd_dev. Make a wrapper for
    that, and convert all in-tree users.

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • For supporting of chained-bios we can not inspect the first
    bio only, as before. Caller shall pass the total length of the
    request, ie. sum_bytes(bio-chain).

    Also since the bio might be a chain we don't set it's direction
    on behalf of it's callers. The bio direction should be properly
    set prior to this call. So fix a couple of write users that now
    need to set the bio direction properly

    [In this patch I change both library code and user sites at
    exofs, to make it easy on integration. It should be submitted
    via James's scsi-misc tree.]

    Signed-off-by: Boaz Harrosh
    CC: Jeff Garzik
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • By popular demand, define usefull wrappers for osd_req_read/write
    that recieve kernel pointers. All users had their own.

    Also remove these from exofs

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     

13 Mar, 2009

6 commits

  • Implementation of the osd_req_decode_sense() API. Can be called by
    library users to decode what failed in command executions.

    Add SCSI_OSD_DPRINT_SENSE Kconfig variable. Possible values are:
    0 - Do not print any errors to messages file
    1 - (Default) Print only decoded errors that are not recoverable.
    Recoverable errors are those that the target has complied with
    the request but with a warning. For example read passed end of
    object will return zeros after the last valid byte.
    2- Print all errors.

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • Auto detect an OSDv2 or OSDv1 target at run time. Note how none
    of the OSD API calls change. The tests do not know what device
    version it is.

    This test now passes against both the IBM-OSD-SIM OSD1 target
    as well as OSC's OSD2 target.

    Signed-off-by: Boaz Harrosh
    Reviewed-by: Benny Halevy
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • Add support for OSD2 at run time. It is now possible to run with
    both OSDv1 and OSDv2 targets at the same time. The actual detection
    should be preformed by the security manager, as the version is encoded
    in the capability structure.

    Signed-off-by: Boaz Harrosh
    Reviewed-by: Benny Halevy
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • Kernel clients like exofs can retrieve struct osd_dev(s)
    by means of below API.

    + osduld_path_lookup() - given a path (e.g "/dev/osd0") locks and
    returns the corresponding struct osd_dev, which is then needed
    for subsequent libosd use.

    + osduld_put_device() - free up use of an osd_dev.

    Devices can be shared by multiple clients. The osd_uld_device's
    life time is governed by an embedded kref structure.

    The osd_uld_device holds an extra reference to both it's
    char-device and it's scsi_device, and will release these just
    before the final deallocation.

    There are three possible lock sources of the osd_uld_device
    1. First and for most is the probe() function called by
    scsi-ml upon a successful login into a target. Released in release()
    when logout.
    2. Second by user-mode file handles opened on the char-dev.
    3. Third is here by Kernel users.
    All three locks must be removed before the osd_uld_device is freed.

    The MODULE has three lock sources as well:
    1. scsi-ml at probe() time, removed after release(). (login/logout)
    2. The user-mode file handles open/close.
    3. Import symbols by client modules like exofs.

    TODO:
    This API is not enough for the pNFS-objects LD. A more versatile
    API will be needed. Proposed API could be:
    struct osd_dev *osduld_sysid_lookup(const char id[OSD_SYSTEMID_LEN]);

    Signed-off-by: Boaz Harrosh
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • Add a Linux driver module that registers as a SCSI ULD and probes
    for OSD type SCSI devices.

    When an OSD-type SCSI device is found a character device is created
    in the form of /dev/osdX - where X goes from 0 up to hard coded 64.
    The Major character device number used is 260.

    Signed-off-by: Boaz Harrosh
    Reviewed-by: Benny Halevy
    Signed-off-by: James Bottomley

    Boaz Harrosh
     
  • Headers only patch.

    osd_protocol.h
    Contains a C-fied definition of the T10 OSD standard
    osd_types.h
    Contains CPU order common used types
    osd_initiator.h
    API definition of the osd_initiator library
    osd_sec.h
    Contains High level API for the security manager.

    [Note that checkpatch spews errors on things that are valid in this context
    and will not be fixed]

    Signed-off-by: Boaz Harrosh
    Reviewed-by: Benny Halevy
    Signed-off-by: James Bottomley

    Boaz Harrosh