utils: 'with-atomic-file-output' calls 'fdatasync'.

Suggested by Danny Milosavljevic <dannym@scratchpost.org>
at <https://lists.gnu.org/archive/html/guix-devel/2016-06/msg00456.html>.

* guix/build/syscalls.scm (fdatasync): New procedure.
* guix/utils.scm (with-atomic-file-output): Use it.  Use 'close-port'
instead of 'close'.
This commit is contained in:
Ludovic Courtès 2016-06-13 17:52:08 +02:00
parent 9f8ee3fe0e
commit 1752a17a1e
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 18 additions and 2 deletions

View file

@ -64,6 +64,7 @@ (define-module (guix build syscalls)
processes
mkdtemp!
fdatasync
pivot-root
fcntl-flock
@ -506,6 +507,20 @@ (define mkdtemp!
(list err)))
(pointer->string result)))))
(define fdatasync
(let ((proc (syscall->procedure int "fdatasync" (list int))))
(lambda (port)
"Flush buffered output of PORT, an output file port, and then call
fdatasync(2) on the underlying file descriptor."
(force-output port)
(let* ((fd (fileno port))
(ret (proc fd))
(err (errno)))
(unless (zero? ret)
(throw 'system-error "fdatasync" "~S: ~A"
(list fd (strerror err))
(list err)))))))
(define-record-type <file-system>
(file-system type block-size blocks blocks-free

View file

@ -34,7 +34,7 @@ (define-module (guix utils)
#:use-module ((rnrs bytevectors) #:select (bytevector-u8-set!))
#:use-module (guix combinators)
#:use-module ((guix build utils) #:select (dump-port))
#:use-module ((guix build syscalls) #:select (mkdtemp!))
#:use-module ((guix build syscalls) #:select (mkdtemp! fdatasync))
#:use-module (ice-9 vlist)
#:use-module (ice-9 format)
#:autoload (ice-9 popen) (open-pipe*)
@ -625,7 +625,8 @@ (define (with-atomic-file-output file proc)
(with-throw-handler #t
(lambda ()
(let ((result (proc out)))
(close out)
(fdatasync out)
(close-port out)
(rename-file template file)
result))
(lambda (key . args)