File device-use-BLKPBSZGET-for-physical-block-size.patch of Package lvm2.1005
From 0ee0f1b9c1ee55c745a78302cdd0f8d93680e318 Mon Sep 17 00:00:00 2001
From: Liuhua Wang <lwang@suse.com>
Date: Mon, 2 Nov 2015 13:48:17 +0800
Subject: [PATCH] device: use BLKPBSZGET for physical block size only if the op
is available, otherwise use logical block size
Upstream-commit: 3652083f38ca21276c8467f54eeaa8f1365ec6fe
---
lib/device/dev-io.c | 28 ++++++++++++++++++----------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
index 1f88d9e..3b0d32e 100644
--- a/lib/device/dev-io.c
+++ b/lib/device/dev-io.c
@@ -137,16 +137,7 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un
if (needs_open && !dev_open_readonly(dev))
return_0;
- if (dev->phys_block_size == -1) {
- if (ioctl(dev_fd(dev), BLKPBSZGET, &dev->phys_block_size) < 0) {
- log_sys_error("ioctl BLKPBSZGET", name);
- r = 0;
- goto out;
- }
- log_debug("%s: physical block size is %u bytes", name, dev->phys_block_size);
- }
-
- if (dev->block_size == -1) {
+ if (dev->block_size == -1) {
if (ioctl(dev_fd(dev), BLKBSZGET, &dev->block_size) < 0) {
log_sys_error("ioctl BLKBSZGET", name);
r = 0;
@@ -155,6 +146,23 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un
log_debug("%s: block size is %u bytes", name, dev->block_size);
}
+#ifdef BLKPBSZGET
+ /* BLKPBSZGET is available in kernel >= 2.6.32 only */
+ if (dev->phys_block_size == -1) {
+ if (ioctl(dev_fd(dev), BLKPBSZGET, &dev->phys_block_size) < 0) {
+ log_sys_error("ioctl BLKPBSZGET", name);
+ r = 0;
+ goto out;
+ }
+ log_debug("%s: physical block size is %u bytes", name, dev->phys_block_size);
+ }
+#else
+ /* if we can't get physical block size, just use logical block size instead */
+ dev->phys_block_size = dev->block_size;
+ log_debug("%s: physical block size can't be determined, using logical "
+ "block size of %u bytes instead", name, dev->phys_block_size);
+#endif
+
*physical_block_size = (unsigned int) dev->phys_block_size;
*block_size = (unsigned int) dev->block_size;
out:
--
1.8.4.5