Fix 4K sector support
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 26 May 2011 23:48:16 +0000 (16:48 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 27 May 2011 18:38:53 +0000 (11:38 -0700)
commitf74fae8b305ce3b264489e71adb49c2e4e9e33db
tree732bd7a35f33603bfd93b72478808e177372b90f
parent2b8cad61590d38f70ebf8734484204d7da2da937
Fix 4K sector support

Yesterday I ran across a 3TB drive which exposed 4K sectors to
Linux.  While I thought I had gotten this support correct it
turns out there were 2 subtle bugs which prevented it from
working.

  sudo ./cmd/zpool/zpool create -f large-sector /dev/sda
  cannot create 'large-sector': one or more devices is currently unavailable

1) The first issue was that it was possible that bdev_capacity()
would return the number of 512 byte sectors rather than the number
of 4096 sectors.  Internally, certain Linux functions only operate
with 512 byte sectors so you need to be careful.  To avoid any
confusion in the future I've updated bdev_capacity() to simply
return the device (or partition) capacity in bytes.  The higher
levels of ZFS want the value in bytes anyway so this is cleaner.

2) When creating a bio the ->bi_sector count must always be
expressed in 512 byte sectors.  The existing code would scale
the byte offset by the logical sector size.   Until now this was
always 512 so it never caused problems.  Trying a 4K sector drive
clearly exposed the issue.  The problem has been fixed by
hard coding the 512 byte sector which is exactly what the bio
code does internally.

With these changes I'm now able to create ZFS pools using 4K
sector drives.  No issues were observed during fairly extensive
testing.  This is also a low risk change if your using 512b
sectors devices because none of the logic changes.

Closes #256
module/zfs/vdev_disk.c