aboutsummaryrefslogtreecommitdiff
path: root/gnu/installer/parted.scm
diff options
context:
space:
mode:
authorMathieu Othacehe <othacehe@gnu.org>2020-11-17 09:50:01 +0100
committerMathieu Othacehe <othacehe@gnu.org>2020-11-17 19:10:14 +0100
commit3d3ffb30f9ff4ba3b07737a2d902264181388388 (patch)
treea1083b8fecf64b34b6bc70079b76c7d5cd250163 /gnu/installer/parted.scm
parent3aec121e95581e34a47e3a2d175af97579961206 (diff)
downloadguix-3d3ffb30f9ff4ba3b07737a2d902264181388388.tar
guix-3d3ffb30f9ff4ba3b07737a2d902264181388388.tar.gz
installer: Fix device synchronization.
Reported by Florian Pelz: https://lists.gnu.org/archive/html/guix-devel/2020-11/msg00326.html. * gnu/installer/utils.scm (call-with-time): New procedure, (let/time): new macro. * gnu/installer/parted.scm (with-delay-device-in-use?): Increase the retry count to 16. (non-install-devices): Remove the call to with-delay-device-in-use? as it doesn't return the expected result, and would block much longer now. (free-parted): Log the time required to sync each device.
Diffstat (limited to 'gnu/installer/parted.scm')
-rw-r--r--gnu/installer/parted.scm27
1 files changed, 14 insertions, 13 deletions
diff --git a/gnu/installer/parted.scm b/gnu/installer/parted.scm
index f592d315f5..9ef263d1f9 100644
--- a/gnu/installer/parted.scm
+++ b/gnu/installer/parted.scm
@@ -41,6 +41,7 @@
#:use-module (ice-9 regex)
#:use-module (rnrs io ports)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-19)
#:use-module (srfi srfi-26)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
@@ -318,7 +319,7 @@ PARTED-OBJECT field equals PARTITION, return #f if not found."
fail. See rereadpt function in wipefs.c of util-linux for an explanation."
;; Kernel always return EINVAL for BLKRRPART on loopdevices.
(and (not (string-match "/dev/loop*" file-name))
- (let loop ((try 4))
+ (let loop ((try 16))
(usleep 250000)
(let ((in-use? (device-in-use? file-name)))
(if (and in-use? (> try 0))
@@ -339,15 +340,12 @@ fail. See rereadpt function in wipefs.c of util-linux for an explanation."
(define (non-install-devices)
"Return all the available devices, except the busy one, allegedly the
install device. DEVICE-IS-BUSY? is a parted call, checking if the device is
-mounted. The install image uses an overlayfs so the install device does not
-appear as mounted and won't be considered as busy. So use also DEVICE-IN-USE?
-from (guix build syscalls) module, who will try to re-read the device's
-partition table to determine whether or not it is already used (like sfdisk
-from util-linux)."
+mounted."
+ ;; FIXME: The install image uses an overlayfs so the install device does not
+ ;; appear as mounted and won't be considered as busy.
(remove (lambda (device)
(let ((file-name (device-path device)))
- (or (device-is-busy? device)
- (with-delay-device-in-use? file-name))))
+ (device-is-busy? device)))
(devices)))
@@ -1390,9 +1388,12 @@ the devices not to be used before returning."
(let ((device-file-names (map device-path devices)))
(for-each force-device-sync devices)
(for-each (lambda (file-name)
- (let ((in-use? (with-delay-device-in-use? file-name)))
- (and in-use?
- (error
- (format #f (G_ "Device ~a is still in use.")
- file-name)))))
+ (let/time ((time in-use?
+ (with-delay-device-in-use? file-name)))
+ (if in-use?
+ (error
+ (format #f (G_ "Device ~a is still in use.")
+ file-name))
+ (syslog "Syncing ~a took ~a seconds.~%"
+ file-name (time-second time)))))
device-file-names)))