06 Aug, 2008

1 commit

  • This re-introduces commit 2b142900784c6e38c8d39fa57d5f95ef08e735d8,
    which was reverted due to the regression it caused by commit
    fca082c9f1e11ec07efa8d2f9f13688521253f36.

    That regression was not root-caused by the original commit, it was just
    uncovered by it, and the real fix was done by Alan Stern in commit
    580da34847488b404218d1d7f53b156f245f5555 ("Fix USB storage hang on
    command abort").

    We can thus re-introduce the change that was confirmed by Alan Jenkins
    to be still required by his odd card reader.

    Cc: Alan Jenkins
    Cc: Alan Stern
    Cc: James Bottomley
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

05 Aug, 2008

1 commit

  • This reverts commit 2b142900784c6e38c8d39fa57d5f95ef08e735d8, since it
    seems to break some other USB storage devices (at least a JMicron USB to
    ATA bridge). As such, while it apparently fixes some cardreaders, it
    would need to be made conditional on the exact reader it fixes in order
    to avoid causing regressions.

    Cc: Alan Jenkins
    Cc: James Bottomley
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

27 Jul, 2008

3 commits

  • The last_sector_bug flag was added to work around a bug in certain usb
    cardreaders, where they would crash if a multiple sector read included the
    last sector. The original implementation avoids this by e.g. splitting an 8
    sector read which includes the last sector into a 7 sector read, and a single
    sector read for the last sector. The flag is enabled for all USB devices.

    This revealed a second bug in other usb cardreaders, which crash when they
    get a multiple sector read which stops 1 sector short of the last sector.
    Affected hardware includes the Kingston "MobileLite" external USB cardreader
    and the internal USB cardreader on the Asus EeePC.

    Extend the last_sector_bug workaround to ensure that any access which touches
    the last 8 hardware sectors of the device is a single sector long. Requests
    are shrunk as necessary to meet this constraint.

    This gives us a safety margin against potential unknown or future bugs
    affecting multi-sector access to the end of the device. The two known bugs
    only affect the last 2 sectors. However, they suggest that these devices
    are prone to fencepost errors and that multi-sector access to the end of the
    device is not well tested. Popular OS's use multi-sector accesses, but they
    rarely read the last few sectors. Linux (with udev & vol_id) automatically
    reads sectors from the end of the device on insertion. It is assumed that
    single sector accesses are more thoroughly tested during development.

    Signed-off-by: Alan Jenkins
    Tested-by: Alan Jenkins
    Signed-off-by: James Bottomley

    Alan Jenkins
     
  • Support for controllers and disks that implement DIF protection
    information:

    - During command preparation the RDPROTECT/WRPROTECT must be set
    correctly if the target has DIF enabled.

    - READ(6) and WRITE(6) are not supported when DIF is on.

    - The controller must be told how to handle the I/O via the
    protection operation field in scsi_cmnd.

    - Refactor the I/O completion code that extracts failed LBA from the
    returned sense data and handle DIF failures correctly.

    - sd_dif.c implements the functions required to prepare and complete
    requests with protection information attached.

    Signed-off-by: Martin K. Petersen
    Signed-off-by: James Bottomley

    Martin K. Petersen
     
  • If a disk is formatted with protection information (Inquiry bit
    PROTECT=1) it is required to support Read Capacity(16). Force use of
    the 16-bit command in this case and extract the P_TYPE field which
    indicates whether the disk is formatted using DIF Type 1, 2 or 3.

    The ATO (App Tag Own) bit in the Control Mode Page indicates whether
    the storage device or the initiator own the contents of the
    DIF application tag.

    Signed-off-by: Martin K. Petersen
    Signed-off-by: James Bottomley

    Martin K. Petersen
     

12 Jul, 2008

2 commits