22 Jul, 2011

1 commit

  • Some broken devices indicates that media has changed on every
    GET_EVENT_STATUS_NOTIFICATION. This translates into MEDIA_CHANGE
    uevent on every open() which lets udev run into a loop.

    Verify GET_EVENT result against TUR and if it generates spurious
    events for several times in a row, ignore the GET_EVENT events, and
    trust only the TUR status.

    This is the log of a USB stick with a (broken) fake CDROM drive:

    scsi 5:0:0:0: Direct-Access SanDisk U3 Cruzer Micro 8.02 PQ: 0 ANSI: 0 CCS
    sd 5:0:0:0: Attached scsi generic sg3 type 0
    scsi 5:0:0:1: CD-ROM SanDisk U3 Cruzer Micro 8.02 PQ: 0 ANSI: 0
    sd 5:0:0:0: [sdb] Attached SCSI removable disk
    sr2: scsi3-mmc drive: 48x/48x tray
    sr 5:0:0:1: Attached scsi CD-ROM sr2
    sr 5:0:0:1: Attached scsi generic sg4 type 5
    sr2: GET_EVENT and TUR disagree continuously, suppress GET_EVENT events
    sd 5:0:0:0: [sdb] 31777279 512-byte logical blocks: (16.2 GB/15.1 GiB)
    sd 5:0:0:0: [sdb] No Caching mode page present
    sd 5:0:0:0: [sdb] Assuming drive cache: write through
    sd 5:0:0:0: [sdb] No Caching mode page present
    sd 5:0:0:0: [sdb] Assuming drive cache: write through
    sdb: sdb1

    -tj: Updated to consider only spurious GET_EVENT events among
    different types of disagreement and allow using TUR for kernel
    event polling after GET_EVENT is ignored.

    Reported-By: Markus Rathgeb maggu2810@googlemail.com
    Signed-off-by: Kay Sievers
    Signed-off-by: Tejun Heo
    Cc: stable@kernel.org # >= v2.6.38, fixes udev busy looping w/ certain devices
    Signed-off-by: James Bottomley

    Kay Sievers
     

22 Apr, 2011

1 commit

  • Disk event code automatically blocks events on excl write. This is
    primarily to avoid issuing polling commands while burning is in
    progress. This behavior doesn't fit other types of devices with
    removeable media where polling commands don't have adverse side
    effects and door locking usually doesn't exist.

    This patch introduces new genhd flag which controls the auto-blocking
    behavior and uses it to enable auto-blocking only on optical devices.

    Note for stable: 2.6.38 and later only

    Cc: stable@kernel.org
    Signed-off-by: Tejun Heo
    Reported-by: Kay Sievers
    Signed-off-by: Jens Axboe

    Tejun Heo
     

31 Mar, 2011

1 commit


14 Jan, 2011

1 commit

  • SDEV_MEDIA_CHANGE event was first added by commit a341cd0f (SCSI: add
    asynchronous event notification API) for SATA AN support and then
    extended to cover generic media change events by commit 285e9670
    ([SCSI] sr,sd: send media state change modification events).

    This event was mapped to block device in userland with all properties
    stripped to simulate CHANGE event on the block device, which, in turn,
    was used to trigger further userspace action on media change.

    The recent addition of disk event framework kept this event for
    backward compatibility but it turns out to be unnecessary and causes
    erratic and inefficient behavior. The new disk event generates proper
    events on the block devices and the compat events are mapped to block
    device with all properties stripped, so the block device ends up
    generating multiple duplicate events for single actual event.

    This patch removes the compat event generation from both sr and sd as
    suggested by Kay Sievers. Both existing and newer versions of udev
    and the associated tools will behave better with the removal of these
    events as they from the beginning were expecting events on the block
    devices.

    Signed-off-by: Tejun Heo
    Acked-by: Kay Sievers
    Signed-off-by: James Bottomley

    Tejun Heo
     

17 Dec, 2010

3 commits

  • Replace sr_media_change() with sr_check_events(). It normally only
    uses GET_EVENT_STATUS_NOTIFICATION to check both media change and
    eject request. If @clearing includes DISK_EVENT_MEDIA_CHANGE, it
    issues TUR and compares whether media presence has changed. The SCSI
    specific media change uevent is kept for compatibility.

    sr_media_change() was doing both media change check and revalidation.
    The revalidation part is split into sr_block_revalidate_disk().

    Signed-off-by: Tejun Heo
    Cc: Kay Sievers
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • The usage of TUR has been confusing involving several different
    commits updating different parts over time. Currently, the only
    differences between scsi_test_unit_ready() and sr_test_unit_ready()
    are,

    * scsi_test_unit_ready() also sets sdev->changed on NOT_READY.

    * scsi_test_unit_ready() returns 0 if TUR ended with UNIT_ATTENTION or
    NOT_READY.

    Due to the above two differences, sr is using its own
    sr_test_unit_ready(), but sd - the sole user of the above extra
    handling - doesn't even need them.

    Where scsi_test_unit_ready() is used in sd_media_changed(), the code
    is looking for device ready w/ media present state which is true iff
    TUR succeeds w/o sense data or UA, and when the device is not ready
    for whatever reason sd_media_changed() explicitly marks media as
    missing so there's no reason to set sdev->changed automatically from
    scsi_test_unit_ready() on NOT_READY.

    Drop both special handlings from scsi_test_unit_ready(), which makes
    it equivalant to sr_test_unit_ready(), and replace
    sr_test_unit_ready() with scsi_test_unit_ready(). Also, drop the
    unnecessary explicit NOT_READY check from sd_media_changed().
    Checking return value is enough for testing device readiness.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     
  • sr_test_unit_ready() returns 0 iff TUR succeeded - IOW, when media is
    present and the device is actually ready, so the return value wouldn't
    be zero when TUR ends with sense data. sr_media_change() incorrectly
    tests (retval || (scsi_sense_valid(sshdr)...)) when it tries to test
    whether TUR failed without sense data or with sense data indicating
    media-not-present.

    Fix the test using scsi_status_is_good() and update comments.

    - Fixed a comment typo spotted by Eike.

    Signed-off-by: Tejun Heo
    Cc: Rolf Eike Beer
    Signed-off-by: Jens Axboe

    Tejun Heo
     

23 Oct, 2010

2 commits

  • * git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6: (141 commits)
    USB: mct_u232: fix broken close
    USB: gadget: amd5536udc.c: fix error path
    USB: imx21-hcd - fix off by one resource size calculation
    usb: gadget: fix Kconfig warning
    usb: r8a66597-udc: Add processing when USB was removed.
    mxc_udc: add workaround for ENGcm09152 for i.MX35
    USB: ftdi_sio: add device ids for ScienceScope
    USB: musb: AM35x: Workaround for fifo read issue
    USB: musb: add musb support for AM35x
    USB: AM35x: Add musb support
    usb: Fix linker errors with CONFIG_PM=n
    USB: ohci-sh - use resource_size instead of defining its own resource_len macro
    USB: isp1362-hcd - use resource_size instead of defining its own resource_len macro
    USB: isp116x-hcd - use resource_size instead of defining its own resource_len macro
    USB: xhci: Fix compile error when CONFIG_PM=n
    USB: accept some invalid ep0-maxpacket values
    USB: xHCI: PCI power management implementation
    USB: xHCI: bus power management implementation
    USB: xHCI: port remote wakeup implementation
    USB: xHCI: port power management implementation
    ...

    Manually fix up (non-data) conflict: the SCSI merge gad renamed the
    'hw_sector_size' member to 'physical_block_size', and the USB tree
    brought a new use of it.

    Linus Torvalds
     
  • Some USB devices emulate a usb-mass-storage attached (scsi) cdrom device,
    usually this fake cdrom contains the windows software for the device.
    While working on supporting Appotech ax3003 based photoframes, which do
    this I discovered that they will go of into lala land when ever they see a
    READ_DISC_INFO scsi command.

    Thus this patch adds a scsi_device flag (which can then be set by the
    usb-storage driver through an unsual-devs entry), to indicate this, and
    makes the sr driver honor this flag.

    I know this sucks, but as discussed on linux-scsi list there is no other
    way to make this device work properly.

    Looking at usb traces made under windows, windows never sends a
    READ_DISC_INFO during normal interactions with a usb cdrom device. So as
    this cdrom emulation thingie becomes more common we might see more of this
    problem.

    Signed-off-by: Hans de Goede
    Cc: James Bottomley
    Cc: Alan Stern
    Cc: Matthew Dharm
    Signed-off-by: Andrew Morton
    Signed-off-by: Greg Kroah-Hartman

    Hans de Goede
     

05 Oct, 2010

1 commit

  • The block device drivers have all gained new lock_kernel
    calls from a recent pushdown, and some of the drivers
    were already using the BKL before.

    This turns the BKL into a set of per-driver mutexes.
    Still need to check whether this is safe to do.

    file=$1
    name=$2
    if grep -q lock_kernel ${file} ; then
    if grep -q 'include.*linux.mutex.h' ${file} ; then
    sed -i '/include.*/d' ${file}
    else
    sed -i 's/include.*.*$/include /g' ${file}
    fi
    sed -i ${file} \
    -e "/^#include.*linux.mutex.h/,$ {
    1,/^\(static\|int\|long\)/ {
    /^\(static\|int\|long\)/istatic DEFINE_MUTEX(${name}_mutex);

    } }" \
    -e "s/\(un\)*lock_kernel\>[ ]*()/mutex_\1lock(\&${name}_mutex)/g" \
    -e '/[ ]*cycle_kernel_lock();/d'
    else
    sed -i -e '/include.*\/d' ${file} \
    -e '/cycle_kernel_lock()/d'
    fi

    Signed-off-by: Arnd Bergmann

    Arnd Bergmann
     

08 Aug, 2010

2 commits

  • The open and release block_device_operations are currently
    called with the BKL held. In order to change that, we must
    first make sure that all drivers that currently rely
    on this have no regressions.

    This blindly pushes the BKL into all .open and .release
    operations for all block drivers to prepare for the
    next step. The drivers can subsequently replace the BKL
    with their own locks or remove it completely when it can
    be shown that it is not needed.

    The functions blkdev_get and blkdev_put are the only
    remaining users of the big kernel lock in the block
    layer, besides a few uses in the ioctl code, none
    of which need to serialize with blkdev_{get,put}.

    Most of these two functions is also under the protection
    of bdev->bd_mutex, including the actual calls to
    ->open and ->release, and the common code does not
    access any global data structures that need the BKL.

    Signed-off-by: Arnd Bergmann
    Acked-by: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Arnd Bergmann
     
  • As a preparation for the removal of the big kernel
    lock in the block layer, this removes the BKL
    from the common ioctl handling code, moving it
    into every single driver still using it.

    Signed-off-by: Arnd Bergmann
    Acked-by: Christoph Hellwig
    Signed-off-by: Jens Axboe

    Arnd Bergmann
     

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
     

02 Oct, 2009

1 commit

  • On certain cases, UDF disc doesn't report capacity correctly via
    READ_CAPACITY but TOC or trackinfo contains valid information which
    can be obtained using cdrom_get_last_written(). ide-cd considers both
    values and uses the larger one. Do the same in sr. This fixes
    bko#9668.

    http://bugzilla.kernel.org/show_bug.cgi?id=9668

    Signed-off-by: Tejun Heo
    Reported-by: Milan Kocian
    Cc: Jan Kara
    Signed-off-by: James Bottomley

    Tejun Heo
     

22 Sep, 2009

1 commit


22 Jun, 2009

1 commit

  • If a SCSI ULD driver sets blk_queue_prep_rq(), it should clean it
    up itself on remove(), and not from the bus callbacks. This
    removes the need to hook into bus->remove(), which should not
    be used at the same time as driver->remove().

    [jejb: fix sdkp initialisation problem due to mismerge]
    Signed-off-by: Hannes Reinecke
    Signed-off-by: Kay Sievers
    Signed-off-by: James Bottomley

    Hannes Reinecke
     

23 May, 2009

1 commit

  • Until now we have had a 1:1 mapping between storage device physical
    block size and the logical block sized used when addressing the device.
    With SATA 4KB drives coming out that will no longer be the case. The
    sector size will be 4KB but the logical block size will remain
    512-bytes. Hence we need to distinguish between the physical block size
    and the logical ditto.

    This patch renames hardsect_size to logical_block_size.

    Signed-off-by: Martin K. Petersen
    Signed-off-by: Jens Axboe

    Martin K. Petersen
     

11 May, 2009

1 commit

  • With recent cleanups, there is no place where low level driver
    directly manipulates request fields. This means that the 'hard'
    request fields always equal the !hard fields. Convert all
    rq->sectors, nr_sectors and current_nr_sectors references to
    accessors.

    While at it, drop superflous blk_rq_pos() < 0 test in swim.c.

    [ Impact: use pos and nr_sectors accessors ]

    Signed-off-by: Tejun Heo
    Acked-by: Geert Uytterhoeven
    Tested-by: Grant Likely
    Acked-by: Grant Likely
    Tested-by: Adrian McMenamin
    Acked-by: Adrian McMenamin
    Acked-by: Mike Miller
    Cc: James Bottomley
    Cc: Bartlomiej Zolnierkiewicz
    Cc: Borislav Petkov
    Cc: Sergei Shtylyov
    Cc: Eric Moore
    Cc: Alan Stern
    Cc: FUJITA Tomonori
    Cc: Pete Zaitcev
    Cc: Stephen Rothwell
    Cc: Paul Clements
    Cc: Tim Waugh
    Cc: Jeff Garzik
    Cc: Jeremy Fitzhardinge
    Cc: Alex Dubov
    Cc: David Woodhouse
    Cc: Martin Schwidefsky
    Cc: Dario Ballabio
    Cc: David S. Miller
    Cc: Rusty Russell
    Cc: unsik Kim
    Cc: Laurent Vivier
    Signed-off-by: Jens Axboe

    Tejun Heo
     

03 Apr, 2009

1 commit

  • We have a problem with recovered error handling in that any command
    which goes down as BLOCK_PC but which returns a sense code of RECOVERED
    ERROR gets completed with -EIO. For actual SG_IO commands, this doesn't
    matter at all, since the error return code gets dropped in favour of
    req->errors which contain the SCSI completion code.

    However, if this command is part of the block system, then it will pay
    attention to the returned error code. In particularly if a SYNCHRONIZE
    CACHE from a barrier command completes with RECOVERED ERROR, the
    resulting -EIO on the barrier causes block to error the request and
    return it to the filesystem. Fix this by converting the -EIO for
    recovered error to zero, plus remove the printing of this from sd and sr
    so the message isn't double printed.

    Signed-off-by: James Bottomley

    James Bottomley
     

30 Dec, 2008

1 commit


04 Dec, 2008

1 commit

  • Update FMODE_NDELAY before each ioctl call so that we can kill the
    magic FMODE_NDELAY_NOW. It would be even better to do this directly
    in setfl(), but for that we'd need to have FMODE_NDELAY for all files,
    not just block special files.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     

21 Oct, 2008

4 commits

  • Signed-off-by: Al Viro

    Al Viro
     
  • To keep the size of changesets sane we split the switch by drivers;
    to keep the damn thing bisectable we do the following:
    1) rename the affected methods, add ones with correct
    prototypes, make (few) callers handle both. That's this changeset.
    2) for each driver convert to new methods. *ALL* drivers
    are converted in this series.
    3) kill the old (renamed) methods.

    Note that it _is_ a flagday; all in-tree drivers are converted and by the
    end of this series no trace of old methods remain. The only reason why
    we do that this way is to keep the damn thing bisectable and allow per-driver
    debugging if anything goes wrong.

    New methods:
    open(bdev, mode)
    release(disk, mode)
    ioctl(bdev, mode, cmd, arg) /* Called without BKL */
    compat_ioctl(bdev, mode, cmd, arg)
    locked_ioctl(bdev, mode, cmd, arg) /* Called with BKL, legacy */

    Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • ... convert to it in callers

    Signed-off-by: Al Viro

    Al Viro
     

09 Oct, 2008

2 commits

  • Right now SCSI and others do their own command timeout handling.
    Move those bits to the block layer.

    Instead of having a timer per command, we try to be a bit more clever
    and simply have one per-queue. This avoids the overhead of having to
    tear down and setup a timer for each command, so it will result in a lot
    less timer fiddling.

    Signed-off-by: Mike Anderson
    Signed-off-by: Jens Axboe

    Jens Axboe
     
  • * Implement disk_devt() and part_devt() and use them to directly
    access devt instead of computing it from ->major and ->first_minor.

    Note that all references to ->major and ->first_minor outside of
    block layer is used to determine devt of the disk (the part0) and as
    ->major and ->first_minor will continue to represent devt for the
    disk, converting these users aren't strictly necessary. However,
    convert them for consistency.

    * Implement disk_max_parts() to avoid directly deferencing
    genhd->minors.

    * Update bdget_disk() such that it doesn't assume consecutive minor
    space.

    * Move devt computation from register_disk() to add_disk() and make it
    the only one (all other usages use the initially determined value).

    These changes clean up the code and will help disk->part dereference
    fix and extended block device numbers.

    Signed-off-by: Tejun Heo
    Signed-off-by: Jens Axboe

    Tejun Heo
     

11 Sep, 2008

1 commit


29 Aug, 2008

1 commit

  • This patch remove blk_register_filter and blk_unregister_filter in
    gendisk, and adds them to sd.c, sr.c. and ide-cd.c

    The commit abf5439370491dd6fbb4fe1a7939680d2a9bc9d4 moved cmdfilter
    from gendisk to request_queue. It turned out that in some subsystems
    multiple gendisks share a single request_queue. So we get:

    Using physmap partition information
    Creating 3 MTD partitions on "physmap-flash":
    0x00000000-0x01c00000 : "User FS"
    0x01c00000-0x01c40000 : "booter"
    kobject (8511c410): tried to init an initialized object, something is seriously wrong.
    Call Trace:
    [] dump_stack+0x8/0x34
    [] kobject_init+0x50/0xcc
    [] kobject_init_and_add+0x24/0x58
    [] blk_register_filter+0x4c/0x64
    [] add_disk+0x78/0xe0
    [] add_mtd_blktrans_dev+0x254/0x278
    [] blktrans_notify_add+0x40/0x78
    [] add_mtd_device+0xd0/0x150
    [] add_mtd_partitions+0x568/0x5d8
    [] physmap_flash_probe+0x2ac/0x334
    [] driver_probe_device+0x12c/0x244
    [] __driver_attach+0x4c/0x84
    [] bus_for_each_dev+0x58/0xac
    [] bus_add_driver+0xc4/0x24c
    [] driver_register+0xcc/0x184
    [] _stext+0x60/0x1bc

    In the long term, we need to fix such subsystems but we need a quick
    fix now. This patch add the command filter support to only sd and sr
    though it might be useful for other SG_IO users (such as cciss).

    Signed-off-by: FUJITA Tomonori
    Reported-by: Manuel Lauss
    Signed-off-by: Jens Axboe

    FUJITA Tomonori
     

04 Jul, 2008

1 commit

  • blk_rq_map_kern can handle the stack buffers correctly (avoid DMA
    from/to the stack buffers by using the bounce buffer) so we don't need
    to complicate the code by allocating just 8 bytes.

    Signed-off-by: FUJITA Tomonori
    Cc: James Bottomley
    Cc: Bartlomiej Zolnierkiewicz
    Cc: Thomas Bogendoerfer
    Cc: Tejun Heo
    Signed-off-by: Andrew Morton
    Signed-off-by: Jens Axboe

    FUJITA Tomonori
     

10 Jun, 2008

1 commit

  • Reported-by: Geert Uytterhoeven

    If you delay 30s or more before mounting a CD after inserting it then
    the kernel has the wrong value for the CD size.

    http://marc.info/?t=121276133000001

    The problem is in sr_test_unit_ready(): the function eats unit
    attentions without adjusting the sdev->changed status. This means
    that when the CD signals changed media via unit attention, we can
    ignore it. Fix by making sr_test_unit_ready() adjust the changed
    status.

    Tested-by: Geert Uytterhoeven
    Cc: Stable Tree
    Signed-off-by: James Bottomley

    James Bottomley
     

20 Mar, 2008

1 commit


08 Feb, 2008

1 commit

  • Commit 210ba1d1724f5c4ed87a2ab1a21ca861a915f734 updated sr.c to use
    the scsi_test_unit_ready() function. Unfortunately, this has the
    wrong characteristic of eating NOT_READY returns which sr.c relies on
    for tray status.

    Fix by rolling an internal sr_test_unit_ready() that doesn't do this.

    Tested-by: Daniel Drake
    Signed-off-by: James Bottomley

    James Bottomley
     

31 Jan, 2008

1 commit

  • In preparation for bidi we abstract all IO members of scsi_cmnd,
    that will need to duplicate, into a substructure.

    - Group all IO members of scsi_cmnd into a scsi_data_buffer
    structure.
    - Adjust accessors to new members.
    - scsi_{alloc,free}_sgtable receive a scsi_data_buffer instead of
    scsi_cmnd. And work on it.
    - Adjust scsi_init_io() and scsi_release_buffers() for above
    change.
    - Fix other parts of scsi_lib/scsi.c to members migration. Use
    accessors where appropriate.

    - fix Documentation about scsi_cmnd in scsi_host.h

    - scsi_error.c
    * Changed needed members of struct scsi_eh_save.
    * Careful considerations in scsi_eh_prep/restore_cmnd.

    - sd.c and sr.c
    * sd and sr would adjust IO size to align on device's block
    size so code needs to change once we move to scsi_data_buff
    implementation.
    * Convert code to use scsi_for_each_sg
    * Use data accessors where appropriate.

    - tgt: convert libsrp to use scsi_data_buffer

    - isd200: This driver still bangs on scsi_cmnd IO members,
    so need changing

    [jejb: rebased on top of sg_table patches fixed up conflicts
    and used the synergy to eliminate use_sg and sg_count]

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

    Boaz Harrosh
     

12 Jan, 2008

3 commits

  • Based on an original patch from: David Martin

    When trying to get the drive status via ioctl CDROM_DRIVE_STATUS, with
    no disk it gives CDS_TRAY_OPEN even if the tray is closed.

    ioctl works as expected with ide-cd driver.

    Gentoo bug report: http://bugs.gentoo.org/show_bug.cgi?id=196879

    Cc: Maarten Bressers
    Signed-off-by: James Bottomley

    James Bottomley
     
  • The current scsi_test_unit_ready() is updated to return sense code
    information (in struct scsi_sense_hdr). The sd and sr drivers are
    changed to interpret the sense code return asc 0x3a as no media and
    adjust the device status accordingly.

    Signed-off-by: James Bottomley

    James Bottomley
     
  • This will send for a card reader slot (remove/add media):
    UEVENT[1187091572.155884] change /devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/host7/target7:0:0/7:0:0:0 (scsi)
    UEVENT[1187091572.162314] remove /block/sdb/sdb1 (block)
    UEVENT[1187091572.172464] add /block/sdb/sdb1 (block)
    UEVENT[1187091572.175408] change /devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/host7/target7:0:0/7:0:0:0 (scsi)

    and for a DVD drive (add/eject media):
    UEVENT[1187091590.189159] change /devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0 (scsi)
    UEVENT[1187091590.957124] add /module/isofs (module)
    UEVENT[1187091604.468207] change /devices/pci0000:00/0000:00:1f.1/host4/target4:0:0/4:0:0:0 (scsi)

    Userspace gets events, even for unpartitioned media. This unifies
    the event handling for asynchronoous events (AN) and events caused by
    perodical polling the device from userspace.

    Signed-off-by: Kay Sievers

    [jejb: modified for new event API]

    Signed-off-by: James Bottomley

    Kay Sievers
     

07 Jan, 2008

1 commit

  • This reverts commit ac40532ef0b8649e6f7f83859ea0de1c4ed08a19, which gets
    us back the original cleanup of 6f5391c283d7fdcf24bf40786ea79061919d1e1d.

    It turns out that the bug that was triggered by that commit was
    apparently not actually triggered by that commit at all, and just the
    testing conditions had changed enough to make it appear to be due to it.

    The real problem seems to have been found by Peter Osterlund:

    "pktcdvd sets it [block device size] when opening the /dev/pktcdvd
    device, but when the drive is later opened as /dev/scd0, there is
    nothing that sets it back. (Btw, 40944 is possible if the disk is a
    CDRW that was formatted with "cdrwtool -m 10236".)

    The problem is that pktcdvd opens the cd device in non-blocking mode
    when pktsetup is run, and doesn't close it again until pktsetup -d is
    run. The effect is that if you meanwhile open the cd device,
    blkdev.c:do_open() doesn't call bd_set_size() because
    bdev->bd_openers is non-zero."

    In particular, to repeat the bug (regardless of whether commit
    6f5391c283d7fdcf24bf40786ea79061919d1e1d is applied or not):

    " 1. Start with an empty drive.
    2. pktsetup 0 /dev/scd0
    3. Insert a CD containing an isofs filesystem.
    4. mount /dev/pktcdvd/0 /mnt/tmp
    5. umount /mnt/tmp
    6. Press the eject button.
    7. Insert a DVD containing a non-writable filesystem.
    8. mount /dev/scd0 /mnt/tmp
    9. find /mnt/tmp -type f -print0 | xargs -0 sha1sum >/dev/null
    10. If the DVD contains data beyond the physical size of a CD, you
    get I/O errors in the terminal, and dmesg reports lots of
    "attempt to access beyond end of device" errors."

    which in turn is because the nested open after the media change won't
    cause the size to be set properly (because the original open still holds
    the block device, and we only do the bd_set_size() when we don't have
    other people holding the device open).

    The proper fix for that is probably to just do something like

    bdev->bd_inode->i_size = (loff_t)get_capacity(disk)<
    Cc: James Bottomley
    Cc: Matthew Wilcox
    Cc: Ingo Molnar
    Cc: Andrew Morton
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

03 Jan, 2008

1 commit

  • This reverts commit 6f5391c283d7fdcf24bf40786ea79061919d1e1d ("[SCSI]
    Get rid of scsi_cmnd->done") that was supposed to be a cleanup commit,
    but apparently it causes regressions:

    Bug 9370 - v2.6.24-rc2-409-g9418d5d: attempt to access beyond end of device
    http://bugzilla.kernel.org/show_bug.cgi?id=9370

    this patch should be reintroduced in a more split-up form to make
    testing of it easier.

    Signed-off-by: Ingo Molnar
    Acked-by: Matthew Wilcox
    Cc: James Bottomley
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

13 Oct, 2007

1 commit

  • The ULD ->done callback moves into the scsi_driver. By moving the call
    to scsi_io_completion() from scsi_blk_pc_done() to scsi_finish_command(),
    we can eliminate the latter entirely. By returning 'good_bytes' from
    the ->done callback (rather than invoking scsi_io_completion()), we can
    stop exporting scsi_io_completion().

    Also move the prototypes from sd.h to sd.c as they're all internal anyway.
    Rename sd_rw_intr to sd_done and rw_intr to sr_done.

    Inspired-by: Christoph Hellwig
    Signed-off-by: Matthew Wilcox
    Signed-off-by: James Bottomley

    Matthew Wilcox