1. 05 12月, 2009 3 次提交
    • B
      [SCSI] libosd: osd_dev_info: Unique Identification of an OSD device · 2cdd6410
      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: NBoaz Harrosh <bharrosh@panasas.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      2cdd6410
    • B
      [SCSI] osduld: Use device->release instead of internal kref · d6ae4333
      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: NBoaz Harrosh <bharrosh@panasas.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      d6ae4333
    • B
      [SCSI] osduld: Ref-counting bug fix · 89f5e1f2
      Boaz Harrosh 提交于
      If scsi has released the device (logout), and exofs has last
      reference on the osduld_device it will be freed by
      osd_uld_release() within the call to fput(). But this will
      oops in cdev_release() which is called after the fops->release.
      (cdev is embedded within osduld_device). __uld_get/put pair
      makes sure we have a cdev for the duration of fput()
      Signed-off-by: NBoaz Harrosh <bharrosh@panasas.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
      89f5e1f2
  2. 10 6月, 2009 1 次提交
    • B
      [SCSI] osduld: use filp_open() when looking up an osd-device · 021e2230
      Boaz Harrosh 提交于
      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: NBoaz Harrosh <bharrosh@panasas.com>
      CC: Al Viro <viro@ZenIV.linux.org.uk>
      Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
      021e2230
  3. 09 5月, 2009 1 次提交
  4. 03 4月, 2009 1 次提交
  5. 13 3月, 2009 3 次提交
    • B
      [SCSI] libosd: OSDv2 auto detection · 1b9dce94
      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: NBoaz Harrosh <bharrosh@panasas.com>
      Reviewed-by: NBenny Halevy <bhalevy@panasas.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
      1b9dce94
    • B
      [SCSI] osd_uld: API for retrieving osd devices from Kernel · b799bc7d
      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: NBoaz Harrosh <bharrosh@panasas.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
      b799bc7d
    • B
      [SCSI] osd_uld: OSD scsi ULD · 95b05a7d
      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: NBoaz Harrosh <bharrosh@panasas.com>
      Reviewed-by: NBenny Halevy <bhalevy@panasas.com>
      Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
      95b05a7d