a248769183
- Summary of important changes from upstream: - add support for a new Linux-specific GPT partition type code - partprobe: remove partitions when there is no partition table - libparted: refactor device-mapper partition sync code - libparted: remove extraneous blkpg add partition ped exception - libparted: don't probe every dm device in probe_all - New Fedora changes: - libparted: Add Intel Rapid Start Technology partition flag. - libparted: Add UEFI System Partition flag. - libparted: Add hfs_esp partition flag to GPT. - libparted: Recognize btrfs filesystem - tests: Add btrfs and xfs to the fs probe test
169 lines
5.3 KiB
Diff
169 lines
5.3 KiB
Diff
From d74a3657dcd9341e54aa28deecf3e21d72cb3207 Mon Sep 17 00:00:00 2001
|
|
From: "Brian C. Lane" <bcl@redhat.com>
|
|
Date: Thu, 22 Aug 2013 18:08:30 -0700
|
|
Subject: [PATCH 55/69] libparted: use dm_udev_wait (#698121)
|
|
|
|
This is based on Peter Rajnoha's patch to use dm_udev_wait to
|
|
synchronize with udev.
|
|
|
|
This requires libdevmapper v1.02.39 and higher.
|
|
|
|
mailing list thread:
|
|
https://lists.gnu.org/archive/html/bug-parted/2010-09/msg00007.html
|
|
|
|
* libparted/arch/linux.c (_dm_task_run_wait): New function
|
|
(_is_dm_major): Add cookie and change call to _dm_task_run_wait
|
|
(_is_dmraid_device): Same
|
|
(_dm_is_part): Same
|
|
(dm_canonical_path): Same
|
|
(_dm_remove_partition): Same
|
|
(_dm_get_partition_start_and_length): Same
|
|
(_dm_add_partition): Same
|
|
(linux_new): Enable udev sync support
|
|
---
|
|
libparted/arch/linux.c | 52 +++++++++++++++++++++++++++++++++-----------------
|
|
1 file changed, 34 insertions(+), 18 deletions(-)
|
|
|
|
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
|
|
index 2bb8774..1c5faa5 100644
|
|
--- a/libparted/arch/linux.c
|
|
+++ b/libparted/arch/linux.c
|
|
@@ -438,6 +438,17 @@ _is_virtblk_major (int major)
|
|
|
|
#ifdef ENABLE_DEVICE_MAPPER
|
|
static int
|
|
+_dm_task_run_wait (struct dm_task *task, uint32_t cookie)
|
|
+{
|
|
+ int rc = 0;
|
|
+
|
|
+ rc = dm_task_run (task);
|
|
+ dm_udev_wait (cookie);
|
|
+
|
|
+ return rc;
|
|
+}
|
|
+
|
|
+static int
|
|
_is_dm_major (int major)
|
|
{
|
|
return _major_type_in_devices (major, "device-mapper");
|
|
@@ -466,7 +477,7 @@ _dm_maptype (PedDevice *dev)
|
|
|
|
dm_task_no_open_count(dmt);
|
|
|
|
- if (!dm_task_run(dmt))
|
|
+ if (!dm_task_run (dmt))
|
|
goto bad;
|
|
|
|
dm_get_next_target(dmt, NULL, &start, &length, &target_type, ¶ms);
|
|
@@ -519,7 +530,7 @@ _dm_is_part (const char *path)
|
|
return 0;
|
|
|
|
dm_task_set_name(task, path);
|
|
- if (!dm_task_run(task))
|
|
+ if (!dm_task_run (task))
|
|
goto err;
|
|
|
|
struct dm_info *info = alloca (sizeof *info);
|
|
@@ -1398,6 +1409,10 @@ linux_new (const char* path)
|
|
dev->dirty = 0;
|
|
dev->boot_dirty = 0;
|
|
|
|
+#ifdef ENABLE_DEVICE_MAPPER
|
|
+ dm_udev_set_sync_support(1);
|
|
+#endif
|
|
+
|
|
if (!_device_probe_type (dev))
|
|
goto error_free_arch_specific;
|
|
|
|
@@ -2316,7 +2331,7 @@ dm_canonical_path (PedDevice const *dev)
|
|
if (!dm_task_set_major_minor (task, arch_specific->major,
|
|
arch_specific->minor, 0))
|
|
goto err;
|
|
- if (!dm_task_run(task))
|
|
+ if (!dm_task_run (task))
|
|
goto err;
|
|
char *dev_name = zasprintf ("/dev/mapper/%s", dm_task_get_name (task));
|
|
if (dev_name == NULL)
|
|
@@ -2637,31 +2652,29 @@ _device_get_partition_range(PedDevice const* dev)
|
|
static int
|
|
_dm_remove_partition(PedDisk* disk, int partno)
|
|
{
|
|
- int rc;
|
|
+ int rc = 0;
|
|
+ uint32_t cookie = 0;
|
|
char *part_name = _device_get_part_path (disk->dev, partno);
|
|
|
|
int fd = open (part_name, O_RDONLY | O_EXCL);
|
|
if (fd == -1) {
|
|
if (errno == ENOENT)
|
|
errno = ENXIO; /* nothing to remove, device already doesn't exist */
|
|
- free (part_name);
|
|
- return 0;
|
|
+ goto err;
|
|
}
|
|
close (fd);
|
|
struct dm_task *task = dm_task_create(DM_DEVICE_REMOVE);
|
|
- if (!task) {
|
|
- free (part_name);
|
|
- return 0;
|
|
- }
|
|
+ if (!task)
|
|
+ goto err;
|
|
dm_task_set_name (task, part_name);
|
|
- rc = dm_task_run(task);
|
|
+ if (!dm_task_set_cookie (task, &cookie, 0))
|
|
+ goto err;
|
|
+ rc = _dm_task_run_wait (task, cookie);
|
|
dm_task_update_nodes();
|
|
dm_task_destroy(task);
|
|
+err:
|
|
free (part_name);
|
|
- if (!rc)
|
|
- return 0;
|
|
-
|
|
- return 1;
|
|
+ return rc;
|
|
}
|
|
|
|
static bool
|
|
@@ -2677,7 +2690,7 @@ _dm_get_partition_start_and_length(PedPartition const *part,
|
|
char *path = _device_get_part_path (part->disk->dev, part->num);
|
|
PED_ASSERT(path);
|
|
dm_task_set_name(task, path);
|
|
- if (!dm_task_run(task))
|
|
+ if (!dm_task_run (task))
|
|
goto err;
|
|
|
|
int major, minor;
|
|
@@ -2700,6 +2713,7 @@ _dm_add_partition (PedDisk* disk, const PedPartition* part)
|
|
LinuxSpecific* arch_specific = LINUX_SPECIFIC (disk->dev);
|
|
char *params = NULL;
|
|
char *vol_name = NULL;
|
|
+ uint32_t cookie = 0;
|
|
|
|
/* Get map name from devicemapper */
|
|
struct dm_task *task = dm_task_create (DM_DEVICE_INFO);
|
|
@@ -2710,7 +2724,7 @@ _dm_add_partition (PedDisk* disk, const PedPartition* part)
|
|
arch_specific->minor, 0))
|
|
goto err;
|
|
|
|
- if (!dm_task_run(task))
|
|
+ if (!dm_task_run (task))
|
|
goto err;
|
|
|
|
const char *dev_name = dm_task_get_name (task);
|
|
@@ -2736,7 +2750,9 @@ _dm_add_partition (PedDisk* disk, const PedPartition* part)
|
|
dm_task_set_name (task, vol_name);
|
|
dm_task_add_target (task, 0, part->geom.length,
|
|
"linear", params);
|
|
- if (dm_task_run (task)) {
|
|
+ if (!dm_task_set_cookie (task, &cookie, 0))
|
|
+ goto err;
|
|
+ if (_dm_task_run_wait (task, cookie)) {
|
|
dm_task_update_nodes ();
|
|
dm_task_destroy (task);
|
|
free (params);
|
|
--
|
|
1.8.3.1
|
|
|