From: Petr Uzel Subject: parted: Make informing the kernel more reliable References: bnc#657360 Patch-mainline: no This patch should make parted's process of informing the kernel about changes of partition table sligtly more reliable. It consists of 2 quite unrelated parts: * increase the max sleep time if partition is busy from 1 to 2 seconds * do not inform the kernel when only partition flags change - kernel does not care about the flags --- libparted/arch/linux.c | 2 +- parted/parted.c | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) Index: parted-3.3/libparted/arch/linux.c =================================================================== --- parted-3.3.orig/libparted/arch/linux.c +++ parted-3.3/libparted/arch/linux.c @@ -3153,7 +3153,7 @@ _disk_sync_part_table (PedDisk* disk) /* 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 max_sleep_seconds = 2; unsigned int n_sleep = (max_sleep_seconds * 1000000 / sleep_microseconds); do { Index: parted-3.3/parted/parted.c =================================================================== --- parted-3.3.orig/parted/parted.c +++ parted-3.3/parted/parted.c @@ -267,6 +267,32 @@ _disk_warn_loss (PedDisk* disk) disk->dev->path) == PED_EXCEPTION_YES; } +/* + * Copied from ped_disk_commit(), but with removed the call to + * ped_disk_commit_to_os(). This is used in do_set() - BLKPG* ioctls() do not + * care about the partition flags anyway. + */ +static int +ped_disk_commit_just_to_disk (PedDisk* disk) +{ + /* Open the device here, so that the underlying fd is not closed + between commit_to_dev and commit_to_os (closing causes unwanted + udev events to be sent under Linux). */ + if (!ped_device_open (disk->dev)) + goto error; + + if (!ped_disk_commit_to_dev (disk)) + goto error_close_dev; + + ped_device_close (disk->dev); + return 1; + +error_close_dev: + ped_device_close (disk->dev); +error: + return 0; +} + /* This function changes "sector" to "new_sector" if the new value lies * within the required range. */ @@ -1791,7 +1817,7 @@ do_set (PedDevice** dev, PedDisk **diskp if (!ped_partition_set_flag (part, flag, state)) goto error; - if (!ped_disk_commit (*diskp)) + if (!ped_disk_commit_just_to_disk (*diskp)) goto error; if ((*dev)->type != PED_DEVICE_FILE)