Message ID | 20220802112309.28423-1-go.wigust@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series | [bug#56880] gnu: system: file-systems: Add shared flag. | expand |
Hi Oleg, Oleg Pykhalov <go.wigust@gmail.com> skribis: > * gnu/build/file-systems.scm (mount-flags->bit-mask, mount-file-system): > Handle shared flag. > * gnu/system/file-systems.scm (invalid-file-system-flags): Add shared to known > flags. > * guix/build/syscalls.scm (MS_SHARED): New variable. > (option-string->mount-flags): Handle shared flag. > * doc/guix.texi (File Systems): Document shared flag. LGTM, thanks! Ludo’.
Hi Ludovic,
Thank you for the review.
Ludovic Courtès <ludo@gnu.org> writes:
[…]
>> (option-string->mount-flags): Handle shared flag.
I looked again on this procedure before merge. With applied patch it
will return a wrong bitmask according to the manual page:
mount(2)
The only other flags that can be specified while changing the propaga‐
tion type are MS_REC (described below) and MS_SILENT (which is ig‐
nored).
Also I tried to invoke 'mount' from C code, if MS_SHARED specified and
mountpoint does not exist (not mounted without MS_SHARED before), then
nothing will happen.
The procedure is out of the scope adding a shared flag support to
file-system record. I see two variants:
1. Remove the modification from option-string->mount-flags and merge,
someone will add when required.
2. Modify option-string->mount-flags in such way, that it will return
multiple bitmasks or in some other way.
Oleg.
Hi, Oleg Pykhalov <go.wigust@gmail.com> skribis: > Ludovic Courtès <ludo@gnu.org> writes: > > […] > >>> (option-string->mount-flags): Handle shared flag. > > I looked again on this procedure before merge. With applied patch it > will return a wrong bitmask according to the manual page: > > mount(2) > > The only other flags that can be specified while changing the propaga‐ > tion type are MS_REC (described below) and MS_SILENT (which is ig‐ > nored). > > Also I tried to invoke 'mount' from C code, if MS_SHARED specified and > mountpoint does not exist (not mounted without MS_SHARED before), then > nothing will happen. Hmm not sure I follow. > The procedure is out of the scope adding a shared flag support to > file-system record. I see two variants: > > 1. Remove the modification from option-string->mount-flags and merge, > someone will add when required. > > 2. Modify option-string->mount-flags in such way, that it will return > multiple bitmasks or in some other way. I understand option #1 and it sounds reasonable to me. I’m not sure what option #2 means concretely? Thanks, Ludo’.
Ludovic Courtès <ludo@gnu.org> writes: […] >> I looked again on this procedure before merge. With applied patch it >> will return a wrong bitmask according to the manual page: >> >> mount(2) >> >> The only other flags that can be specified while changing the propaga‐ >> tion type are MS_REC (described below) and MS_SILENT (which is ig‐ >> nored). >> >> Also I tried to invoke 'mount' from C code, if MS_SHARED specified and >> mountpoint does not exist (not mounted without MS_SHARED before), then >> nothing will happen. > > Hmm not sure I follow. […] >> 2. Modify option-string->mount-flags in such way, that it will return >> multiple bitmasks or in some other way. […] > I’m not sure what option #2 means concretely? We need to call mount(2) two times, which is not handled by option-string->mount-flags which returns only one mount(2) bitmask. I pushed #1 as 4b494878380920c8c7eecccd1f299164dd4a2c3f to master. Oleg.
diff --git a/doc/guix.texi b/doc/guix.texi index 9d17050ffc..106ab428d9 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -16376,8 +16376,9 @@ include @code{read-only}, @code{bind-mount}, @code{no-dev} (disallow access to special files), @code{no-suid} (ignore setuid and setgid bits), @code{no-atime} (do not update file access times), @code{strict-atime} (update file access time), @code{lazy-time} (only -update time on the in-memory version of the file inode), and -@code{no-exec} (disallow program execution). +update time on the in-memory version of the file inode), +@code{no-exec} (disallow program execution), and @code{shared} (make the +mount shared). @xref{Mount-Unmount-Remount,,, libc, The GNU C Library Reference Manual}, for more information on these flags. diff --git a/gnu/build/file-systems.scm b/gnu/build/file-systems.scm index 1d3b33e7bd..b9d46c9350 100644 --- a/gnu/build/file-systems.scm +++ b/gnu/build/file-systems.scm @@ -6,6 +6,7 @@ ;;; Copyright © 2019–2021 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2019 David C. Trudgian <dave@trudgian.net> ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> +;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -1123,6 +1124,8 @@ (define (mount-flags->bit-mask flags) (logior MS_STRICTATIME (loop rest))) (('lazy-time rest ...) (logior MS_LAZYTIME (loop rest))) + (('shared rest ...) + (loop rest)) (() 0)))) @@ -1186,6 +1189,9 @@ (define (mount-nfs source mount-point type flags options) (cond ((string-prefix? "nfs" type) (mount-nfs source target type flags options)) + ((memq 'shared (file-system-flags fs)) + (mount source target type flags options) + (mount "none" target #f MS_SHARED)) (else (mount source target type flags options))) diff --git a/gnu/system/file-systems.scm b/gnu/system/file-systems.scm index f8f4276283..464b76a2ca 100644 --- a/gnu/system/file-systems.scm +++ b/gnu/system/file-systems.scm @@ -4,6 +4,7 @@ ;;; Copyright © 2020 Jakub Kądziołka <kuba@kadziolka.net> ;;; Copyright © 2020, 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2021 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -121,7 +122,8 @@ (define invalid-file-system-flags ;; Note: Keep in sync with 'mount-flags->bit-mask'. (let ((known-flags '(read-only bind-mount no-suid no-dev no-exec - no-atime strict-atime lazy-time))) + no-atime strict-atime lazy-time + shared))) (lambda (flags) "Return the subset of FLAGS that is invalid." (remove (cut memq <> known-flags) flags)))) diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index a7401fd73f..ef0b1d67fd 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -8,6 +8,7 @@ ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com> ;;; Copyright © 2021 Tobias Geerinckx-Rice <me@tobias.gr> +;;; Copyright © 2022 Oleg Pykhalov <go.wigust@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -49,6 +50,7 @@ (define-module (guix build syscalls) MS_RELATIME MS_BIND MS_MOVE + MS_SHARED MS_LAZYTIME MNT_FORCE MNT_DETACH @@ -537,6 +539,7 @@ (define MS_REMOUNT 32) (define MS_NOATIME 1024) (define MS_BIND 4096) (define MS_MOVE 8192) +(define MS_SHARED 1048576) (define MS_RELATIME 2097152) (define MS_STRICTATIME 16777216) (define MS_LAZYTIME 33554432) @@ -637,7 +640,8 @@ (define lst ("nodev" => MS_NODEV) ("noexec" => MS_NOEXEC) ("relatime" => MS_RELATIME) - ("noatime" => MS_NOATIME))))))) + ("noatime" => MS_NOATIME) + ("shared" => MS_SHARED))))))) (define (mount-flags mount) "Return the mount flags of MOUNT, a <mount> record, as an inclusive or of