--- /dev/null
+dnl #
+dnl # 2.6.30 API change
+dnl #
+dnl # The bdev_physical_block_size() interface was added to provide a way
+dnl # to determine the smallest write which can be performed without a
+dnl # read-modify-write operation. From the kernel documentation:
+dnl #
+dnl # What: /sys/block/<disk>/queue/physical_block_size
+dnl # Date: May 2009
+dnl # Contact: Martin K. Petersen <martin.petersen@oracle.com>
+dnl # Description:
+dnl # This is the smallest unit the storage device can write
+dnl # without resorting to read-modify-write operation. It is
+dnl # usually the same as the logical block size but may be
+dnl # bigger. One example is SATA drives with 4KB sectors
+dnl # that expose a 512-byte logical block size to the
+dnl # operating system.
+dnl #
+dnl # Unfortunately, this interface isn't entirely reliable because
+dnl # drives are sometimes known to misreport this value.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_BDEV_PHYSICAL_BLOCK_SIZE], [
+ AC_MSG_CHECKING([whether bdev_physical_block_size() is available])
+ tmp_flags="$EXTRA_KCFLAGS"
+ EXTRA_KCFLAGS="-Wno-unused-but-set-variable"
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/blkdev.h>
+ ],[
+ struct block_device *bdev = NULL;
+ bdev_physical_block_size(bdev);
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_BDEV_PHYSICAL_BLOCK_SIZE, 1,
+ [bdev_physical_block_size() is available])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+ EXTRA_KCFLAGS="$tmp_flags"
+])
ZFS_AC_KERNEL_OPEN_BDEV_EXCLUSIVE
ZFS_AC_KERNEL_INVALIDATE_BDEV_ARGS
ZFS_AC_KERNEL_BDEV_LOGICAL_BLOCK_SIZE
+ ZFS_AC_KERNEL_BDEV_PHYSICAL_BLOCK_SIZE
ZFS_AC_KERNEL_BIO_EMPTY_BARRIER
ZFS_AC_KERNEL_BIO_FAILFAST
ZFS_AC_KERNEL_BIO_FAILFAST_DTD
/*
* 2.6.30 API change
- * Change to make it explicit there this is the logical block size.
+ * To ensure good performance preferentially use the physical block size
+ * for proper alignment. The physical size is supposed to be the internal
+ * sector size used by the device. This is often 4096 byte for AF devices,
+ * while a smaller 512 byte logical size is supported for compatibility.
+ *
+ * Unfortunately, many drives still misreport their physical sector size.
+ * For devices which are known to lie you may need to manually set this
+ * at pool creation time with 'zpool create -o ashift=12 ...'.
+ *
+ * When the physical block size interface isn't available, we fall back to
+ * the logical block size interface and then the older hard sector size.
*/
-#ifdef HAVE_BDEV_LOGICAL_BLOCK_SIZE
-# define vdev_bdev_block_size(bdev) bdev_logical_block_size(bdev)
+#ifdef HAVE_BDEV_PHYSICAL_BLOCK_SIZE
+# define vdev_bdev_block_size(bdev) bdev_physical_block_size(bdev)
#else
-# define vdev_bdev_block_size(bdev) bdev_hardsect_size(bdev)
-#endif
+# ifdef HAVE_BDEV_LOGICAL_BLOCK_SIZE
+# define vdev_bdev_block_size(bdev) bdev_logical_block_size(bdev)
+# else
+# define vdev_bdev_block_size(bdev) bdev_hardsect_size(bdev)
+# endif /* HAVE_BDEV_LOGICAL_BLOCK_SIZE */
+#endif /* HAVE_BDEV_PHYSICAL_BLOCK_SIZE */
/*
* 2.6.37 API change