summaryrefslogtreecommitdiff
path: root/gnu/installer/parted.scm
diff options
context:
space:
mode:
authorMathieu Othacehe <m.othacehe@gmail.com>2019-01-01 19:23:21 +0100
committerLudovic Courtès <ludo@gnu.org>2019-01-17 14:04:27 +0100
commitf297c213a1b8a364f60c1de825761f1d9ad7eb5e (patch)
tree82888bba21a0fd789c8bc07c4a2fa0265cc61c39 /gnu/installer/parted.scm
parent44b2d31c2834cae13475a47bbb5a7258358ea03b (diff)
downloadguix-patches-f297c213a1b8a364f60c1de825761f1d9ad7eb5e.tar
guix-patches-f297c213a1b8a364f60c1de825761f1d9ad7eb5e.tar.gz
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.
Diffstat (limited to 'gnu/installer/parted.scm')
-rw-r--r--gnu/installer/parted.scm17
1 files changed, 10 insertions, 7 deletions
diff --git a/gnu/installer/parted.scm b/gnu/installer/parted.scm
index ea62d6ad77..40054c0be2 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 <m.othacehe@gmail.com>
+;;; Copyright © 2018, 2019 Mathieu Othacehe <m.othacehe@gmail.com>
;;;
;;; 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."