[parted-devel] [PATCH 3/5] libparted: avoid the HDIO_GETGEO ioctl when possible

Jim Meyering jim at meyering.net
Thu Jan 5 19:50:55 UTC 2012


Jim Meyering wrote:
> Phillip Susi wrote:
>> We were using the long depreciated HDIO_GETGEO ioctl on the partition
>> to get its start sector.  Get the partition start and length from sysfs
>> instead.  If this fails, fall back to using BLKGETSIZE64 and HDIO_GETGEO
>> as a last resort.
>>
>> This allows the blkpg code introduced last year to manipulate
>> other partitions on a disk where one ( or more ) are in use to work
>> correctly on disks > 2TB and partitioned loop devices, which
>> don't support HDIO_GETGEO.  It also fixes the blkpg code to work on disks
>> with non 512 byte sectors ( this has been causing test suite failures ).
>
> Thank you for this patch, and for your patience.
>
> I've amended it with the following changes.
> Most are stylistic or for consistency, but there were three
> semantic changes:
>   - remove an always-true if (fd == -1) test
>   - adjust a misleadingly formatted "else" statement
>   - correct a diagnostic: s/size/start/

Whoops.
I pushed the wrong patch.  Sorry about that.
This fixes it:

>From b6ef0215a241e59ddcd14d5a2f85ac3243bd465d Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at redhat.com>
Date: Thu, 5 Jan 2012 20:48:19 +0100
Subject: [PATCH] libparted: remove _blkpg_get_partition

[I applied Phillip's initial patch, omitting both my adjustments
and his own v2 changes.  This addresses both of those omissions. ]
* libparted/arch/linux.c (_blkpg_get_partition): Remove function
and sole use, per patch from Phillip Susi.
(_kernel_get_partition_start_and_length): Adjust formatting,
remove unnecessary test and correct a diagnostic.
---
 libparted/arch/linux.c |   48 ++++++++++++------------------------------------
 1 files changed, 12 insertions(+), 36 deletions(-)

diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 6d7fc56..e2c4139 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2410,24 +2410,6 @@ _blkpg_remove_partition (PedDisk* disk, int n)
                                     BLKPG_DEL_PARTITION);
 }

-#ifdef BLKPG_GET_PARTITION
-static int
-_blkpg_get_partition (PedPartition *part, long long *start, long long *length)
-{
-        struct blkpg_partition  linux_part;
-
-        memset (&linux_part, 0, sizeof (linux_part));
-        linux_part.pno = part->num;
-        if (_blkpg_part_command (part->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. */
@@ -2456,7 +2438,7 @@ _sysfs_int_entry_from_dev(PedDevice const* dev, const char *entry, int *val)
    Upon success, return true. Otherwise, return false. */
 static bool
 _sysfs_ull_entry_from_part(PedPartition const* part, const char *entry,
-			   unsigned long long *val)
+                           unsigned long long *val)
 {
         char path[128];
         char *part_name = linux_partition_get_path(part);
@@ -2487,28 +2469,18 @@ _sysfs_ull_entry_from_part(PedPartition const* part, const char *entry,
    return false. */
 static bool
 _kernel_get_partition_start_and_length(PedPartition const *part,
-				       unsigned long long *start,
-                                      unsigned long long *length)
+                                       unsigned long long *start,
+                                       unsigned long long *length)
 {
-        int fd = -1;
-        int ok;
         PED_ASSERT(part);
         PED_ASSERT(start);
         PED_ASSERT(length);

-#ifdef BLKPG_GET_PARTITION
-        ok = _blkpg_get_partition (part, start, length);
-        if (ok) {
-                *length = (*length * 512) / part->disk->dev->sector_size;
-                *start = (*start * 512) / part->disk->dev->sector_size;
-                return ok;
-        }
-#endif
         char *dev_name = linux_partition_get_path (part);
         if (!dev_name)
                 return false;

-        ok = _sysfs_ull_entry_from_part (part, "start", start);
+        int ok = _sysfs_ull_entry_from_part (part, "start", start);
         if (!ok) {
                 struct hd_geometry geom;
                 int dev_fd = open (dev_name, O_RDONLY);
@@ -2524,12 +2496,16 @@ _kernel_get_partition_start_and_length(PedPartition const *part,
         }
         *start = (*start * 512) / part->disk->dev->sector_size;
         ok = _sysfs_ull_entry_from_part (part, "size", length);
+
+        int fd;
         if (!ok) {
-                if (fd == -1)
-                        fd = open (dev_name, O_RDONLY);
+                fd = open (dev_name, O_RDONLY);
                 if (fd != -1 && ioctl (fd, BLKGETSIZE64, length))
                         ok = true;
-        } else *length *= 512;
+        } else {
+                fd = -1;
+                *length *= 512;
+        }
         *length /= part->disk->dev->sector_size;
         if (fd != -1)
                 close (fd);
@@ -2538,7 +2514,7 @@ _kernel_get_partition_start_and_length(PedPartition const *part,
                 ped_exception_throw (
                         PED_EXCEPTION_BUG,
                         PED_EXCEPTION_CANCEL,
-                        _("Unable to determine the size and length of %s."),
+                        _("Unable to determine the start and length of %s."),
                         dev_name);
         free (dev_name);
         return ok;
-- 
1.7.8.2.334.gd4e886



More information about the parted-devel mailing list