From 0e75337c31c9e3a963aecd440c8698994464324c Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Mon, 20 Jun 2011 22:51:47 -0400 Subject: 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 Signed-off-by: Karel Zak --- lib/blkdev.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'lib/blkdev.c') 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, §or_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 #include @@ -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, §or_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; } -- cgit v1.2.3-55-g7522