[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#16231: [PATCH 4/9] libparted: fix loop labels to not vanish
From: |
Phillip Susi |
Subject: |
bug#16231: [PATCH 4/9] libparted: fix loop labels to not vanish |
Date: |
Fri, 2 May 2014 21:50:46 -0400 |
The loop label type was using the existence of a partition as a proxy for
a filesystem being detected, and loop_write() would try to write a loop
signature if there was no filesystem, and erase it if there was. Because
of this, creating a partition without writing a filesystem to it caused
loop_write to erase the loop label.
There seems to be no reason to bother erasing the loop label if it is still
present along with a filesystem signature, so don't bother with this, and
actually check to see if a filesystem is detected in the partition rather
than using the existence of a partition to decide if writing the loop
signature is needed. Finally, since there is no way to preserve the
existence of a partition with no filesystem in it, have loop_read() always
create a partition, even if no filesystem is detected.
---
NEWS | 6 ++++++
libparted/labels/loop.c | 53 ++++++++++++++++++++++---------------------------
2 files changed, 30 insertions(+), 29 deletions(-)
diff --git a/NEWS b/NEWS
index 093314b..36536e2 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,9 @@ GNU parted NEWS -*-
outline -*-
** Bug Fixes
+ libparted: fix loop labels to not vanish if you don't create
+ a filesystem, and to not return an error syncing when you do.
+
libparted: remove all old partitions, even if new label does not allow
as many.
@@ -110,6 +113,9 @@ GNU parted NEWS -*-
outline -*-
** Changes in behavior
+ When creating a loop label, it automatically comes with a partition
+ using the whole disk.
+
parted -l no longer lists device-mapper devices other than
dmraid whole disks.
diff --git a/libparted/labels/loop.c b/libparted/labels/loop.c
index ea8f007..8ebb1f4 100644
--- a/libparted/labels/loop.c
+++ b/libparted/labels/loop.c
@@ -80,7 +80,23 @@ loop_alloc (const PedDevice* dev)
if (dev->length < 256)
return NULL;
- return _ped_disk_alloc ((PedDevice*)dev, &loop_disk_type);
+ PedDisk *disk = _ped_disk_alloc ((PedDevice*)dev, &loop_disk_type);
+ PED_ASSERT (disk != NULL);
+ PedGeometry *geom = ped_geometry_new (dev, 0, dev->length);
+ PED_ASSERT (geom != NULL);
+ PedPartition *part = ped_partition_new (disk, PED_PARTITION_NORMAL,
+ NULL, geom->start, geom->end);
+ PED_ASSERT (part != NULL);
+ ped_geometry_destroy (geom);
+ PedConstraint *constraint_any = ped_constraint_any (dev);
+ if (!ped_disk_add_partition (disk, part, constraint_any))
+ goto error;
+ ped_constraint_destroy (constraint_any);
+ return disk;
+ error:
+ ped_constraint_destroy (constraint_any);
+ ped_disk_destroy (disk);
+ return NULL;
}
static PedDisk*
@@ -118,18 +134,12 @@ loop_read (PedDisk* disk)
int found_sig = !strncmp (buf, LOOP_SIGNATURE, strlen
(LOOP_SIGNATURE));
free (buf);
-
- if (found_sig) {
- ped_constraint_destroy (constraint_any);
- return 1;
- }
-
geom = ped_geometry_new (dev, 0, dev->length);
if (!geom)
goto error;
fs_type = ped_file_system_probe (geom);
- if (!fs_type)
+ if (!fs_type && !found_sig)
goto error_free_geom;
part = ped_partition_new (disk, PED_PARTITION_NORMAL,
@@ -137,7 +147,6 @@ loop_read (PedDisk* disk)
ped_geometry_destroy (geom);
if (!part)
goto error;
- part->fs_type = fs_type;
if (!ped_disk_add_partition (disk, part, constraint_any))
goto error;
@@ -156,29 +165,15 @@ static int
loop_write (const PedDisk* disk)
{
size_t buflen = disk->dev->sector_size;
- char *buf = ped_malloc (buflen);
- if (buf == NULL)
- return 0;
-
- if (ped_disk_get_partition (disk, 1)) {
- if (!ped_device_read (disk->dev, buf, 0, 1)) {
- free (buf);
- return 0;
- }
- if (strncmp (buf, LOOP_SIGNATURE, strlen (LOOP_SIGNATURE)) !=
0) {
- free (buf);
- return 1;
- }
- memset (buf, 0, strlen (LOOP_SIGNATURE));
- return ped_device_write (disk->dev, buf, 0, 1);
- }
-
+ char *buf = alloca (buflen);
+ PedPartition *part = ped_disk_get_partition (disk, 1);
+ /* if there is already a filesystem on the disk, we don't need to write
the signature */
+ if (part && part->fs_type)
+ return 1;
memset (buf, 0, buflen);
strcpy (buf, LOOP_SIGNATURE);
- int write_ok = ped_device_write (disk->dev, buf, 0, 1);
- free (buf);
- return write_ok;
+ return ped_device_write (disk->dev, buf, 0, 1);
}
#endif /* !DISCOVER_ONLY */
--
1.9.1
- bug#16231: [PATCH 0/9] Refactored loop fixes, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 2/9] libparted: remove old partitions *first* before adding new ones, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 9/9] tests: test loop labels, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 3/9] libparted: remove all old partitions, even if new label allows less, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 1/9] libparted: don't detect fat and ntfs boot sectors as dos MBR, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 6/9] partprobe: do not skip loop labels, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 7/9] libparted: give correct partition device name on loop labels, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 5/9] libparted: don't create partition on loop label, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 8/9] libparted: don't trash filesystem when writing loop label, Phillip Susi, 2014/05/02
- bug#16231: [PATCH 4/9] libparted: fix loop labels to not vanish,
Phillip Susi <=
- bug#16231: [PATCH 0/9] Refactored loop fixes, Brian C. Lane, 2014/05/07
- bug#16231: [PATCH 0/9] Refactored loop fixes, Phillip Susi, 2014/05/07
- bug#16231: [PATCH 0/9] Refactored loop fixes, Brian C. Lane, 2014/05/08
- bug#16231: [PATCH 0/9] Refactored loop fixes, Phillip Susi, 2014/05/19
- bug#16231: [PATCH 0/9] Refactored loop fixes, Brian C. Lane, 2014/05/21
- bug#16231: [PATCH 0/9] Refactored loop fixes, Phillip Susi, 2014/05/22
- bug#16231: [PATCH 0/9] Refactored loop fixes, Brian C. Lane, 2014/05/22
- bug#16231: [PATCH 0/9] Refactored loop fixes, Phillip Susi, 2014/05/22