ZFS bug: was creating ZIL ignores vfs.zfs.min_auto_ashift, should be ZIL sets improper ashift with AHCI controllers
Borja Marcos
borjam at sarenet.es
Thu Nov 6 14:58:53 UTC 2014
On Nov 6, 2014, at 2:26 PM, Steven Hartland wrote:
> That's not relevant as min when set should override the drives params
There is more to this than it seems, I just found more funny stuff.
MY CONCLUSION IS: when creating a ZIL device, it behaves differently depending on the disk controller. It works with SAS,
and it doesn't work with AHCI.
When using an AHCI controller, ZIL ignores *both* the 4K block quirk and the min_auto_ashift variables. Ashift is fixed to 9. It only
uses a different ashift when using a "nop" device. For example, I have tried with a 4 KB gnop device and this time it used the correct ashift, 12.
When using a SAS controller, ZIL works perfectly with both.
Seems quite odd to me. I am not running exactly the same version on both machines (the one with AHCI controllers is running -STABLE
from three days ago) and the one with the SAS controller is running 10.1-RC4. But the results should be the same.
I've added the relevant quirk to ata_da.c and the SSD is now
properly "quirked":
ada1 at ahcich1 bus 0 scbus1 target 0 lun 0
ada1: <INTEL SSDSA2CT040G3 4PC10362> ATA-8 SATA 2.x device
ada1: Serial Number PEPR408501DV040AGN
ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada1: Command Queueing enabled
ada1: 38166MB (78165360 512 byte sectors: 16H 63S/T 16383C)
ada1: quirks=0x1<4K>
But still something is wrong:
EXAMPLE ONE: AHCI controller, min_auto_ashift with the default value of 9.
The log child, has the wrong ashift, 9, regardless of the 4K quirk.
children[1]:
type: 'disk'
id: 1
guid: 2447450905312007897
path: '/dev/ada1'
phys_path: '/dev/ada1'
whole_disk: 1
metaslab_array: 0
metaslab_shift: 0
ashift: 9
asize: 40015757312
is_log: 1
create_txg: 11741519
EXAMPLE 2: AHCI controller, raise min_auto_ashift to 12
# sysctl vfs.zfs.min_auto_ashift=12
vfs.zfs.min_auto_ashift: 9 -> 12
# zpool add rpool log ada1
And our log child still has the wrong ashift.
children[1]:
type: 'disk'
id: 1
guid: 17598938711972588792
path: '/dev/ada1'
phys_path: '/dev/ada1'
whole_disk: 1
metaslab_array: 0
metaslab_shift: 0
ashift: 9
asize: 40015757312
is_log: 1
create_txg: 11741560
EXAMPLE 3: Doing the same as example one, but using a SAS controller (mps).
I haven't changed the min_auto_ashift.
da3: <ATA Samsung SSD 840 BB0Q> Fixed Direct Access SCSI-6 device
da3: Serial Number S1D9NEADA08568E
da3: 600.000MB/s transfers
da3: Command Queueing enabled
da3: 953869MB (1953525168 512 byte sectors: 255H 63S/T 121601C)
da3: quirks=0x8<4K>
da1: <ATA Samsung SSD 840 BB0Q> Fixed Direct Access SCSI-6 device
da1: Serial Number S1D9NEADA08549F
da1: 600.000MB/s transfers
da1: Command Queueing enabled
da1: 953869MB (1953525168 512 byte sectors: 255H 63S/T 121601C)
da1: quirks=0x8<4K>
da2: <ATA Samsung SSD 840 BB0Q> Fixed Direct Access SCSI-6 device
da2: Serial Number S1D9NEADA08548T
da2: 600.000MB/s transfers
da2: Command Queueing enabled
da2: 953869MB (1953525168 512 byte sectors: 255H 63S/T 121601C)
da2: quirks=0x8<4K>
Now, we create a pool. I did this in two steps in order to reproduce my AHCI more accurately.
# zpool create sample mirror da2 da3
and add a log device
# zpool add sample log da1
And our log device uses the ashift...
children[1]:
type: 'disk'
id: 1
guid: 1327562712929751294
path: '/dev/da1'
phys_path: '/dev/da1'
whole_disk: 1
metaslab_array: 38
metaslab_shift: 33
ashift: 12 <=============== BINGO! 12!!
asize: 1000199946240
is_log: 1
create_txg: 7
EXAMPLE 4: Same hardware as before, but I have compiled a "dequirked" kernel. The Samsung 840 SSD is now
detected with 512 byte sectors.
# sysctl vfs.zfs.min_auto_ashift=12
# zpool create sample da2 da3
# zpool add sample log da1
# zdb
sample:
version: 5000
name: 'sample'
state: 0
txg: 10
pool_guid: 10244789911221894670
hostid: 1065071139
hostname: 'elibm'
vdev_children: 3
vdev_tree:
type: 'root'
id: 0
guid: 10244789911221894670
create_txg: 4
children[0]:
type: 'disk'
id: 0
guid: 147759032286414284
path: '/dev/da2'
phys_path: '/dev/da2'
whole_disk: 1
metaslab_array: 37
metaslab_shift: 33
ashift: 12
asize: 1000199946240
is_log: 0
create_txg: 4
children[1]:
type: 'disk'
id: 1
guid: 2632519121370708463
path: '/dev/da3'
phys_path: '/dev/da3'
whole_disk: 1
metaslab_array: 34
metaslab_shift: 33
ashift: 12
asize: 1000199946240
is_log: 0
create_txg: 4
children[2]:
type: 'disk'
id: 2
guid: 10136980984141171426
path: '/dev/da1'
phys_path: '/dev/da1'
whole_disk: 1
metaslab_array: 39
metaslab_shift: 33
ashift: 12 <========= 12, ashift for the log device
asize: 1000199946240
is_log: 1
create_txg: 8
features_for_read:
com.delphix:hole_birth
com.delphix:embedded_data
root at elibm:~ #
More information about the freebsd-fs
mailing list