From: Davidlohr Bueso Date: Wed, 4 Apr 2012 17:01:24 +0000 (+0200) Subject: fdisk: move kernel geometry into blkdev X-Git-Tag: v2.22-rc1~552 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=64128b705c2137706bb7ed3a15d3803509e0a63e;p=thirdparty%2Futil-linux.git fdisk: move kernel geometry into blkdev This is a more generic place for this ioctl. Signed-off-by: Davidlohr Bueso --- diff --git a/fdisk/fdisk.c b/fdisk/fdisk.c index 8893a01749..126efb3782 100644 --- a/fdisk/fdisk.c +++ b/fdisk/fdisk.c @@ -953,19 +953,6 @@ get_topology(int fd) { sector_size, DEFAULT_SECTOR_SIZE); } -static void -get_kernel_geometry(int fd) { -#ifdef HDIO_GETGEO - struct hd_geometry geometry; - - if (!ioctl(fd, HDIO_GETGEO, &geometry)) { - kern_heads = geometry.heads; - kern_sectors = geometry.sectors; - /* never use geometry.cylinders - it is truncated */ - } -#endif -} - static void get_partition_table_geometry(void) { unsigned char *bufp = MBRbuffer; @@ -1057,7 +1044,7 @@ get_geometry(int fd, struct geom *g) { kern_heads = kern_sectors = 0; pt_heads = pt_sectors = 0; - get_kernel_geometry(fd); + blkdev_get_geometry(fd, &kern_heads, &kern_sectors); get_partition_table_geometry(); heads = user_heads ? user_heads : diff --git a/include/blkdev.h b/include/blkdev.h index 6b18879761..56dbce75c9 100644 --- a/include/blkdev.h +++ b/include/blkdev.h @@ -110,4 +110,7 @@ int blkdev_get_physector_size(int fd, int *sector_size); /* is the device cdrom capable? */ int blkdev_is_cdrom(int fd); +/* get device's geometry - legacy */ +int blkdev_get_geometry(int fd, unsigned int *h, unsigned int *s); + #endif /* BLKDEV_H */ diff --git a/lib/blkdev.c b/lib/blkdev.c index c59386d9c3..198669bdab 100644 --- a/lib/blkdev.c +++ b/lib/blkdev.c @@ -263,6 +263,29 @@ int blkdev_is_cdrom(int fd) #endif } +/* + * Get kernel's interpretation of the device's geometry. + * + * Returns the heads and sectors - but not cylinders + * as it's truncated for disks with more than 65535 tracks. + * + * Note that this is deprecated in favor of LBA addressing. + */ +int blkdev_get_geometry(int fd, unsigned int *h, unsigned int *s) +{ +#ifdef HDIO_GETGEO + struct hd_geometry geometry; + + if (!ioctl(fd, HDIO_GETGEO, &geometry)) { + *h = geometry.heads; + *s = geometry.sectors; + } +#else + *h = 0; + *s = 0; +#endif +} + #ifdef TEST_PROGRAM #include #include