Phillip Susi wrote:
> From: Phillip Susi <[email protected]>
> Description: All partitions on dmraid disks and partition numbers
>  >= 16 on regular scsi disks were not being detected as in use.
>  This was because assumptions were being made about the dev node
>  major/minor numbers and how they relate to the partition number.
>  These assumptions break entirely on dmraid devices, and on normal
>  disks with >= 16 partitions.  Removed _partition_get_part_dev()
>  and rewrote _partition_is_mounted() to use
>  _partition_is_mounted_by_path() instead of _by_dev.

Thanks for the patch.

I've squashed the following mostly-syntactic changes
into your patch, rewrote the commit log
and will wait for your ACK before pushing.

I also wrote a test and added a NEWS entry, which I'll post separately.

diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 727862a..b56ce2b 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2281,21 +2281,19 @@ _partition_is_mounted_by_path (const char *path)
         return _partition_is_mounted_by_dev (part_stat.st_rdev);
 }

+/* If partition PART is mounted, or if we encounter an out-of-memory error
+   while trying to determine its status, return 1.  Otherwise, return 0.  */
 static int
 _partition_is_mounted (const PedPartition *part)
 {
-       char *part_name;
-       int status;
-        if (!ped_partition_is_active (part))
-                return 0;
-       part_name = _device_get_part_path (part->disk->dev, part->num);
+       if (!ped_partition_is_active (part))
+               return 0;
+       char *part_name = _device_get_part_path (part->disk->dev, part->num);
        if (!part_name)
                return 1;
-        status = _partition_is_mounted_by_path (part_name);
+       int status = _partition_is_mounted_by_path (part_name);
        free (part_name);
-       if (status)
-               return 1;
-       return 0;
+       return !!status;
 }

 static int

Here's the result:

>From 2e94d621dabc1655277b0b6acee09c0824510d3b Mon Sep 17 00:00:00 2001
From: Phillip Susi <[email protected]>
Date: Tue, 10 May 2011 12:00:10 +0200
Subject: [PATCH] linux: also detect "in-use" dmraid and scsi-Nth (N>=16)
 partitions

Prior to this change, Parted would fail to detect any in-use
partition on a dmraid disk, as well as any in-use partition
numbered 16 or greater on a regular scsi disk.
This was because assumptions were being made about the device node
major/minor numbers and how they relate to the partition number.
These assumptions are invalid for dmraid devices, and for normal
disks with >= 16 partitions.
* libparted/arch/linux.c (_partition_get_part_dev): Remove function.
(_partition_is_mounted): Rewrite to use _partition_is_mounted_by_path
instead of _by_dev.
---
 libparted/arch/linux.c |   30 ++++++++++--------------------
 1 files changed, 10 insertions(+), 20 deletions(-)

diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index c108f5a..b56ce2b 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2238,19 +2238,6 @@ linux_partition_get_path (const PedPartition* part)
         return _device_get_part_path (part->disk->dev, part->num);
 }

-static dev_t
-_partition_get_part_dev (const PedPartition* part)
-{
-        struct stat dev_stat;
-        int dev_major, dev_minor;
-
-        if (stat (part->disk->dev->path, &dev_stat))
-                return (dev_t)0;
-        dev_major = major (dev_stat.st_rdev);
-        dev_minor = minor (dev_stat.st_rdev);
-        return (dev_t)makedev (dev_major, dev_minor + part->num);
-}
-
 static int
 _mount_table_search (const char* file_name, dev_t dev)
 {
@@ -2294,16 +2281,19 @@ _partition_is_mounted_by_path (const char *path)
         return _partition_is_mounted_by_dev (part_stat.st_rdev);
 }

+/* If partition PART is mounted, or if we encounter an out-of-memory error
+   while trying to determine its status, return 1.  Otherwise, return 0.  */
 static int
 _partition_is_mounted (const PedPartition *part)
 {
-        dev_t dev;
-        if (!ped_partition_is_active (part))
-                return 0;
-        dev = _partition_get_part_dev (part);
-        if (!dev)
-                return 0;
-        return _partition_is_mounted_by_dev (dev);
+       if (!ped_partition_is_active (part))
+               return 0;
+       char *part_name = _device_get_part_path (part->disk->dev, part->num);
+       if (!part_name)
+               return 1;
+       int status = _partition_is_mounted_by_path (part_name);
+       free (part_name);
+       return !!status;
 }

 static int
--
1.7.5.1.354.g761178

_______________________________________________
parted-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/parted-devel

Reply via email to