GNU bug report logs -
#15491
[PATCH] libparted: avoid disturbing partitions
Previous Next
Reported by: Phillip Susi <psusi <at> ubuntu.com>
Date: Mon, 30 Sep 2013 02:20:05 UTC
Severity: normal
Tags: patch
Done: Phillip Susi <psusi <at> ubuntu.com>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your message dated Sat, 23 Nov 2013 22:00:04 -0500
with message-id <52916BB4.8070306 <at> ubuntu.com>
and subject line Re: bug#15299: [PATCH 1/9] parted: fix EOF and ctrl-c handling
has caused the debbugs.gnu.org bug report #15491,
regarding [PATCH] libparted: avoid disturbing partitions
to be marked as done.
(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)
--
15491: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=15491
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
The partition sync logic was first removing all
partitions, then trying to re-add them. This resulted in many
udev events triggering annoying behavior like auto mounting.
Refactor the code to avoid removing and re-adding unmodified
partitions.
---
libparted/arch/linux.c | 69 +++++++++++++++++++++++---------------------------
1 file changed, 31 insertions(+), 38 deletions(-)
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
index 4b1b438..d3a03d6 100644
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -2670,6 +2670,11 @@ _dm_get_partition_start_and_length(PedPartition const *part,
return 0;
char *path = _device_get_part_path (part->disk->dev, part->num);
PED_ASSERT(path);
+ /* libdevmapper likes to complain on stderr instead of quietly
+ returning ENOENT or ENXIO, so try to stat first */
+ struct stat st;
+ if (stat(path, &st))
+ goto err;
dm_task_set_name(task, path);
if (!dm_task_run(task))
goto err;
@@ -2806,50 +2811,38 @@ _disk_sync_part_table (PedDisk* disk)
if (!errnums)
goto cleanup;
- /* Attempt to remove each and every partition, retrying for
- up to max_sleep_seconds upon any failure due to EBUSY. */
- unsigned int sleep_microseconds = 10000;
- unsigned int max_sleep_seconds = 1;
- unsigned int n_sleep = (max_sleep_seconds
- * 1000000 / sleep_microseconds);
int i;
- for (i = 0; i < n_sleep; i++) {
- if (i)
- usleep (sleep_microseconds);
- bool busy = false;
- int j;
- for (j = 0; j < lpn; j++) {
- if (!ok[j]) {
- ok[j] = remove_partition (disk, j + 1);
- errnums[j] = errno;
- if (!ok[j] && errnums[j] == EBUSY)
- busy = true;
- }
- }
- if (!busy)
- break;
- }
-
for (i = 1; i <= lpn; i++) {
PedPartition *part = ped_disk_get_partition (disk, i);
if (part) {
- if (!ok[i - 1] && errnums[i - 1] == EBUSY) {
- unsigned long long length;
- unsigned long long start;
- /* get start and length of existing partition */
- if (!get_partition_start_and_length(part,
- &start, &length))
- goto cleanup;
- if (start == part->geom.start
- && length == part->geom.length)
- ok[i - 1] = 1;
- /* If the new partition is unchanged and the
- existing one was not removed because it was
- in use, then reset the error flag and do not
- try to add it since it is already there. */
+ unsigned long long length;
+ unsigned long long start;
+ /* get start and length of existing partition */
+ if (get_partition_start_and_length(part,
+ &start, &length)
+ && start == part->geom.start
+ && length == part->geom.length) {
+ ok[i - 1] = 1;
+ /* partition is unchanged, so nothing to do */
continue;
}
-
+ }
+ /* Attempt to remove the partition, retrying for
+ up to max_sleep_seconds upon any failure due to EBUSY. */
+ unsigned int sleep_microseconds = 10000;
+ unsigned int max_sleep_seconds = 1;
+ unsigned int n_sleep = (max_sleep_seconds
+ * 1000000 / sleep_microseconds);
+ do {
+ ok[i - 1] = remove_partition (disk, i);
+ errnums[i - 1] = errno;
+ if (ok[i - 1] || errnums[i - 1] != EBUSY)
+ break;
+ usleep (sleep_microseconds);
+ } while (n_sleep--);
+ if (!ok[i - 1] && errnums[i - 1] == ENXIO)
+ ok[i - 1] = 1; /* it already doesn't exist */
+ if (part && ok[i - 1]) {
/* add the (possibly modified or new) partition */
if (!add_partition (disk, part)) {
ok[i - 1] = 0;
--
1.8.1.2
[Message part 3 (message/rfc822, inline)]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
Patches pushed.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/
iQEcBAEBCgAGBQJSkWu0AAoJEJrBOlT6nu75jvEH/0YAeaOBrU/ANr8yIqNyb51t
YYwS16WiiIi9MQ5dBL4pxamSWYVZWo56SwxL3VE0U3JgjuYFcQ/frc3DvLGE6Zbq
4UszohWAsBftn4N4bQJlq6sWewN3R4bbauVUfwEHv9B4KgFnyDkomELseFyNgYL9
y33ZMLEQpIKkD5JM8jL/xb48V71J8kkVU/4vLGVUT4xF5ZswCXixKDqCpjlbvhzE
e+r172v0hIkIE9VE5ZtsvyRdebjZuNRYYuQSCkh+9Vr4Xbk+erB9Uz0paApwyVV9
iNfVS0s8K0oDBpOdpYpWgRkn7+SA6SQoPR5oCSTkkE9lmUXAUfu3/f5L+J1crv0=
=gQOi
-----END PGP SIGNATURE-----
This bug report was last modified 11 years and 181 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.