From 9a6ea2f8dc5222018768861a2328e7683e1973c9 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Wed, 10 Mar 2021 18:49:10 +0100 Subject: syscalls: Define the ST_* constants and add 'statfs-flags->mount-flags'. * guix/build/syscalls.scm (linux?): New variable. (define-statfs-flags): New macro. (ST_RDONLY, ST_NOSUID, ST_NODEV, ST_NOEXEC, ST_SYNCHRONOUS) (ST_MANDLOCK, ST_WRITE, ST_APPEND, ST_IMMUTABLE, ST_NOATIME) (ST_NODIRATIME, ST_RELATIME): New variables. (statfs-flags->mount-flags): New procedure. --- guix/build/syscalls.scm | 67 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) (limited to 'guix/build/syscalls.scm') diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index 552343a481..6ed11a0d69 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -82,6 +82,21 @@ file-system-fragment-size file-system-mount-flags statfs + + ST_RDONLY + ST_NOSUID + ST_NODEV + ST_NOEXEC + ST_SYNCHRONOUS + ST_MANDLOCK + ST_WRITE + ST_APPEND + ST_IMMUTABLE + ST_NOATIME + ST_NODIRATIME + ST_RELATIME + statfs-flags->mount-flags + free-disk-space device-in-use? add-to-entropy-count @@ -754,6 +769,56 @@ fdatasync(2) on the underlying file descriptor." (define-syntax fsword ;fsword_t (identifier-syntax long)) +(define linux? (string-contains %host-type "linux-gnu")) + +(define-syntax define-statfs-flags + (syntax-rules (linux hurd) + "Define the statfs mount flags." + ((_ (name (linux linux-value) (hurd hurd-value)) rest ...) + (begin + (define name + (if linux? linux-value hurd-value)) + (define-statfs-flags rest ...))) + ((_ (name value) rest ...) + (begin + (define name value) + (define-statfs-flags rest ...))) + ((_) #t))) + +(define-statfs-flags ; + (ST_RDONLY 1) + (ST_NOSUID 2) + (ST_NODEV (linux 4) (hurd 0)) + (ST_NOEXEC 8) + (ST_SYNCHRONOUS 16) + (ST_MANDLOCK (linux 64) (hurd 0)) + (ST_WRITE (linux 128) (hurd 0)) + (ST_APPEND (linux 256) (hurd 0)) + (ST_IMMUTABLE (linux 512) (hurd 0)) + (ST_NOATIME (linux 1024) (hurd 32)) + (ST_NODIRATIME (linux 2048) (hurd 0)) + (ST_RELATIME (linux 4096) (hurd 64))) + +(define (statfs-flags->mount-flags flags) + "Convert FLAGS, a logical or of ST_* constants as returned by +'file-system-mount-flags', to the corresponding logical or of MS_* constants." + (letrec-syntax ((match-flags (syntax-rules (=>) + ((_ (statfs => mount) rest ...) + (logior (if (zero? (logand flags statfs)) + 0 + mount) + (match-flags rest ...))) + ((_) + 0)))) + (match-flags + (ST_RDONLY => MS_RDONLY) + (ST_NOSUID => MS_NOSUID) + (ST_NODEV => MS_NODEV) + (ST_NOEXEC => MS_NOEXEC) + (ST_NOATIME => MS_NOATIME) + (ST_NODIRATIME => 0) ;FIXME + (ST_RELATIME => MS_RELATIME)))) + (define-c-struct %statfs ; sizeof-statfs ;slightly overestimated file-system @@ -769,7 +834,7 @@ fdatasync(2) on the underlying file descriptor." (identifier (array int 2)) (name-length fsword) (fragment-size fsword) - (mount-flags fsword) + (mount-flags fsword) ;ST_* (spare (array fsword 4))) (define statfs -- cgit v1.2.3 From 341dfe7eda4972af0a027357015ea595314438b0 Mon Sep 17 00:00:00 2001 From: Chris Marusich Date: Thu, 11 Mar 2021 23:19:30 -0800 Subject: syscalls: mounts: Fix a matching bug. On some systems, the columns in /proc/self/mountinfo look like this: 23 28 0:21 / /proc rw,nosuid,nodev,noexec,relatime shared:11 - proc proc rw Before this change, the mounts procedure was written with the assumption that the type and source could always be found in columns 8 and 9, respectively. However, the proc(5) man page explains that there can be zero or more optional fields starting at column 7 (e.g., "shared:11" above), so this assumption is false in some situations. * guix/build/syscalls.scm (mounts): Update the match pattern to use ellipsis to match zero or more optional fields followed by a single hyphen. Remove the trailing ellipsis, since multiple ellipses are not allowed in the same level. The proc(5) man page indicates that there are no additional columns, so it is probably OK to match an exact number of columns at the end like this. --- guix/build/syscalls.scm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'guix/build/syscalls.scm') diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index 6ed11a0d69..4379768f5e 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -636,8 +636,9 @@ current process." (if (eof-object? line) (reverse result) (match (string-tokenize line) + ;; See the proc(5) man page for a description of the columns. ((id parent-id major:minor root mount-point - options _ type source _ ...) + options _ ... "-" type source _) (let ((devno (string->device-number major:minor))) (loop (cons (%mount (octal-decode source) (octal-decode mount-point) -- cgit v1.2.3 From b57de27d0331198c9cafb09a1cf8a5fa4f691e36 Mon Sep 17 00:00:00 2001 From: Chris Marusich Date: Sun, 21 Feb 2021 12:17:29 -0800 Subject: syscalls: Fix clone on powerpc64le-linux. This makes the clone procedure work correctly and fixes some test failures on powerpc64le-linux, including tests/containers.scm. * guix/build/syscalls.scm (clone): Add an entry for ppc64le. --- guix/build/syscalls.scm | 1 + 1 file changed, 1 insertion(+) (limited to 'guix/build/syscalls.scm') diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index 4379768f5e..a2c1d80fb1 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -1021,6 +1021,7 @@ Turning finalization off shuts down the finalization thread as a side effect." ("mips64" 5055) ("armv7l" 120) ("aarch64" 220) + ("ppc64le" 120) (_ #f)))) (lambda (flags) "Create a new child process by duplicating the current parent process. -- cgit v1.2.3 From c29bfbfc78ccd9e5c10d38faf3d269eafed12854 Mon Sep 17 00:00:00 2001 From: Chris Marusich Date: Sun, 21 Feb 2021 16:05:58 -0800 Subject: syscalls: Fix RNDADDTOENTCNT on powerpc64le-linux. This fixes the failing test add-to-entropy-count in tests/syscalls.scm on powerpc64le-linux. * guix/build/syscalls.scm (RNDADDTOENTCNT): When %host-type starts with "powerpc64le", set this to #x80045201. Otherwise, set it to #x40045201 as before. --- guix/build/syscalls.scm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'guix/build/syscalls.scm') diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index a2c1d80fb1..8886fc0fb9 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2019 Guillaume Le Vaillant ;;; Copyright © 2020 Julien Lepiller ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen +;;; Copyright © 2021 Chris Marusich ;;; ;;; This file is part of GNU Guix. ;;; @@ -942,7 +943,11 @@ backend device." ;;; ;; From . -(define RNDADDTOENTCNT #x40045201) +(define RNDADDTOENTCNT + ;; Avoid using %current-system here to avoid depending on host-side code. + (if (string-prefix? "powerpc64le" %host-type) + #x80045201 + #x40045201)) (define (add-to-entropy-count port-or-fd n) "Add N to the kernel's entropy count (the value that can be read from -- cgit v1.2.3