guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

58/68: installer: parted: Do not call BLKRRPART on loop devices.


From: guix-commits
Subject: 58/68: installer: parted: Do not call BLKRRPART on loop devices.
Date: Thu, 17 Jan 2019 08:05:20 -0500 (EST)

civodul pushed a commit to branch master
in repository guix.

commit f297c213a1b8a364f60c1de825761f1d9ad7eb5e
Author: Mathieu Othacehe <address@hidden>
Date:   Tue Jan 1 19:23:21 2019 +0100

    installer: parted: Do not call BLKRRPART on loop devices.
    
    * gnu/installer/parted.scm (with-delay-device-in-use?): Return immediately 
if
    the file-name passed as argument designates a loop device.
---
 gnu/installer/parted.scm | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/gnu/installer/parted.scm b/gnu/installer/parted.scm
index ea62d6a..40054c0 100644
--- a/gnu/installer/parted.scm
+++ b/gnu/installer/parted.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2018 Mathieu Othacehe <address@hidden>
+;;; Copyright © 2018, 2019 Mathieu Othacehe <address@hidden>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -31,6 +31,7 @@
   #:use-module (guix i18n)
   #:use-module (parted)
   #:use-module (ice-9 match)
+  #:use-module (ice-9 regex)
   #:use-module (rnrs io ports)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
@@ -339,12 +340,14 @@ PARTED-OBJECT field equals PARTITION, return #f if not 
found."
 (define (with-delay-device-in-use? file-name)
   "Call DEVICE-IN-USE? with a few retries, as the first re-read will often
 fail. See rereadpt function in wipefs.c of util-linux for an explanation."
-  (let loop ((try 4))
-    (usleep 250000)
-    (let ((in-use? (device-in-use? file-name)))
-      (if (and in-use? (> try 0))
-          (loop (- try 1))
-          in-use?))))
+  ;; Kernel always return EINVAL for BLKRRPART on loopdevices.
+  (and (not (string-match "/dev/loop*" file-name))
+       (let loop ((try 4))
+         (usleep 250000)
+         (let ((in-use? (device-in-use? file-name)))
+           (if (and in-use? (> try 0))
+               (loop (- try 1))
+               in-use?)))))
 
 (define* (force-device-sync device)
   "Force a flushing of the given DEVICE."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]