Skip to contentSkip to conversation

multipath: Fix kpartx and udevd race

PATCH Superseded Benjamin Marzinski 1 participant 1 message Jan 8, 2013 Device mapper

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

Benjamin Marzinski

author maintainer
#0 lore raw

PATCH 1/1 multipath: Fix kpartx and udevd race

Sometimes when kpartx is used to view partition data on disk image files, udev still has the loop device open when kpartx is trying to tear it down. This causes the LOOP_CLR_FD ioctl to fail with EBUSY. kpartx now retries in this case.

---
 kpartx/lopart.c |   16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)
kpartx/lopart.c +12 -4
Index: multipath-tools-130107/kpartx/lopart.c
===================================================================
@@ -286,6 +286,7 @@ set_loop (const char *device, const char
 extern int 
 del_loop (const char *device)
 {
+	int retries = 3;
 	int fd;
 
 	if ((fd = open (device, O_RDONLY)) < 0) {
@@ -295,10 +296,17 @@ del_loop (const char *device)
 		return 1;
 	}
 
-	if (ioctl (fd, LOOP_CLR_FD, 0) < 0) {
-		perror ("ioctl: LOOP_CLR_FD");
-		close (fd);
-		return 1;
+	while (ioctl (fd, LOOP_CLR_FD, 0) < 0) {
+		if (errno != EBUSY || retries-- <= 0) {
+			perror ("ioctl: LOOP_CLR_FD");
+			close (fd);
+			return 1;
+		}
+		fprintf(stderr,
+			"loop: device %s still in use, retrying delete\n",
+			device);
+		sleep(1);
+		continue;
 	}
 
 	close (fd);