We were using the long depreciated HDIO_GETGEO ioctl on the
partition to get its start sector.  Use the new BLKPG_GET_PARTITION
ioctl instead.  This allows for disks > 2TB and partitioned loop
devices, which don't support HDIO_GETGEO.

This only removes one instance of the HDIO_GETGEO call in the
partition table sync path that handles in use partitions.  The
other users of this ioctl still need updated.

Signed-off-by: Phillip Susi <[email protected]>
---
 libparted/arch/linux.c |   41 ++++++++++++++++++++++++++++++++++++-----
 1 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 3799b9d..6152906 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2410,6 +2410,25 @@ _blkpg_remove_partition (PedDisk* disk, int n)
                                     BLKPG_DEL_PARTITION);
 }
 
+#ifdef BLKPG_GET_PARTITION
+static int
+_blkpg_get_partition (PedDisk* disk, int n, long long *start, long long 
*length)
+{
+        struct blkpg_partition  linux_part;
+       int ret;
+
+        memset (&linux_part, 0, sizeof (linux_part));
+        linux_part.pno = n;
+        if (_blkpg_part_command (disk->dev, &linux_part,
+                                BLKPG_GET_PARTITION))
+       {
+               *start = linux_part.start;
+               *length = linux_part.length;
+               return 1;
+       } else return 0;
+}
+#endif
+
 /* Read the integer from /sys/block/DEV_BASE/ENTRY and set *VAL
    to that value, where DEV_BASE is the last component of DEV->path.
    Upon success, return true.  Otherwise, return false. */
@@ -2519,30 +2538,42 @@ _disk_sync_part_table (PedDisk* disk)
                 const PedPartition *part = ped_disk_get_partition (disk, i);
                 if (part) {
                         if (!ok[i - 1] && errnums[i - 1] == EBUSY) {
-                                struct hd_geometry geom;
-                                unsigned long long length = 0;
-                                /* get start and length of existing partition 
*/
+                                unsigned long long length;
+                               unsigned long long start;
                                 char *dev_name = _device_get_part_path 
(disk->dev, i);
                                 if (!dev_name)
                                         goto cleanup;
+                                /* get start and length of existing partition 
*/
+#ifdef BLKPG_GET_PARTITION
+                               if (!_blkpg_get_partition(disk, i, &start, 
&length)) {
+#else
+                                struct hd_geometry geom;
                                 int fd = open (dev_name, O_RDONLY);
                                 if (fd == -1
                                    || ioctl (fd, HDIO_GETGEO, &geom)
                                    || ioctl (fd, BLKGETSIZE64, &length)) {
+#endif
                                         ped_exception_throw (
                                                              PED_EXCEPTION_BUG,
                                                              
PED_EXCEPTION_CANCEL,
                            _("Unable to determine the size and length of %s."),
                                                              dev_name);
+#ifndef BLKPG_GET_PARTITION
                                         if (fd != -1)
                                                 close (fd);
                                         free (dev_name);
+#endif
                                         goto cleanup;
                                 }
+#ifdef BLKPG_GET_PARTITION
+                               start /= disk->dev->sector_size;
+#else
                                 free (dev_name);
-                                length /= disk->dev->sector_size;
                                 close (fd);
-                                if (geom.start == part->geom.start
+                               start = geom.start;
+#endif
+                                length /= disk->dev->sector_size;
+                                if (start == part->geom.start
                                    && length == part->geom.length)
                                         ok[i - 1] = 1;
                                 /* If the new partition is unchanged and the
-- 
1.7.5.4


Reply via email to