Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-15-SP7:GA
s390-tools.12090
dasdfmt-retry-BIODASDINFO-if-device-is-busy.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File dasdfmt-retry-BIODASDINFO-if-device-is-busy.patch of Package s390-tools.12090
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(-) diff --git a/dasdfmt/dasdfmt.c b/dasdfmt/dasdfmt.c index e1877ac..f03cbad 100644 --- a/dasdfmt/dasdfmt.c +++ b/dasdfmt/dasdfmt.c @@ -588,7 +616,7 @@ */ static void check_disk(dasdfmt_info_t *info, char *devname) { - int ro, errno_save; + int ro, errno_save, i = 0; if (ioctl(filedes, BLKROGET, &ro) != 0) { errno_save = errno; @@ -602,9 +630,27 @@ if (ro) ERRMSG_EXIT(EXIT_FAILURE, "Disk is read only!\n"); - if (!info->force) + if (!info->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 ( i = 0 ; i < 6 ; i++ ) { + if (info->dasd_info.open_count > 1) { + get_device_info(info); + sleep(1); + } + else break; + + } if (info->dasd_info.open_count > 1) ERRMSG_EXIT(EXIT_BUSY, "Disk in use!\n"); + } if (strncmp(info->dasd_info.type, "ECKD", 4) != 0) { ERRMSG_EXIT(EXIT_FAILURE, -- 1.8.4.5
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor