From 943e577440d74ad7f8787af2590c8ab4579a459b Mon Sep 17 00:00:00 2001 From: Hannes Reinecke 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 --- dasdfmt/dasdfmt.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) Index: s390-tools-2.29.0/dasdfmt/dasdfmt.c =================================================================== --- s390-tools-2.29.0.orig/dasdfmt/dasdfmt.c +++ s390-tools-2.29.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); }