]> sourceware.org Git - lvm2.git/commitdiff
device: use BLKPBSZGET for physical block size only if the op is available, otherwise...
authorPeter Rajnoha <prajnoha@redhat.com>
Tue, 17 Dec 2013 14:16:25 +0000 (15:16 +0100)
committerPeter Rajnoha <prajnoha@redhat.com>
Tue, 17 Dec 2013 14:17:28 +0000 (15:17 +0100)
Older kernels < 2.6.32 don't have BLKPBSZGET defined.

lib/device/dev-io.c

index 45700e5f1ebfb8b0dc0a4af1a97bdbaab86584a7..766d9af70042ebecaf9b0bae241c5f40b5edf28b 100644 (file)
@@ -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:
This page took 0.0363 seconds and 5 git commands to generate.