• Luben Tuikov's avatar
    [SCSI] Retrieve the Caching mode page (version 2) · 0bcaa111
    Luben Tuikov authored
    Some kernel transport drivers unconditionally disable
    retrieval of the Caching mode page. One such for example is
    the BBB/CBI transport over USB. Such a restraint is too
    harsh as some devices do support the Caching mode
    page. Unconditionally enabling the retrieval of this mode
    page over those transports at their transport code level may
    result in some devices failing and becoming unusable.
    
    This patch implements a method of retrieving the Caching
    mode page without unconditionally enabling it in the
    transports which unconditionally disable it. The idea is to
    ask for all supported pages, page code 0x3F, and then search
    for the Caching mode page in the mode parameter data
    returned. The sd driver already asks for all the mode pages
    supported by the attached device by setting the page code to
    0x3F in order to find out if the media is write protected by
    reading the WP bit in the Device Specific Parameter
    field. It then attempts to retrieve only the Caching mode
    page by setting the page code to 8 and actually attempting
    to retrieve it if and only if the transport allows it.
    
    The method implemented here is that if the transport doesn't
    allow retrieval of the Caching mode page and the device is
    not RBC, then we ask for all pages supported by setting the
    page code to 0x3F (similarly to how the WP bit is retrieved
    above), and then we search for the Caching mode page in the
    mode parameter data returned.
    
    With this patch, devices over SATA, report this (no change):
    
    Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] 976773168 512-byte logical blocks: (500 GB/465 GiB)
    Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: Attached scsi generic sg0 type 0
    Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] Write Protect is off
    Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
    Oct 22 18:45:58 localhost kernel: sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
    
    Smart devices report their Caching mode page. This is a
    change where we'd previously see the kernel making
    assumption about the device's cache being write-through:
    
    Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: Attached scsi generic sg2 type 0
    Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] 610472646 4096-byte logical blocks: (2.50 TB/2.27 TiB)
    Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] Write Protect is off
    Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] Mode Sense: 47 00 10 08
    Oct 22 18:45:58 localhost kernel: sd 6:0:0:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
    
    And "dumb" devices over BBB, are correctly shown not to
    support reporting the Caching mode page:
    
    Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] 15663104 512-byte logical blocks: (8.01 GB/7.46 GiB)
    Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] Write Protect is off
    Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] Mode Sense: 23 00 00 00
    Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] No Caching mode page present
    Oct 22 18:49:06 localhost kernel: sd 7:0:0:0: [sdc] Assuming drive cache: write through
    
    Version 2 adds this:
    
    Some devices don't support page code 0x3F, and others require a
    fixed transfer length of 192 bytes. This single commit includes a
    patch by Alan Stern which fixes this.
    Reported-and-tested-by: default avatarRichard Senior <richard@r-senior.demon.co.uk>
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarLuben Tuikov <ltuikov@yahoo.com>
    Signed-off-by: default avatarJames Bottomley <jbottomley@parallels.com>
    0bcaa111
sd.c 75.6 KB