diff options
author | Mathieu Othacehe <m.othacehe@gmail.com> | 2019-01-01 19:23:21 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-01-17 14:04:27 +0100 |
commit | f297c213a1b8a364f60c1de825761f1d9ad7eb5e (patch) | |
tree | 82888bba21a0fd789c8bc07c4a2fa0265cc61c39 /gnu/installer | |
parent | 44b2d31c2834cae13475a47bbb5a7258358ea03b (diff) | |
download | guix-f297c213a1b8a364f60c1de825761f1d9ad7eb5e.tar guix-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')
-rw-r--r-- | gnu/installer/parted.scm | 17 |
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." |