[bug#56880] gnu: system: file-systems: Add shared flag.
Commit Message
* 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.
---
doc/guix.texi | 5 +++--
gnu/build/file-systems.scm | 6 ++++++
gnu/system/file-systems.scm | 4 +++-
guix/build/syscalls.scm | 6 +++++-
4 files changed, 17 insertions(+), 4 deletions(-)
Comments
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.
@@ -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.
@@ -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)))
@@ -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))))
@@ -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