31 Mar, 2015

1 commit

  • We have peculiar problems with multi-path and enclosures: physically, we know
    each bay can only be occupied by a single disk device. However in multi-path,
    it appears we have many (because each path to the device appears in Linux as a
    different kernel device). We try to fix this by only having the last seen
    device show up in the bay.

    Sysfs gets very annoyed if we try to manipulate links when the kobject sysfs
    directory (kobj.sd) doesn't exist and drops a huge WARN_ON which most users
    panic and report an oops for. This happens on a few path removal situations
    and IBM reports seeing it when one of their multi-path adapters is removed.

    Add a check to enclosure device removal for the existence the sysfs directory
    containing both the forward and back links so that the remnants (if any) get
    removed in either direction but no scary warnings are dumped.

    Reported-by: Wen Xiong
    Tested-by: Wen Xiong
    Signed-off-by: James Bottomley

    James Bottomley
     

09 Jan, 2015

4 commits

  • Add power_status to SES device slot, so we can power on/off the
    HDDs behind the enclosure.

    Check firmware status in ses_set_* before sending control pages to
    firmware.

    Signed-off-by: Song Liu
    Acked-by: Dan Williams
    Reviewed-by: Jens Axboe
    Cc: Hannes Reinecke
    Signed-off-by: Christoph Hellwig

    Song Liu
     
  • The name provided by firmware is in a vendor specific format, publish
    the slot number to have a reliable mechanism for identifying slots
    across firmware implementations. If the enclosure does not provide a
    slot number fallback to the component number which is guaranteed unique,
    and usually mirrors the slot number.

    Cleaned up the unused ses_component.desc in the process.

    Signed-off-by: Dan Williams
    Signed-off-by: Song Liu
    Reviewed-by: Jens Axboe
    Reviewed-by: Hannes Reinecke
    Signed-off-by: Christoph Hellwig

    Dan Williams
     
  • Export the NAA logical id for the enclosure. This is optionally
    available from the sas_transport_class, but it is really a property of
    the enclosure.

    Signed-off-by: Dan Williams
    Signed-off-by: Song Liu
    Reviewed-by: Jens Axboe
    Cc: Hannes Reinecke
    Signed-off-by: Christoph Hellwig

    Dan Williams
     
  • The slot and address fields have a small window of instability when
    userspace can read them before initialization. Separate
    enclosure_component
    allocation from registration.

    Signed-off-by: Dan Williams
    Signed-off-by: Song Liu
    Reviewed-by: Jens Axboe
    Cc: Hannes Reinecke
    Signed-off-by: Christoph Hellwig

    Dan Williams
     

12 Nov, 2014

1 commit

  • Some SES devices give non-unique Element Descriptors as part of the
    Element Descriptor diag page. Since we use these for creating sysfs
    entries, they need to be unique. The specification doesn't require
    these to be unique.

    Eg:
    $ sg_ses -p 7 /dev/sg0
    FTS CORP TXS6_SAS20BPX12 0500
    enclosure services device
    Element descriptor In diagnostic page:
    generation code: 0x0
    element descriptor by type list
    Element type: Array device, subenclosure id: 0
    Overall descriptor: ArrayDevicesInSubEnclsr0
    Element 1 descriptor: ArrayDevice00
    Element 2 descriptor: ArrayDevice01
    Element 3 descriptor: ArrayDevice02
    Element 4 descriptor: ArrayDevice03
    Element 5 descriptor: ArrayDevice03
    Element 6 descriptor: ArrayDevice03
    Element 7 descriptor: ArrayDevice03
    Element 8 descriptor: ArrayDevice03
    Element 9 descriptor: ArrayDevice03
    Element 10 descriptor: ArrayDevice03
    Element 11 descriptor: ArrayDevice03
    Element 12 descriptor: ArrayDevice03

    Based on http://thread.gmane.org/gmane.linux.scsi/69289. This
    version implements James' ideas about the naming convention

    Signed-off-by: Markus Stockhausen
    Acked-by: James Bottomley
    Signed-off-by: Christoph Hellwig

    Markus Stockhausen
     

03 Dec, 2013

1 commit

  • Bug report from: wenxiong@linux.vnet.ibm.com

    The issue is happened in dual controller configuration. We got the
    sysfs warnings when rmmod the ipr module.

    enclosure_unregister() in drivers/msic/enclosure.c, call device_unregister()
    for each componment deivce, device_unregister() ->device_del()->kobject_del()
    ->sysfs_remove_dir(). In sysfs_remove_dir(), set kobj->sd = NULL.

    For each componment device,
    enclosure_component_release()->enclosure_remove_links()->sysfs_remove_link()
    in which checking kobj->sd again, it has been set as NULL when doing
    device_unregister. So we saw all these sysfs WARNING.

    Tested-by: wenxiong@linux.vnet.ibm.com
    Cc: stable@vger.kernel.org
    Signed-off-by: James Bottomley

    James Bottomley
     

25 Jul, 2013

1 commit


28 Jul, 2010

1 commit


30 Mar, 2010

1 commit

  • …it slab.h inclusion from percpu.h

    percpu.h is included by sched.h and module.h and thus ends up being
    included when building most .c files. percpu.h includes slab.h which
    in turn includes gfp.h making everything defined by the two files
    universally available and complicating inclusion dependencies.

    percpu.h -> slab.h dependency is about to be removed. Prepare for
    this change by updating users of gfp and slab facilities include those
    headers directly instead of assuming availability. As this conversion
    needs to touch large number of source files, the following script is
    used as the basis of conversion.

    http://userweb.kernel.org/~tj/misc/slabh-sweep.py

    The script does the followings.

    * Scan files for gfp and slab usages and update includes such that
    only the necessary includes are there. ie. if only gfp is used,
    gfp.h, if slab is used, slab.h.

    * When the script inserts a new include, it looks at the include
    blocks and try to put the new include such that its order conforms
    to its surrounding. It's put in the include block which contains
    core kernel includes, in the same order that the rest are ordered -
    alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
    doesn't seem to be any matching order.

    * If the script can't find a place to put a new include (mostly
    because the file doesn't have fitting include block), it prints out
    an error message indicating which .h file needs to be added to the
    file.

    The conversion was done in the following steps.

    1. The initial automatic conversion of all .c files updated slightly
    over 4000 files, deleting around 700 includes and adding ~480 gfp.h
    and ~3000 slab.h inclusions. The script emitted errors for ~400
    files.

    2. Each error was manually checked. Some didn't need the inclusion,
    some needed manual addition while adding it to implementation .h or
    embedding .c file was more appropriate for others. This step added
    inclusions to around 150 files.

    3. The script was run again and the output was compared to the edits
    from #2 to make sure no file was left behind.

    4. Several build tests were done and a couple of problems were fixed.
    e.g. lib/decompress_*.c used malloc/free() wrappers around slab
    APIs requiring slab.h to be added manually.

    5. The script was run on all .h files but without automatically
    editing them as sprinkling gfp.h and slab.h inclusions around .h
    files could easily lead to inclusion dependency hell. Most gfp.h
    inclusion directives were ignored as stuff from gfp.h was usually
    wildly available and often used in preprocessor macros. Each
    slab.h inclusion directive was examined and added manually as
    necessary.

    6. percpu.h was updated not to include slab.h.

    7. Build test were done on the following configurations and failures
    were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
    distributed build env didn't work with gcov compiles) and a few
    more options had to be turned off depending on archs to make things
    build (like ipr on powerpc/64 which failed due to missing writeq).

    * x86 and x86_64 UP and SMP allmodconfig and a custom test config.
    * powerpc and powerpc64 SMP allmodconfig
    * sparc and sparc64 SMP allmodconfig
    * ia64 SMP allmodconfig
    * s390 SMP allmodconfig
    * alpha SMP allmodconfig
    * um on x86_64 SMP allmodconfig

    8. percpu.h modifications were reverted so that it could be applied as
    a separate patch and serve as bisection point.

    Given the fact that I had only a couple of failures from tests on step
    6, I'm fairly confident about the coverage of this conversion patch.
    If there is a breakage, it's likely to be something in one of the arch
    headers which should be easily discoverable easily on most builds of
    the specific arch.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

    Tejun Heo
     

10 Dec, 2009

1 commit

  • Based on patch originally by Jeff Mahoney

    enclosure_status is expected to be a NULL terminated array of strings
    but isn't actually NULL terminated. When writing an invalid value to
    /sys/class/enclosure/.../.../status, it goes off the end of the array
    and Oopses.

    Fix by making the assumption true and adding NULL at the end.

    Reported-by: Artur Wojcik
    Signed-off-by: James Bottomley

    James Bottomley
     

16 Sep, 2009

1 commit


23 Aug, 2009

3 commits

  • Now that hot add works correctly, if a new device is added, we're still
    operating on stale enclosure data, so fix that by updating the enclosure
    diagnostic pages when we get notified of a device hot add

    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    James Bottomley
     
  • Right at the moment, hot removal of a device within an enclosure does
    nothing (because the intf_remove only copes with enclosure removal not
    with component removal). Fix this by adding a function to remove the
    component. Also needed to fix the prototype of
    enclosure_remove_device, since we know the device we've removed but
    not the internal component number

    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    James Bottomley
     
  • In a situation either with expanders or with multiple enclosure
    devices, hot add doesn't always work. This is because we try to find
    a single enclosure device attached to the host. Fix this by looping
    over all enclosure devices attached to the host and also by making the
    find loop recognise that the enclosure devices may be expander remote
    (i.e. not parented by the host).

    Signed-off-by: James Bottomley
    Signed-off-by: James Bottomley

    James Bottomley
     

16 May, 2009

1 commit

  • We use the name provided by SES to name objects. An empty name is
    legal in SES but causes problems in our generic device hierarchy. Fix
    this by falling back to a number if the name is either NULL or empty.

    Also fix a secondary bug spotted in that dev_set_name(dev, name) uses
    a string format and so would go wrong if name contained a '%'.

    Signed-off-by: Yinghai Lu
    Signed-off-by: James Bottomley

    Yinghai Lu
     

03 Jan, 2009

1 commit


23 Apr, 2008

1 commit


20 Apr, 2008

1 commit


08 Feb, 2008

1 commit