summaryrefslogtreecommitdiffstats
path: root/lib/blkdev.c
diff options
context:
space:
mode:
authorDavidlohr Bueso2011-06-21 04:51:47 +0200
committerKarel Zak2011-06-27 15:57:31 +0200
commit0e75337c31c9e3a963aecd440c8698994464324c (patch)
tree71da5de3abd74a00ead8a295072a0f83d54979e8 /lib/blkdev.c
parentlibmount: minor fixes (diff)
downloadkernel-qcow2-util-linux-0e75337c31c9e3a963aecd440c8698994464324c.tar.gz
kernel-qcow2-util-linux-0e75337c31c9e3a963aecd440c8698994464324c.tar.xz
kernel-qcow2-util-linux-0e75337c31c9e3a963aecd440c8698994464324c.zip
lib: [blkdev.c] add blkdev_get_physector_size()
This function uses the BLKPBSZGET ioctl to get the physical block size of the device. Signed-off-by: Davidlohr Bueso <dave@gnu.org> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'lib/blkdev.c')
-rw-r--r--lib/blkdev.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/lib/blkdev.c b/lib/blkdev.c
index 5cb6554df..b6f9bfd32 100644
--- a/lib/blkdev.c
+++ b/lib/blkdev.c
@@ -204,6 +204,31 @@ blkdev_get_sector_size(int fd, int *sector_size)
#endif
}
+/*
+ * Get physical block device size. The BLKPBSZGET is supported since Linux
+ * 2.6.32. For old kernels is probably the best to assume that physical sector
+ * size is the same as logical sector size.
+ *
+ * Example:
+ *
+ * rc = blkdev_get_physector_size(fd, &physec);
+ * if (rc || physec == 0) {
+ * rc = blkdev_get_sector_size(fd, &physec);
+ * if (rc)
+ * physec = DEFAULT_SECTOR_SIZE;
+ * }
+ */
+int blkdev_get_physector_size(int fd, int *sector_size)
+{
+#ifdef BLKPBSZGET
+ if (ioctl(fd, BLKPBSZGET, &sector_size) >= 0)
+ return 0;
+ return -1;
+#else
+ *sector_size = DEFAULT_SECTOR_SIZE;
+ return 0;
+#endif
+}
/*
* Return the alignment status of a device
@@ -221,6 +246,7 @@ int blkdev_is_misaligned(int fd)
#endif
}
+
#ifdef TEST_PROGRAM
#include <stdio.h>
#include <stdlib.h>
@@ -230,7 +256,7 @@ main(int argc, char **argv)
{
unsigned long long bytes;
unsigned long long sectors;
- int sector_size;
+ int sector_size, phy_sector_size;
int fd;
if (argc != 2) {
@@ -247,10 +273,13 @@ main(int argc, char **argv)
err(EXIT_FAILURE, "blkdev_get_sectors() failed");
if (blkdev_get_sector_size(fd, &sector_size) < 0)
err(EXIT_FAILURE, "blkdev_get_sector_size() failed");
+ if (blkdev_get_physector_size(fd, &phy_sector_size) < 0)
+ err(EXIT_FAILURE, "blkdev_get_physector_size() failed");
- printf("bytes %llu\n", bytes);
- printf("sectors %llu\n", sectors);
- printf("sectorsize %d\n", sector_size);
+ printf(" bytes: %llu\n", bytes);
+ printf(" sectors: %llu\n", sectors);
+ printf(" sector size: %d\n", sector_size);
+ printf("phy-sector size: %d\n", phy_sector_size);
return EXIT_SUCCESS;
}