59 lines
1.8 KiB
Diff
59 lines
1.8 KiB
Diff
|
From 943e577440d74ad7f8787af2590c8ab4579a459b Mon Sep 17 00:00:00 2001
|
||
|
From: Hannes Reinecke <hare@suse.de>
|
||
|
Date: Thu, 5 Nov 2015 10:57:38 +0100
|
||
|
Subject: [PATCH] dasdfmt: retry BIODASDINFO if device is busy
|
||
|
|
||
|
Modern udev have the wonderful 'feature' to sending a 'change'
|
||
|
event whenever a device opened with O_RDWR is closed again.
|
||
|
The reasoning is that the said program _might_ have changed
|
||
|
the partition table and hence we _might_ have missed a partition
|
||
|
update.
|
||
|
But in doing so it not only generated tons of pointless events
|
||
|
but also confused the hell out of other programs.
|
||
|
Idiots.
|
||
|
|
||
|
References: bsc#937340
|
||
|
|
||
|
Signed-off-by: Hannes Reinecke <hare@suse.de>
|
||
|
---
|
||
|
dasdfmt/dasdfmt.c | 21 ++++++++++++++++++---
|
||
|
1 file changed, 18 insertions(+), 3 deletions(-)
|
||
|
|
||
|
Index: s390-tools-2.30.0/dasdfmt/dasdfmt.c
|
||
|
===================================================================
|
||
|
--- s390-tools-2.30.0.orig/dasdfmt/dasdfmt.c
|
||
|
+++ s390-tools-2.30.0/dasdfmt/dasdfmt.c
|
||
|
@@ -621,7 +621,7 @@ static void check_layout(unsigned int in
|
||
|
*/
|
||
|
static void check_disk(void)
|
||
|
{
|
||
|
- int err;
|
||
|
+ int err, index = 0 ;
|
||
|
bool ro;
|
||
|
|
||
|
err = dasd_is_ro(g.dev_node, &ro);
|
||
|
@@ -631,6 +631,23 @@ static void check_disk(void)
|
||
|
if (ro)
|
||
|
error("Disk %s is read only!", g.dev_path);
|
||
|
if (!g.force) {
|
||
|
+ /*
|
||
|
+ * udev strikes again.
|
||
|
+ * Modern udev will issue a 'change' event whenever
|
||
|
+ * a device opened with O_RDWR is closed again.
|
||
|
+ * On the grounds that program _might_ have changed
|
||
|
+ * the partition table.
|
||
|
+ * And confusing the hell out ouf anyone else.
|
||
|
+ * Bah.
|
||
|
+ */
|
||
|
+ for ( index = 0 ; index < 6 ; index++ ) {
|
||
|
+ if (g.dasd_info.open_count > 1) {
|
||
|
+ dasd_get_info(g.dev_node, &g.dasd_info);
|
||
|
+ sleep(1);
|
||
|
+ }
|
||
|
+ else break;
|
||
|
+
|
||
|
+ }
|
||
|
if (g.dasd_info.open_count > 1)
|
||
|
error("Disk %s is in use!", g.dev_path);
|
||
|
}
|