[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[lvm-devel] master - device: use BLKPBSZGET for physical block size only if the op is available, otherwise use logical block size



Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=3652083f38ca21276c8467f54eeaa8f1365ec6fe
Commit:        3652083f38ca21276c8467f54eeaa8f1365ec6fe
Parent:        24639be558a9d4561a34f2b76485b227aed8e9c3
Author:        Peter Rajnoha <prajnoha redhat com>
AuthorDate:    Tue Dec 17 15:16:25 2013 +0100
Committer:     Peter Rajnoha <prajnoha redhat com>
CommitterDate: Tue Dec 17 15:17:28 2013 +0100

device: use BLKPBSZGET for physical block size only if the op is available, otherwise use logical block size

Older kernels < 2.6.32 don't have BLKPBSZGET defined.
---
 lib/device/dev-io.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
index 45700e5..766d9af 100644
--- a/lib/device/dev-io.c
+++ b/lib/device/dev-io.c
@@ -136,15 +136,6 @@ 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_devs("%s: physical block size is %u bytes", name, dev->phys_block_size);
-	}
-
 	if (dev->block_size == -1) {
 		if (ioctl(dev_fd(dev), BLKBSZGET, &dev->block_size) < 0) {
 			log_sys_error("ioctl BLKBSZGET", name);
@@ -154,6 +145,22 @@ int dev_get_block_size(struct device *dev, unsigned int *physical_block_size, un
 		log_debug_devs("%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_devs("%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_devs("%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:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]