On Wed, Nov 05, 2008 at 09:40:27AM +0100, Petr Uzel wrote:
> There's a bug in current development version of parted which causes that the
> partition table, as seen by the kernel, is not updated correctly after
> deleting
> a partition. This bug was introduced in commit
> f6bd20573e3ecfb63f62d88c52a0870fb8851b59 (fix computation of largest partition
> number). Yes, I know - this patch was proposed by me - sorry for that :)
<SNIP>
> Before the broken commit was checked in, parted used PED_MAX(16,
> last_partition_num())
> to determine which partitions might be changed. But this also is not correct,
> because :
> 1. for <= 16 partitions on the disk, the last_partition_num() call is useless
> 2. if there's >16 partitions, the last_partition_num() might return
> inconsistent
> result (in case the last partition was just deleted)
>
> I know that there may be situations where there are more than 16 partitions on
> the disk, but does parted want to support this? If not, the PED_MAX(16,
> last_partition_num())
> might be changed to be just 16 and everything should work fine.
^^^^^^^^
If you decide not to go this way, there will still be the DVH bug
that the broken patch tried to fix. So better fix follows:
First revert the broken commit and one commit that depend on it:
>From cca6449a30db22545a217ac779d1cf60ad6d3e1f Mon Sep 17 00:00:00 2001
From: Petr Uzel <[EMAIL PROTECTED]>
Date: Tue, 4 Nov 2008 15:11:54 +0100
Subject: [PATCH] reverted 1742b051d78493b90bcb801e68a2be0277bcf72f and
f6bd20573e3ecfb63f62d88c52a0870fb8851b59
---
libparted/arch/linux.c | 14 +++-----------
1 files changed, 3 insertions(+), 11 deletions(-)
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 83e24c8..0107dd2 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2247,15 +2247,11 @@ _blkpg_remove_partition (PedDisk* disk, int n)
static int
_disk_sync_part_table (PedDisk* disk)
{
- int largest_partnum = ped_disk_get_last_partition_num (disk);
- if (largest_partnum <= 0)
- return 1;
-
- int last = PED_MIN (largest_partnum, 16);
+ int i;
+ int last = PED_MAX (ped_disk_get_last_partition_num (disk), 16);
int* rets = ped_malloc(sizeof(int) * last);
int* errnums = ped_malloc(sizeof(int) * last);
int ret = 1;
- int i;
for (i = 1; i <= last; i++) {
rets[i - 1] = _blkpg_remove_partition (disk, i);
@@ -2473,12 +2469,8 @@ err:
static int
_dm_reread_part_table (PedDisk* disk)
{
- int largest_partnum = ped_disk_get_last_partition_num (disk);
- if (largest_partnum <= 0)
- return 1;
-
int rc = 1;
- int last = PED_MIN (largest_partnum, 16);
+ int last = PED_MAX (ped_disk_get_last_partition_num (disk), 16);
int i;
sync();
--
1.6.0.2
The fix itself. I believe that the comment in the patch describes
sufficiently what it does.
>From cd27f73beb0c8d2aa7f28597ec4bf4f990f3b48f Mon Sep 17 00:00:00 2001
From: Petr Uzel <[EMAIL PROTECTED]>
Date: Thu, 6 Nov 2008 16:26:59 +0100
Subject: [PATCH] DVH: do not inform kernel/DM about directory entries
---
libparted/arch/linux.c | 20 ++++++++++++++++++--
1 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 0107dd2..041208a 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2248,7 +2248,15 @@ static int
_disk_sync_part_table (PedDisk* disk)
{
int i;
- int last = PED_MAX (ped_disk_get_last_partition_num (disk), 16);
+ int last;
+
+ /* parted treats DVH directory entries as logical partitions with
number > 16;
+ * we don't want to inform kernel about directory entries
+ */
+ if (strcmp (disk->type->name, "dvh") == 0)
+ last = 16;
+ else
+ last = PED_MAX (ped_disk_get_last_partition_num (disk), 16);
int* rets = ped_malloc(sizeof(int) * last);
int* errnums = ped_malloc(sizeof(int) * last);
int ret = 1;
@@ -2470,8 +2478,16 @@ static int
_dm_reread_part_table (PedDisk* disk)
{
int rc = 1;
- int last = PED_MAX (ped_disk_get_last_partition_num (disk), 16);
int i;
+ int last;
+
+ /* parted treats DVH directory entries as partitions logical with
number > 16;
+ * we don't want to inform kernel about directory entries
+ */
+ if (strcmp (disk->type->name, "dvh") == 0)
+ last = 16;
+ else
+ last = PED_MAX (ped_disk_get_last_partition_num (disk), 16);
sync();
if (!_dm_remove_parts(disk->dev))
--
1.6.0.2
--
Best regards / s pozdravem
Petr Uzel, Packages maintainer
---------------------------------------------------------------------
SUSE LINUX, s.r.o. e-mail: [EMAIL PROTECTED]
Lihovarská 1060/12 tel: +420 284 028 964
190 00 Prague 9 fax: +420 284 028 951
Czech Republic http://www.suse.cz
_______________________________________________
parted-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/parted-devel