81 lines
3.0 KiB
Diff
81 lines
3.0 KiB
Diff
|
From: Petr Uzel <petr.uzel@suse.cz>
|
||
|
Date: Fri, 14 Feb 2014 09:12:47 +0100
|
||
|
Subject: libparted: use BLKRRPART for DASDs
|
||
|
References: bnc#862139
|
||
|
Patch-mainline: no, upstream dropped proper DASD support
|
||
|
|
||
|
This reverts upstream commit 9fa0e1800db5b9f094ae481fd95a51da03f19e95.
|
||
|
This reverts upstream commit 1223b9fc07859cb619c80dc057bd05458f9b5669.
|
||
|
and some fixups on top
|
||
|
---
|
||
|
libparted/arch/linux.c | 50 ++++++++++++++++++++++++++++++++++++++++---------
|
||
|
1 file changed, 41 insertions(+), 9 deletions(-)
|
||
|
|
||
|
Index: parted-3.3/libparted/arch/linux.c
|
||
|
===================================================================
|
||
|
--- parted-3.3.orig/libparted/arch/linux.c
|
||
|
+++ parted-3.3/libparted/arch/linux.c
|
||
|
@@ -3239,6 +3239,34 @@ _disk_sync_part_table (PedDisk* disk)
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
+_kernel_reread_part_table (PedDevice* dev)
|
||
|
+{
|
||
|
+ LinuxSpecific* arch_specific = LINUX_SPECIFIC (dev);
|
||
|
+ int retry_count = 9;
|
||
|
+
|
||
|
+ sync();
|
||
|
+ while (ioctl (arch_specific->fd, BLKRRPART)) {
|
||
|
+ retry_count--;
|
||
|
+ sync();
|
||
|
+ if (retry_count == 3)
|
||
|
+ sleep(1); /* Pause to allow system to settle */
|
||
|
+
|
||
|
+ if (!retry_count) {
|
||
|
+ ped_exception_throw (
|
||
|
+ PED_EXCEPTION_WARNING,
|
||
|
+ PED_EXCEPTION_IGNORE,
|
||
|
+ _("WARNING: the kernel failed to re-read the partition "
|
||
|
+ "table on %s (%s). As a result, it may not "
|
||
|
+ "reflect all of your changes until after reboot."),
|
||
|
+ dev->path, strerror (errno));
|
||
|
+ return 0;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+ return 1;
|
||
|
+}
|
||
|
+
|
||
|
+static int
|
||
|
_have_blkpg ()
|
||
|
{
|
||
|
static int have_blkpg = -1;
|
||
|
@@ -3257,14 +3285,19 @@ linux_disk_commit (PedDisk* disk)
|
||
|
{
|
||
|
if (disk->dev->type != PED_DEVICE_FILE) {
|
||
|
|
||
|
- /* We now require BLKPG support. If this assertion fails,
|
||
|
- please write to the mailing list describing your system.
|
||
|
- Assuming it's never triggered, ...
|
||
|
- FIXME: remove this assertion in 2012. */
|
||
|
- assert (_have_blkpg ());
|
||
|
-
|
||
|
- if (!_disk_sync_part_table (disk))
|
||
|
- return 0;
|
||
|
+ /* The ioctl() command BLKPG_ADD_PARTITION does not notify
|
||
|
+ * the devfs system; consequently, /proc/partitions will not
|
||
|
+ * be up to date, and the proper links in /dev are not
|
||
|
+ * created. Therefore, if using DevFS, we must get the kernel
|
||
|
+ * to re-read and grok the partition table.
|
||
|
+ */
|
||
|
+ /* Work around kernel dasd problem so we really do BLKRRPART */
|
||
|
+ if (disk->dev->type == PED_DEVICE_DASD)
|
||
|
+ return _kernel_reread_part_table(disk->dev);
|
||
|
+
|
||
|
+ assert(_have_blkpg());
|
||
|
+ if (!_disk_sync_part_table(disk))
|
||
|
+ return 0;
|
||
|
}
|
||
|
|
||
|
return 1;
|