Re: [PATCH 21/23] mount_setattr.2: Minor tweaks to Chirstian's patch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello Alex,

All of the below looks good, with one small detail noted below.
I've applied this patch (after fixing the typo in the subject line).

On 8/8/21 10:41 AM, Alejandro Colomar wrote:
> - Fix SYNOPSIS to fit in 78 columns
> 
>   Also, we don't show when an include is included for a specific type,
>   unless that header is included _only_ for the type,
>   or there might be confusion (e.g., termios).
>   Instead, that type should be documented in system_data_types(7),
>   with a link page mount_attr-struct(3).
> 
> - Fix references to mount_setattr().  See man-pages(7):
> 
>        Any reference to the subject of the current manual page should be writ‐
>        ten with the name in bold followed by a pair of  parentheses  in  Roman
>        (normal)  font.   For  example, in the fcntl(2) man page, references to
>        the subject of the page would be written as:  fcntl().   The  preferred
>        way to write this in the source file is:
> 
>            .BR fcntl ()
> 
> - Fix line breaks according to semantic newline rules (and add some commas)
> - Fix wrong usage of .IR when .RI should have been used
> - Fix formatting of variable part in FOO<number>:
>   - Make italic the variable part (as groff_man(7) recommends)
>   - Remove <>
>   - Use syntax recommended by G. Branden Robinson (groff)
> 
> - Fix unnecessary uses of .BR or .IR when .B or .I would suffice
> - Fix formatting of punctuation
> 
>   In some cases, it was in italics or bold, and it should always be in roman.
> 
> - Use uppercase to begin text, even in bullet points, since those were
>   multi-sentence.
> 
> - Simplify usage of .RS/.RE in combination with .IP
> - s/fat/FAT/ as fs(7) does
> - Slightly reword some sentences for consistency
> - Use Linux-specific for consistency with other pages (in VERSIONS)
> - EXAMPLES: Place the return type in a line of its own (as in other pages)
> - Fix alignment of code
> - Replace unnecessary use of the GNU extension ({}) by do {} while (0)
> 
>   In that case, there was no return value (moreover, it's a noreturn).
> 
> - Break complex declaration lines into a line for each variable
> 
>   The variables were being initialized, some to non-zero values,
>   so for clarity, a line for each one seems more appropriate.
> 
> - Add const to pointers when possible

One of those changes resulted in compiler warnings with cc -Wall;
I reverted that change.

> - s/\\/\e/
> - Remove unmatched groff commands
> 
> Cc: Christian Brauner <brauner@xxxxxxxxxx>
> Signed-off-by: Alejandro Colomar <alx.manpages@xxxxxxxxx>

Cheers,

Michael

> ---
>  man2/mount_setattr.2 | 446 ++++++++++++++++++++++---------------------
>  1 file changed, 225 insertions(+), 221 deletions(-)
> 
> diff --git a/man2/mount_setattr.2 b/man2/mount_setattr.2
> index 16881d90d..70ab4592e 100644
> --- a/man2/mount_setattr.2
> +++ b/man2/mount_setattr.2
> @@ -30,13 +30,13 @@ mount_setattr \- change mount properties of a mount or mount tree
>  
>  .PP
>  .BR "#include <linux/fcntl.h>" " /* Definition of " AT_* " constants */"
> -.BR "#include <linux/mount.h>" " /* Definition of struct mount_attr and MOUNT_ATTR_* constants */"
> +.BR "#include <linux/mount.h>" " /* Definition of " MOUNT_ATTR_* " constants */"
>  .BR "#include <sys/syscall.h>" " /* Definition of " SYS_* " constants */"
>  .B #include <unistd.h>
>  .PP
> -.BI "int syscall(SYS_mount_setattr, int " dfd ", const char *" path \
> -", unsigned int " flags \
> -", struct mount_attr *" attr ", size_t " size );
> +.BI "int syscall(SYS_mount_setattr, int " dfd ", const char *" path ,
> +.BI "            unsigned int " flags ", struct mount_attr *" attr \
> +", size_t " size );
>  .fi
>  .PP
>  .IR Note :
> @@ -46,13 +46,13 @@ necessitating the use of
>  .BR syscall (2).
>  .SH DESCRIPTION
>  The
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  system call changes the mount properties of a mount or entire mount tree.
>  If
>  .I path
>  is a relative pathname,
> -then it is interpreted relative to the directory referred to by the file
> -descriptor
> +then it is interpreted relative to
> +the directory referred to by the file descriptor
>  .IR dfd .
>  If
>  .I dfd
> @@ -60,24 +60,25 @@ is the special value
>  .B AT_FDCWD
>  then
>  .I path
> -is taken to be relative to the current working directory of the calling process.
> +is interpreted relative to
> +the current working directory of the calling process.
>  If
>  .I path
>  is the empty string and
> -.BR AT_EMPTY_PATH
> +.B AT_EMPTY_PATH
>  is specified in
> -.I flags
> +.IR flags ,
>  then the mount properties of the mount identified by
>  .I dfd
>  are changed.
>  .PP
>  The
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  system call uses an extensible structure
> -.IR ( "struct mount_attr" )
> +.RI ( "struct mount_attr" )
>  to allow for future extensions.
>  Any non-flag extensions to
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  will be implemented as new fields appended to the above structure,
>  with a zero value in a new field resulting in the kernel behaving
>  as though that extension field was not present.
> @@ -94,17 +95,18 @@ The
>  argument should usually be specified as
>  .IR "sizeof(struct mount_attr)" .
>  However,
> -if the caller does not intend to make use of features that got
> -introduced after the initial version of
> +if the caller does not intend to make use of features that
> +got introduced after the initial version of
>  .I struct mount_attr
> -they are free to pass the size of the initial struct together with the larger
> -struct.
> -This allows the kernel to not copy later parts of the struct that aren't used
> -anyway.
> +they are free to pass
> +the size of the initial struct together with the larger struct.
> +This allows the kernel to not copy later parts of the struct
> +that aren't used anyway.
>  With each extension that changes the size of
>  .I struct mount_attr
>  the kernel will expose a define of the form
> -.BR MOUNT_ATTR_SIZE_VER<number> .
> +.BI MOUNT_ATTR_SIZE_VER number\c
> +\&.
>  For example the macro for the size of the initial version of
>  .I struct mount_attr
>  is
> @@ -118,7 +120,8 @@ The supported values are:
>  .B AT_EMPTY_PATH
>  If
>  .I path
> -is the empty string change the mount properties on
> +is the empty string,
> +change the mount properties on
>  .I dfd
>  itself.
>  .TP
> @@ -134,7 +137,7 @@ Don't trigger automounts.
>  The
>  .I attr
>  argument of
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  is a structure of the following form:
>  .PP
>  .in +4n
> @@ -152,18 +155,21 @@ The
>  .I attr_set
>  and
>  .I attr_clr
> -members are used to specify the mount properties that are supposed to be set or
> -cleared for a mount or mount tree.
> +members are used to specify the mount properties that
> +are supposed to be set or cleared for a mount or mount tree.
>  Flags set in
>  .I attr_set
> -enable a property on a mount or mount tree and flags set in
> +enable a property on a mount or mount tree,
> +and flags set in
>  .I attr_clr
>  remove a property from a mount or mount tree.
>  .PP
> -When changing mount properties the kernel will first clear the flags specified
> +When changing mount properties,
> +the kernel will first clear the flags specified
>  in the
>  .I attr_clr
> -field and then set the flags specified in the
> +field,
> +and then set the flags specified in the
>  .I attr_set
>  field:
>  .PP
> @@ -192,8 +198,8 @@ mnt->mnt_flags = current_mnt_flags;
>  .in
>  .PP
>  The effect of this change will be a mount or mount tree that is read-only,
> -blocks the execution of set-user-ID and set-group-ID binaries but does allow to
> -execute programs and access to devices nodes.
> +blocks the execution of set-user-ID and set-group-ID binaries,
> +but does allow to execute programs and access to devices nodes.
>  Multiple changes with the same set of flags requested
>  in
>  .I attr_clr
> @@ -210,7 +216,8 @@ fields:
>  .B MOUNT_ATTR_RDONLY
>  If set in
>  .I attr_set
> -makes the mount read-only and if set in
> +makes the mount read-only,
> +and if set in
>  .I attr_clr
>  removes the read-only setting if set on the mount.
>  .TP
> @@ -227,46 +234,50 @@ and file capability restriction if set on this mount.
>  .B MOUNT_ATTR_NODEV
>  If set in
>  .I attr_set
> -prevents access to devices on this mount and if set in
> +prevents access to devices on this mount,
> +and if set in
>  .I attr_clr
> -removes the device access restriction if set on this mount.
> +removes the restriction that prevented accesing devices on this mount.
>  .TP
> -.BR MOUNT_ATTR_NOEXEC
> +.B MOUNT_ATTR_NOEXEC
>  If set in
>  .I attr_set
> -prevents executing programs on this mount and if set in
> +prevents executing programs on this mount,
> +and if set in
>  .I attr_clr
> -removes the restriction to execute programs on this mount.
> +removes the restriction that prevented executing programs on this mount.
>  .TP
> -.BR MOUNT_ATTR_NOSYMFOLLOW
> +.B MOUNT_ATTR_NOSYMFOLLOW
>  If set in
>  .I attr_set
> -prevents following symlinks on this mount and if set in
> +prevents following symlinks on this mount,
> +and if set in
>  .I attr_clr
> -removes the restriction to not follow symlinks on this mount.
> +removes the restriction that prevented following symlinks on this mount.
>  .TP
>  .B MOUNT_ATTR_NODIRATIME
>  If set in
>  .I attr_set
> -prevents updating access time for directories on this mount and if set in
> +prevents updating access time for directories on this mount,
> +and if set in
>  .I attr_clr
> -removes access time restriction for directories.
> +removes the restriction that prevented updating access time for directories.
>  Note that
> -.BR MOUNT_ATTR_NODIRATIME
> -can be combined with other access time settings and is implied
> -by the noatime setting.
> +.B MOUNT_ATTR_NODIRATIME
> +can be combined with other access time settings
> +and is implied by the noatime setting.
>  All other access time settings are mutually exclusive.
>  .TP
>  .BR MOUNT_ATTR__ATIME " - Changing access time settings
> -In the new mount api the access time values are an enum starting from 0.
> +In the new mount API the access time values are an enum starting from 0.
>  Even though they are an enum in contrast to the other mount flags such as
> -.BR MOUNT_ATTR_NOEXEC
> +.BR MOUNT_ATTR_NOEXEC ,
>  they are nonetheless passed in
>  .I attr_set
>  and
>  .I attr_clr
>  for consistency with
> -.BR fsmount (2)
> +.BR fsmount (2),
>  which introduced this behavior.
>  .IP
>  Note,
> @@ -281,68 +292,67 @@ in the
>  .I attr_clr
>  field.
>  The kernel will verify that
> -.BR MOUNT_ATTR__ATIME
> +.B MOUNT_ATTR__ATIME
>  isn't partially set in
> -.I attr_clr
> +.IR attr_clr ,
>  and that
>  .I attr_set
>  doesn't have any access time bits set if
> -.BR MOUNT_ATTR__ATIME
> +.B MOUNT_ATTR__ATIME
>  isn't set in
>  .IR attr_clr .
>  .RS
>  .TP
>  .B MOUNT_ATTR_RELATIME
>  When a file is accessed via this mount,
> -update the file's last access time
> -(atime)
> -only if the current value of atime is less than or equal to the file's
> -last modification time (mtime) or last status change time (ctime).
> +update the file's last access time (atime)
> +only if the current value of atime is less than or equal to
> +the file's last modification time (mtime) or last status change time (ctime).
>  .IP
> -To enable this access time setting on a mount or mount tree
> -.BR MOUNT_ATTR_RELATIME
> +To enable this access time setting on a mount or mount tree,
> +.B MOUNT_ATTR_RELATIME
>  must be set in
>  .I attr_set
>  and
> -.BR MOUNT_ATTR__ATIME
> +.B MOUNT_ATTR__ATIME
>  must be set in the
>  .I attr_clr
>  field.
>  .TP
> -.BR MOUNT_ATTR_NOATIME
> +.B MOUNT_ATTR_NOATIME
>  Do not update access times for (all types of) files on this mount.
>  .IP
> -To enable this access time setting on a mount or mount tree
> -.BR MOUNT_ATTR_NOATIME
> +To enable this access time setting on a mount or mount tree,
> +.B MOUNT_ATTR_NOATIME
>  must be set in
>  .I attr_set
>  and
> -.BR MOUNT_ATTR__ATIME
> +.B MOUNT_ATTR__ATIME
>  must be set in the
>  .I attr_clr
>  field.
>  .TP
> -.BR MOUNT_ATTR_STRICTATIME
> -Always update the last access time (atime) when files are accessed on this
> -mount.
> +.B MOUNT_ATTR_STRICTATIME
> +Always update the last access time (atime)
> +when files are accessed on this mount.
>  .IP
> -To enable this access time setting on a mount or mount tree
> -.BR MOUNT_ATTR_STRICTATIME
> +To enable this access time setting on a mount or mount tree,
> +.B MOUNT_ATTR_STRICTATIME
>  must be set in
>  .I attr_set
>  and
> -.BR MOUNT_ATTR__ATIME
> +.B MOUNT_ATTR__ATIME
>  must be set in the
>  .I attr_clr
>  field.
>  .RE
>  .TP
> -.BR MOUNT_ATTR_IDMAP
> +.B MOUNT_ATTR_IDMAP
>  If set in
>  .I attr_set
>  creates an idmapped mount.
> -Since it is not supported to change the idmapping of a mount after it has been
> -idmapped,
> +Since it is not supported to
> +change the idmapping of a mount after it has been idmapped,
>  it is invalid to specify
>  .B MOUNT_ATTR_IDMAP
>  in
> @@ -350,54 +360,51 @@ in
>  The idmapping is taken from the user namespace specified in
>  .I userns_fd
>  and attached to the mount.
> -More details can be found in subsequent paragraphs.
>  .IP
> -Creating an idmapped mount allows to change the ownership of all files located
> -under a mount.
> -Thus, idmapped mounts make it possible to change ownership in a temporary and
> -localized way.
> -It is a localized change because ownership changes are restricted to a specific
> -mount.
> +Creating an idmapped mount allows to
> +change the ownership of all files located under a mount.
> +Thus, idmapped mounts make it possible to
> +change ownership in a temporary and localized way.
> +It is a localized change because
> +ownership changes are restricted to a specific mount.
>  All other users and locations where the filesystem is exposed are unaffected.
> -And it is a temporary change because ownership changes are tied to the lifetime
> -of the mount.
> +And it is a temporary change because
> +ownership changes are tied to the lifetime of the mount.
>  .IP
> -Whenever callers interact with the filesystem through an idmapped mount the
> -idmapping of the mount will be applied to user and group IDs associated with
> -filesystem objects.
> -This encompasses the user and group IDs associated with inodes and also
> -the following
> +Whenever callers interact with the filesystem through an idmapped mount,
> +the idmapping of the mount will be applied to
> +user and group IDs associated with filesystem objects.
> +This encompasses the user and group IDs associated with inodes
> +and also the following
>  .BR xattr (7)
>  keys:
>  .RS
> -.RS
> -.IP \(bu 2
> -.IR security.capability
> +.IP \(bu
> +.IR security.capability ,
>  whenever filesystem
>  .BR capabilities (7)
>  are stored or returned in the
>  .I VFS_CAP_REVISION_3
> -format which stores a rootid alongside the capabilities.
> -.IP \(bu 2
> +format,
> +which stores a rootid alongside the capabilities.
> +.IP \(bu
>  .I system.posix_acl_access
>  and
> -.I system.posix_acl_default
> +.IR system.posix_acl_default ,
>  whenever user IDs or group IDs are stored in
> -.BR ACL_USER
> -and
> -.BR ACL_GROUP
> +.B ACL_USER
> +or
> +.B ACL_GROUP
>  entries.
>  .RE
> -.RE
>  .IP
>  The following conditions must be met in order to create an idmapped mount:
>  .RS
> -.RS
> -.IP \(bu 2
> +.IP \(bu
>  The caller must have
>  .I CAP_SYS_ADMIN
>  in the initial user namespace.
> -.IP \(bu 2
> +.IP \(bu
>  The filesystem must be mounted in the initial user namespace.
>  .IP \(bu
>  The underlying filesystem must support idmapped mounts.
> @@ -405,9 +412,9 @@ Currently
>  .BR xfs (5),
>  .BR ext4 (5)
>  and
> -.BR fat
> -filesystems support idmapped mounts with more filesystems being actively worked
> -on.
> +.B FAT
> +filesystems support idmapped mounts
> +with more filesystems being actively worked on.
>  .IP \(bu
>  The mount must not already be idmapped.
>  This also implies that the idmapping of a mount cannot be altered.
> @@ -420,24 +427,24 @@ with the
>  .I OPEN_TREE_CLONE
>  flag and it must not already have been visible in the filesystem.
>  .RE
> -.RE
>  .IP
>  Idmappings can be created for user IDs, group IDs, and project IDs.
>  An idmapping is essentially a mapping of a range of user or group IDs into
>  another or the same range of user or group IDs.
> -Idmappings are usually written as three numbers either separated by white space
> -or a full stop.
> -The first two numbers specify the starting user or group ID in each of the two
> -user namespaces.
> +Idmappings are usually written as three numbers
> +either separated by white space or a full stop.
> +The first two numbers specify the starting user or group ID
> +in each of the two user namespaces.
>  The third number specifies the range of the idmapping.
>  For example, a mapping for user IDs such as 1000:1001:1 would indicate that
> -user ID 1000 in the caller's user namespace is mapped to user ID 1001 in its
> -ancestor user namespace.
> -Since the map range is 1 only user ID 1000 is mapped.
> +user ID 1000 in the caller's user namespace is mapped to
> +user ID 1001 in its ancestor user namespace.
> +Since the map range is 1,
> +only user ID 1000 is mapped.
>  It is possible to specify up to 340 idmappings for each idmapping type.
> -If any user IDs or group IDs are not mapped all files owned by that unmapped
> -user or group ID will appear as being owned by the overflow user ID or overflow
> -group ID respectively.
> +If any user IDs or group IDs are not mapped,
> +all files owned by that unmapped user or group ID will appear as
> +being owned by the overflow user ID or overflow group ID respectively.
>  Further details and instructions for setting up idmappings can be found in the
>  .BR user_namespaces (7)
>  man page.
> @@ -445,69 +452,70 @@ man page.
>  In the common case the user namespace passed in
>  .I userns_fd
>  together with
> -.BR MOUNT_ATTR_IDMAP
> +.B MOUNT_ATTR_IDMAP
>  in
>  .I attr_set
>  to create an idmapped mount will be the user namespace of a container.
> -In other scenarios it will be a dedicated user namespace associated with a
> -user's login session as is the case for portable home directories in
> +In other scenarios it will be a dedicated user namespace associated with
> +a user's login session as is the case for portable home directories in
>  .BR systemd-homed.service (8) ).
> -It is also perfectly fine to create a dedicated user namespace for the sake of
> -idmapping a mount.
> +It is also perfectly fine to create a dedicated user namespace
> +for the sake of idmapping a mount.
>  .IP
> -Idmapped mounts can be useful in the following and a variety of other
> -scenarios:
> +Idmapped mounts can be useful in the following
> +and a variety of other scenarios:
>  .RS
> -.RS
> -.IP \(bu 2
> -sharing files between multiple users or multiple machines especially in
> -complex scenarios.
> +.IP \(bu
> +Sharing files between multiple users or multiple machines,
> +especially in complex scenarios.
>  For example,
>  idmapped mounts are used to implement portable home directories in
>  .BR systemd-homed.service (8)
> -where they allow users to move their home directory to an external storage
> -device and use it on multiple computers where they are assigned different user IDs
> -and group IDs.
> -This effectively makes it possible to assign random user IDs and group IDs at login time.
> +where they allow users to move their home directory
> +to an external storage device
> +and use it on multiple computers
> +where they are assigned different user IDs and group IDs.
> +This effectively makes it possible to
> +assign random user IDs and group IDs at login time.
>  .IP \(bu
> -sharing files from the host with unprivileged containers.
> -This allows user to avoid having to change ownership permanently through
> +Sharing files from the host with unprivileged containers.
> +This allows a user to avoid having to change ownership permanently through
>  .BR chown (2) .
>  .IP \(bu
> -idmapping a container's root filesystem.
> -Users don't need to change ownership
> -permanently through
> +Idmapping a container's root filesystem.
> +Users don't need to change ownership permanently through
>  .BR chown (2) .
> -Especially for large root filesystems using
> +Especially for large root filesystems, using
>  .BR chown (2)
>  can be prohibitively expensive.
>  .IP \(bu
> -sharing files between containers with non-overlapping
> -idmappings.
> +Sharing files between containers with non-overlapping idmappings.
>  .IP \(bu
> -implementing discretionary access (DAC) permission checking for fileystems
> -lacking a concept of ownership.
> +Implementing discretionary access (DAC) permission checking
> +for fileystems lacking a concept of ownership.
>  .IP \(bu
> -efficiently change ownership on a per-mount basis.
> +Efficiently change ownership on a per-mount basis.
>  In contrast to
> -.BR chown (2)
> +.BR chown (2),
>  changing ownership of large sets of files is instantenous with idmapped mounts.
> -This is especially useful when ownership of an entire root filesystem of a
> -virtual machine or container is to be changed as we've mentioned above.
> -With idmapped mounts a single
> -.BR mount_setattr (2)
> +This is especially useful when ownership of
> +an entire root filesystem of a virtual machine or container
> +is to be changed as we've mentioned above.
> +With idmapped mounts,
> +a single
> +.BR mount_setattr ()
>  system call will be sufficient to change the ownership of all files.
>  .IP \(bu
> -taking the current ownership into account.
> -Idmappings specify precisely what a user or group ID is supposed to be
> -mapped to.
> +Taking the current ownership into account.
> +Idmappings specify precisely
> +what a user or group ID is supposed to be mapped to.
>  This contrasts with the
>  .BR chown (2)
> -system call which cannot by itself take the current ownership of the files it
> -changes into account.
> +system call which cannot by itself
> +take the current ownership of the files it changes into account.
>  It simply changes the ownership to the specified user ID and group ID.
>  .IP \(bu
> -locally and temporarily restricted ownership changes.
> +Locally and temporarily restricted ownership changes.
>  Idmapped mounts allow to change ownership locally,
>  restricting it to specific mounts,
>  and temporarily as the ownership changes only apply as long as the mount exists.
> @@ -516,7 +524,6 @@ changing ownership via the
>  .BR chown (2)
>  system call changes the ownership globally and permanently.
>  .RE
> -.RE
>  .PP
>  The
>  .I propagation
> @@ -538,13 +545,13 @@ will propagate to the other mount points that are members of the peer group.
>  Propagation here means that the same mount or unmount will automatically occur
>  under all of the other mount points in the peer group.
>  Conversely,
> -mount and unmount events that take place under peer mount points will propagate
> -to this mount point.
> +mount and unmount events that take place under peer mount points
> +will propagate to this mount point.
>  .TP
>  .B MS_SLAVE
>  Turn all mounts into dependent mounts.
> -Mount and unmount events propagate into this mount point from a shared peer
> -group.
> +Mount and unmount events propagate into this mount point
> +from a shared peer group.
>  Mount and unmount events under this mount point do not propagate to any peer.
>  .TP
>  .B MS_UNBINDABLE
> @@ -558,7 +565,7 @@ when replicating that subtree to produce the target subtree.
>  .PP
>  .SH RETURN VALUE
>  On success,
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  returns zero.
>  On error,
>  \-1 is returned and
> @@ -576,8 +583,8 @@ is not a valid file descriptor.
>  .TP
>  .B EBUSY
>  The caller tried to change the mount to
> -.BR MOUNT_ATTR_RDONLY
> -but the mount still has files open for writing.
> +.B MOUNT_ATTR_RDONLY
> +but the mount still holds files open for writing.
>  .TP
>  .B EINVAL
>  The path specified via the
> @@ -585,7 +592,7 @@ The path specified via the
>  and
>  .I path
>  arguments to
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  isn't a mountpoint.
>  .TP
>  .B EINVAL
> @@ -612,11 +619,11 @@ field of
>  .TP
>  .B EINVAL
>  More than one of
> -.BR MS_SHARED,
> -.BR MS_SLAVE,
> -.BR MS_PRIVATE,
> +.BR MS_SHARED ,
> +.BR MS_SLAVE ,
> +.BR MS_PRIVATE ,
>  or
> -.BR MS_UNBINDABLE
> +.B MS_UNBINDABLE
>  was set in
>  .I propagation
>  field of
> @@ -626,13 +633,13 @@ field of
>  An access time setting was specified in the
>  .I attr_set
>  field without
> -.BR MOUNT_ATTR__ATIME
> +.B MOUNT_ATTR__ATIME
>  being set in the
>  .I attr_clr
>  field.
>  .TP
>  .B EINVAL
> -.BR MOUNT_ATTR_IDMAP
> +.B MOUNT_ATTR_IDMAP
>  was specified in
>  .IR attr_clr .
>  .TP
> @@ -645,8 +652,8 @@ which exceeds
>  .B EINVAL
>  A valid file descriptor value was specified in
>  .I userns_fd
> -but the file descriptor wasn't a namespace file descriptor or did not refer to
> -a user namespace.
> +but the file descriptor wasn't a namespace file descriptor
> +or did not refer to a user namespace.
>  .TP
>  .B EINVAL
>  The underlying filesystem does not support idmapped mounts.
> @@ -660,7 +667,7 @@ the mount is already visible in the filesystem.
>  A partial access time setting was specified in
>  .I attr_clr
>  instead of
> -.BR MOUNT_ATTR__ATIME
> +.B MOUNT_ATTR__ATIME
>  being set.
>  .TP
>  .B EINVAL
> @@ -674,14 +681,14 @@ A pathname was empty or had a nonexistent component.
>  .TP
>  .B ENOMEM
>  When changing mount propagation to
> -.BR MS_SHARED
> +.B MS_SHARED
>  a new peer group id needs to be allocated for all mounts without a peer group
>  id set.
>  Allocation of this peer group id has failed.
>  .TP
>  .B ENOSPC
>  When changing mount propagation to
> -.BR MS_SHARED
> +.B MS_SHARED
>  a new peer group id needs to be allocated for all mounts without a peer group
>  id set.
>  Allocation of this peer group id can fail.
> @@ -690,25 +697,25 @@ id allocation implementation used.
>  .TP
>  .B EPERM
>  One of the mounts had at least one of
> -.BR MOUNT_ATTR_NOATIME,
> -.BR MOUNT_ATTR_NODEV,
> -.BR MOUNT_ATTR_NODIRATIME,
> -.BR MOUNT_ATTR_NOEXEC,
> -.BR MOUNT_ATTR_NOSUID,
> +.BR MOUNT_ATTR_NOATIME ,
> +.BR MOUNT_ATTR_NODEV ,
> +.BR MOUNT_ATTR_NODIRATIME ,
> +.BR MOUNT_ATTR_NOEXEC ,
> +.BR MOUNT_ATTR_NOSUID ,
>  or
> -.BR MOUNT_ATTR_RDONLY
> +.B MOUNT_ATTR_RDONLY
>  set and the flag is locked.
>  Mount attributes become locked on a mount if:
>  .RS
> -.IP \(bu 2
> -a new mount or mount tree is created causing mount propagation across user
> +.IP \(bu
> +A new mount or mount tree is created causing mount propagation across user
>  namespaces.
>  The kernel will lock the aforementioned flags to protect these sensitive
>  properties from being altered.
>  .IP \(bu
> -a new mount and user namespace pair is created.
> +A new mount and user namespace pair is created.
>  This happens for example when specifying
> -.BR CLONE_NEWUSER | CLONE_NEWNS
> +.B CLONE_NEWUSER | CLONE_NEWNS
>  in
>  .BR unshare (2),
>  .BR clone (2),
> @@ -731,18 +738,18 @@ The caller does not have
>  .I CAP_SYS_ADMIN
>  in the initial user namespace.
>  .SH VERSIONS
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  first appeared in Linux 5.12.
>  .\" commit 7d6beb71da3cc033649d641e1e608713b8220290
>  .\" commit 2a1867219c7b27f928e2545782b86daaf9ad50bd
>  .\" commit 9caccd41541a6f7d6279928d9f971f6642c361af
>  .SH CONFORMING TO
> -.BR mount_setattr (2)
> -is Linux specific.
> +.BR mount_setattr ()
> +is Linux-specific.
>  .SH NOTES
>  .SS Extensibility
>  In order to allow for future extensibility,
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  along with other system calls such as
>  .BR openat2 (2)
>  and
> @@ -751,7 +758,7 @@ requires the user-space application to specify the size of the
>  .I mount_attr
>  structure that it is passing.
>  By providing this information, it is possible for
> -.BR mount_setattr (2)
> +.BR mount_setattr ()
>  to provide both forwards- and backwards-compatibility, with
>  .I size
>  acting as an implicit version number.
> @@ -771,10 +778,9 @@ and let
>  .I ksize
>  be the size of the structure which the kernel supports,
>  then there are three cases to consider:
> -.RS
> -.IP \(bu 2
> +.IP \(bu
>  If
> -.IR ksize
> +.I ksize
>  equals
>  .IR usize ,
>  then there is no version mismatch and
> @@ -782,31 +788,32 @@ then there is no version mismatch and
>  can be used verbatim.
>  .IP \(bu
>  If
> -.IR ksize
> +.I ksize
>  is larger than
>  .IR usize ,
> -then there are some extension fields that the kernel supports which the
> -user-space application is unaware of.
> +then there are some extension fields that the kernel supports
> +which the user-space application is unaware of.
>  Because a zero value in any added extension field signifies a no-op,
> -the kernel treats all of the extension fields not provided by the user-space
> -application as having zero values.
> +the kernel treats all of the extension fields
> +not provided by the user-space application
> +as having zero values.
>  This provides backwards-compatibility.
>  .IP \(bu
>  If
> -.IR ksize
> +.I ksize
>  is smaller than
>  .IR usize ,
>  then there are some extension fields which the user-space application is aware
>  of but which the kernel does not support.
>  Because any extension field must have its zero values signify a no-op,
> -the kernel can safely ignore the unsupported extension fields if they are
> -all zero.
> -If any unsupported extension fields are non-zero, then \-1 is returned and
> +the kernel can safely ignore the unsupported extension fields
> +if they are all zero.
> +If any unsupported extension fields are non-zero,
> +then \-1 is returned and
>  .I errno
>  is set to
>  .BR E2BIG .
>  This provides forwards-compatibility.
> -.RE
>  .PP
>  Because the definition of
>  .I struct mount_attr
> @@ -842,7 +849,7 @@ attr.attr_clr = MOUNT_ATTR_NODEV;
>  .PP
>  A user-space application that wishes to determine which extensions the running
>  kernel supports can do so by conducting a binary search on
> -.IR size
> +.I size
>  with a structure which has every byte nonzero
>  (to find the largest value which doesn't produce an error of
>  .BR E2BIG ) .
> @@ -865,30 +872,26 @@ with a structure which has every byte nonzero
>  #include <sys/syscall.h>
>  #include <unistd.h>
>  
> -static inline int mount_setattr(int dfd,
> -                                const char *path,
> -                                unsigned int flags,
> -                                struct mount_attr *attr,
> -                                size_t size)
> +static inline int
> +mount_setattr(int dfd, const char *path, unsigned int flags,
> +              struct mount_attr *attr, size_t size)
>  {
> -    return syscall(SYS_mount_setattr, dfd, path,
> -                   flags, attr, size);
> +    return syscall(SYS_mount_setattr, dfd, path, flags, attr, size);
>  }
>  
> -static inline int open_tree(int dfd, const char *filename,
> +static inline int
> +open_tree(int dfd, const char *filename,
>                              unsigned int flags)
>  {
>      return syscall(SYS_open_tree, dfd, filename, flags);
>  }
>  
> -static inline int move_mount(int from_dfd,
> -                             const char *from_pathname,
> -                             int to_dfd,
> -                             const char *to_pathname,
> -                             unsigned int flags)
> +static inline int
> +move_mount(int from_dfd, const char *from_pathname,
> +           int to_dfd, const char *to_pathname, unsigned int flags)
>  {
> -    return syscall(SYS_move_mount, from_dfd,
> -                   from_pathname, to_dfd, to_pathname, flags);
> +    return syscall(SYS_move_mount, from_dfd, from_pathname,
> +                   to_dfd, to_pathname, flags);
>  }
>  
>  static const struct option longopts[] = {
> @@ -902,23 +905,25 @@ static const struct option longopts[] = {
>      { NULL,             0,                  NULL,   0 },
>  };
>  
> -#define exit_log(format, ...)                   \\
> -    ({                                          \\
> -        fprintf(stderr, format, ##__VA_ARGS__); \\
> -        exit(EXIT_FAILURE);                     \\
> -    })
> +#define exit_log(format, ...)  do           \e
> +{                                           \e
> +    fprintf(stderr, format, ##__VA_ARGS__); \e
> +    exit(EXIT_FAILURE);                     \e
> +} while (0)
>  
> -int main(int argc, char *argv[])
> +int
> +main(int argc, char *argv[])
>  {
> -    int fd_userns = \-EBADF, index = 0;
> +    int fd_userns = \-EBADF;
> +    int index = 0;
>      bool recursive = false;
>      struct mount_attr *attr = &(struct mount_attr){};
>      const char *source, *target;
>      int fd_tree, new_argc, ret;
> -    char *const *new_argv;
> +    const char *const *new_argv;
>  
>      while ((ret = getopt_long_only(argc, argv, "",
> -                                  longopts, &index)) != \-1) {
> +                                   longopts, &index)) != \-1) {
>          switch (ret) {
>          case 'a':
>              fd_userns = open(optarg, O_RDONLY | O_CLOEXEC);
> @@ -985,7 +990,6 @@ int main(int argc, char *argv[])
>      exit(EXIT_SUCCESS);
>  }
>  .EE
> -.fi
>  .SH SEE ALSO
>  .BR capabilities (7),
>  .BR clone (2),
> 


-- 
Michael Kerrisk
Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
Linux/UNIX System Programming Training: http://man7.org/training/



[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux