Feature #2665

sd.conf should be able to override physical-block-size

Added by George Wilson almost 2 years ago. Updated 30 days ago.

Status:Feedback Start date:2012-05-01
Priority:Normal Due date:
Assignee:George Wilson % Done:

0%

Category:driver - device drivers Spent time: -
Target version:-
Difficulty:Medium Tags:needs-triage

Description

PSARC 2008/769 advertised the ability to override the physical-block-size by using the sd-config-list. Unfortunately this portion of the project was not implemented. This feature proposes to implement this missing functionality. This would allow administrators to update sd.conf by adding a simple VID/PID tuple in the sd-config-list. An example would look like this:

sd.conf:

sd-config-list = "DGC     RAID", "physical-block-size:4096";

The format of the VID/PID tuple uses the following format:

"012345670123456789012345" 
"|-VID--||-----PID------|" 

This example overrides the physical-block-size for all DGC RAID devices to use 4K. ZFS would be able to consume this value to determine the proper ashift value for its vdevs.


Related issues

related to illumos gate - Bug #3220: noncompliant devices break sd-config-list New 2012-09-24
related to illumos gate - Bug #453: ZPOOL_CONFIG_ASHIFT not set correctly for drives with lar... Feedback 2010-12-06

History

Updated by Eric Schrock almost 2 years ago

  • Status changed from New to Resolved

changeset: 13680:2bd022a765e2
tag: tip
user: George Wilson <>
date: Thu May 03 05:49:19 2012 -0700

description:
2665 sd.conf should be able to override physical-block-size
2671 zpool import should not fail if vdev ashift has increased
Reviewed by: Adam Leventhal <>
Reviewed by: Eric Schrock <>
Reviewed by: Richard Elling <>
Reviewed by: Gordon Ross <>
Reviewed by: Garrett D'Amore <>
Approved by: Richard Lowe <>

modified:
usr/src/cmd/zpool/zpool_main.c
usr/src/uts/common/fs/zfs/vdev.c
usr/src/uts/common/io/scsi/targets/sd.c

Updated by Albert Lee over 1 year ago

For future reference, this command can be used to retrieve the vendor and product ID strings for all sd devices:

echo "::walk sd_state | ::grep '.!=0' | ::print struct sd_lun un_sd | ::print struct \\
 scsi_device sd_inq | ::print struct scsi_inquiry inq_vid inq_pid" | mdb -k

Updated by Albert Lee about 1 year ago

Remember, you need to pad the vendor, product string to the length shown with spaces.

Padding is actually not necessary. Extra spaces (not tabs!) are ignored.

Asterisks have special meaning if they appear at the beginning and end of the ID string only. sd searches the product ID (not the vendor ID) for the substring enclosed by asterisks.
Examples:
  • "*ST9320*" will match any vendor ID and product ID "ST9320423AS".
  • "**" will match any vendor ID and product ID.

Updated by Jens Elkner about 1 year ago

Albert Lee wrote:

... command can be used to retrieve the vendor and product ID strings for all sd devices ...

http://iws.cs.uni-magdeburg.de/~elkner/s11/etc/sdprops.sh may also help to check/lookup current settings.

NOTE: As usual the script requires {man,log}.kshlib from http://iws.cs.uni-magdeburg.de/~elkner/s11/etc/ to be in the same dir or anywhere else in the $PATH

Updated by Jose Mestre 30 days ago

  • Status changed from Resolved to Feedback

Hi,

I'm currently using a Gigabyte motherboard with 2 LSI HBA SAS/SATA cards (LSI SAS 3041E-R).

I'm using 2TB hard drives WD20EARX and WD20EFRX
I tweaked sd.conf, and when I create a pool, ashift is set to 12 when the drives are connected to the Z68 SATA connectors, but not when connected to the HBA.

The first entry is an SDD with the OS, the next 4 are connected to the Z68 chipset, and all the others connected to 2 LSI HBA.
2 disks are currently not used on my ZFS pool, they are spares

# echo ::sd_state |mdb -k | grep phy_blocksize                                                                             
    un_phy_blocksize = 0x200
    un_phy_blocksize = 0x1000
    un_phy_blocksize = 0x1000
    un_phy_blocksize = 0x1000
    un_phy_blocksize = 0x1000
    un_phy_blocksize = 0x200
    un_phy_blocksize = 0x200
    un_phy_blocksize = 0x200
    un_phy_blocksize = 0x200
    un_phy_blocksize = 0x200
    un_phy_blocksize = 0x200
    un_phy_blocksize = 0x200

# echo "::walk sd_state | ::grep '.!=0' | ::print struct sd_lun un_sd | ::print struct scsi_device sd_inq | ::print struct scsi_inquiry inq_vid inq_pid" | mdb -k
inq_vid = [ "ATA     " ]
inq_pid = [ "Corsair Force 3 " ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EARX-00P" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EARX-00P" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EARX-00P" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EARX-00P" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EARX-00P" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EARX-00P" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EARX-00P" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EZRX-00D" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EZRX-00D" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EZRX-00D" ]
inq_vid = [ "ATA     " ]
inq_pid = [ "WDC WD20EZRX-00D" ]

# echo '::spa -c' | mdb -k | grep 'devid'
                devid='id1,sd@SATA_____WDC_WD20EARX-00P_____WD-WMAZA7992741/a'
                devid='id1,sd@SATA_____WDC_WD20EARX-00P_____WD-WCAZAD087469/a'
                devid='id1,sd@SATA_____WDC_WD20EARX-00P_____WD-WMAZA7958395/a'
                devid='id1,sd@SATA_____WDC_WD20EARX-00P_____WD-WMAZA7958380/a'
                devid='id1,sd@n50014ee206d094a5/a'
                devid='id1,sd@n50014ee25c259da5/a'
                devid='id1,sd@n50014ee25ed12ec7/a'
                devid='id1,sd@n50014ee25ed1774e/a'
                devid='id1,sd@n50014ee2097c05d8/a'
            devid='id1,sd@SATA_____Corsair_Force_3_122779100000148602E1/a'

# cfgadm -al
Ap_Id                          Type         Receptacle   Occupant     Condition
c6                             scsi-sas     connected    configured   unknown
c6::dsk/c6t0d0                 disk         connected    configured   unknown
c6::dsk/c6t1d0                 disk         connected    configured   unknown
c6::dsk/c6t2d0                 disk         connected    configured   unknown
c8                             scsi-sas     connected    configured   unknown
c8::dsk/c8t0d0                 disk         connected    configured   unknown
c8::dsk/c8t1d0                 disk         connected    configured   unknown
c8::dsk/c8t2d0                 disk         connected    configured   unknown
c8::dsk/c8t3d0                 disk         connected    configured   unknown
sata2/0::dsk/c1t0d0            disk         connected    configured   ok
sata2/1                        sata-port    empty        unconfigured ok
sata2/2::dsk/c1t2d0            disk         connected    configured   ok
sata2/3::dsk/c1t3d0            disk         connected    configured   ok
sata2/4::dsk/c1t4d0            disk         connected    configured   ok
sata2/5::dsk/c1t5d0            disk         connected    configured   ok

# grep -v '#' /kernel/drv/sd.conf

name="sd" class="scsi" target=0 lun=0;
name="sd" class="scsi" target=1 lun=0;
name="sd" class="scsi" target=2 lun=0;
name="sd" class="scsi" target=3 lun=0;
name="sd" class="scsi" target=4 lun=0;
name="sd" class="scsi" target=5 lun=0;
name="sd" class="scsi" target=6 lun=0;
name="sd" class="scsi" target=7 lun=0;
name="sd" class="scsi" target=8 lun=0;
name="sd" class="scsi" target=9 lun=0;
name="sd" class="scsi" target=10 lun=0;
name="sd" class="scsi" target=11 lun=0;
name="sd" class="scsi" target=12 lun=0;
name="sd" class="scsi" target=13 lun=0;
name="sd" class="scsi" target=14 lun=0;
name="sd" class="scsi" target=15 lun=0;

name="sd" class="scsi-self-identifying";

ddi-devid-registrant=1;

sd-config-list =
        "ATA     WDC WD20EARX-00P", "physical-block-size:4096",
        "ATA     WDC*", "physical-block-size:4096",
        "ATA     WDC WD20EZRX-00D", "physical-block-size:4096";

I tried with and without this line: "ATA WDC*", "physical-block-size:4096"

I'm currently using a modified zpool binary to forece ashift as mentioned here : https://www.illumos.org/issues/453#note-3

Also available in: Atom PDF