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>
This commit is contained in:
parent
5dfc984392
commit
0e75337c31
|
@ -95,4 +95,7 @@ int blkdev_get_sector_size(int fd, int *sector_size);
|
||||||
/* specifies whether or not the device is misaligned */
|
/* specifies whether or not the device is misaligned */
|
||||||
int blkdev_is_misaligned(int fd);
|
int blkdev_is_misaligned(int fd);
|
||||||
|
|
||||||
|
/* get physical block device size */
|
||||||
|
int blkdev_get_physector_size(int fd, int *sector_size);
|
||||||
|
|
||||||
#endif /* BLKDEV_H */
|
#endif /* BLKDEV_H */
|
||||||
|
|
37
lib/blkdev.c
37
lib/blkdev.c
|
@ -204,6 +204,31 @@ blkdev_get_sector_size(int fd, int *sector_size)
|
||||||
#endif
|
#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
|
* Return the alignment status of a device
|
||||||
|
@ -221,6 +246,7 @@ int blkdev_is_misaligned(int fd)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef TEST_PROGRAM
|
#ifdef TEST_PROGRAM
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -230,7 +256,7 @@ main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
unsigned long long bytes;
|
unsigned long long bytes;
|
||||||
unsigned long long sectors;
|
unsigned long long sectors;
|
||||||
int sector_size;
|
int sector_size, phy_sector_size;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
|
@ -247,10 +273,13 @@ main(int argc, char **argv)
|
||||||
err(EXIT_FAILURE, "blkdev_get_sectors() failed");
|
err(EXIT_FAILURE, "blkdev_get_sectors() failed");
|
||||||
if (blkdev_get_sector_size(fd, §or_size) < 0)
|
if (blkdev_get_sector_size(fd, §or_size) < 0)
|
||||||
err(EXIT_FAILURE, "blkdev_get_sector_size() failed");
|
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(" bytes: %llu\n", bytes);
|
||||||
printf("sectors %llu\n", sectors);
|
printf(" sectors: %llu\n", sectors);
|
||||||
printf("sectorsize %d\n", sector_size);
|
printf(" sector size: %d\n", sector_size);
|
||||||
|
printf("phy-sector size: %d\n", phy_sector_size);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue