On Tue, Oct 21, 2008 at 09:02:57PM +0200, Frans Pop wrote:
> On Tuesday 21 October 2008, Colin Watson wrote:
> > That may be the proximate cause, but at most it's just exposing
> > breakage elsewhere. The actual incorrect code is in libparted itself,
> > not parted_server. It should not be generating "p1"-type device names
> > for LVM logical volumes.
> 
> Problem is that we're this -><- close to a release. If someone wants to 
> investigate the real cause: please do, but it'll have to be fast.
> In absence of a volunteer to do that I would suggest fixing the regression 
> by a revert.

Maybe something like this?

-- 
Colin Watson                                       [EMAIL PROTECTED]
#! /bin/sh /usr/share/dpatch/dpatch-run
## unpartitioned-disks.dpatch by Colin Watson <[EMAIL PROTECTED]>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Don't try to call BLKPG ioctls or tell device-mapper to create
## DP: partitions on disks that can't be partitioned.

@DPATCH@
diff -urNad parted-1.8.8.git.2008.03.24~/libparted/arch/linux.c 
parted-1.8.8.git.2008.03.24/libparted/arch/linux.c
--- parted-1.8.8.git.2008.03.24~/libparted/arch/linux.c 2008-07-10 
02:05:20.000000000 +0100
+++ parted-1.8.8.git.2008.03.24/libparted/arch/linux.c  2008-07-10 
13:51:09.000000000 +0100
@@ -2102,6 +2102,18 @@
 }
 
 static int
+_has_partitions (const PedDisk* disk)
+{
+        PED_ASSERT(disk != NULL, return 0);
+
+        /* Some devices can't be partitioned. */
+        if (!strcmp (disk->type->name, "loop"))
+                return 0;
+
+        return 1;
+}
+
+static int
 _blkpg_part_command (PedDevice* dev, struct blkpg_partition* part, int op)
 {
         LinuxSpecific*          arch_specific = LINUX_SPECIFIC (dev);
@@ -2126,6 +2138,9 @@
         PED_ASSERT(disk->dev->sector_size % PED_SECTOR_SIZE_DEFAULT == 0,
                    return 0);
 
+        if (!_has_partitions (disk))
+                return 0;
+
         if (ped_disk_type_check_feature (disk->type,
                                          PED_DISK_TYPE_PARTITION_NAME))
                 vol_name = ped_partition_get_name (part);
@@ -2174,6 +2189,9 @@
 {
         struct blkpg_partition  linux_part;
 
+        if (!_has_partitions (disk))
+                return 0;
+
         memset (&linux_part, 0, sizeof (linux_part));
         linux_part.pno = n;
         return _blkpg_part_command (disk->dev, &linux_part,
@@ -2351,6 +2369,9 @@
         char*           dev_name = NULL;
         char*           params = NULL;
 
+        if (!_has_partitions(disk))
+                return 0;
+
         dev_name = _device_get_part_path (disk->dev, part->num);
         if (!dev_name)
                 return 0;

Reply via email to