build: syscalls: Add device-in-use?.

This new procedure uses BLKRRPART to determine whether or not a device is
busy. It is useful when a device does not appear as mounted but is maybe used
by the kernel. This is the case with overlayfs lowerdir backend device for
example.

* guix/build/syscalls.scm (device-in-use?): New exported procedure.
master
Mathieu Othacehe 2018-12-05 14:08:35 +09:00 committed by Ludovic Courtès
parent 4f83afd28a
commit b08bea0497
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
1 changed files with 22 additions and 0 deletions

View File

@ -73,6 +73,7 @@
file-system-mount-flags
statfs
free-disk-space
device-in-use?
processes
mkdtemp!
@ -684,6 +685,27 @@ mounted at FILE."
(define AT_NO_AUTOMOUNT #x800)
(define AT_EMPTY_PATH #x1000)
(define-syntax BLKRRPART ;<sys/mount.h>
(identifier-syntax #x125F))
(define* (device-in-use? device)
"Return #t if the block DEVICE is in use, #f otherwise. This is inspired
from fdisk_device_is_used function of util-linux. This is particulary useful
for devices that do not appear in /proc/self/mounts like overlayfs lowerdir
backend device."
(let*-values (((port) (open-file device "rb"))
((ret err) (%ioctl (fileno port) BLKRRPART %null-pointer)))
(close-port port)
(cond
((= ret 0)
#f)
((= err EBUSY)
#t)
(else
(throw 'system-error "ioctl" "~A"
(list (strerror err))
(list err))))))
;;;
;;; Containers.