diff options
author | Davidlohr Bueso | 2011-06-21 04:51:47 +0200 |
---|---|---|
committer | Karel Zak | 2011-06-27 15:57:31 +0200 |
commit | 0e75337c31c9e3a963aecd440c8698994464324c (patch) | |
tree | 71da5de3abd74a00ead8a295072a0f83d54979e8 /lib/blkdev.c | |
parent | libmount: minor fixes (diff) | |
download | kernel-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.c | 37 |
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, §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 <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, §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; } |