mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 03:09:34 +03:00
2404b01499
Use the bdev_physical_block_size() interface to determine the minimize write size which can be issued without incurring a read-modify-write operation. This is used to set the ashift correctly to prevent a performance penalty when using AF hard disks. Unfortunately, this interface isn't entirely reliable because it's not uncommon for disks to misreport this value. For this reason you may still need to manually set your ashift with: zpool create -o ashift=12 ... The solution to this in the upstream Illumos source was to add a white list of known offending drives. Maintaining such a list will be a burden, but it still may be worth doing if we can detect a large number of these drives. This should be considered as future work. Reported-by: Richard Yao <ryao@cs.stonybrook.edu> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #916
40 lines
1.5 KiB
Plaintext
40 lines
1.5 KiB
Plaintext
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"
|
|
])
|