Provided by: manpages-dev_6.16-1_all bug

NAME

       fsconfig - configure new or existing filesystem context

LIBRARY

       Standard C library (libc, -lc)

SYNOPSIS

       #include <sys/mount.h>

       int fsconfig(int fd, unsigned int cmd,
                    const char *_Nullable key,
                    const void *_Nullable value, int aux);

DESCRIPTION

       The fsconfig() system call is part of the suite of file-descriptor-based mount facilities in Linux.

       fsconfig()  is  used  to  supply  parameters  to  and issue commands against the filesystem configuration
       context associated with the file descriptor fd.  Filesystem configuration contexts can  be  created  with
       fsopen(2) or be instantiated from an extant filesystem instance with fspick(2).

       The  cmd  argument  indicates  the  command to be issued.  Some commands supply parameters to the context
       (equivalent to mount options specified with mount(8)), while others are meta-operations on the filesystem
       context.  The list of valid cmd values are:

              FSCONFIG_SET_FLAG
                     Set the flag parameter named by key.  value must be NULL, and aux must be 0.

              FSCONFIG_SET_STRING
                     Set the string parameter named by key to the value specified by value.  value points  to  a
                     null-terminated string, and aux must be 0.

              FSCONFIG_SET_BINARY
                     Set  the blob parameter named by key to the contents of the binary blob specified by value.
                     value points to the start of a buffer that is aux bytes in length.

              FSCONFIG_SET_FD
                     Set the file parameter named by key to the open file description  referenced  by  the  file
                     descriptor aux.  value must be NULL.

                     You  may  also  use  FSCONFIG_SET_STRING  for  file  parameters,  with value set to a null-
                     terminated string containing a base-10 representation of the file descriptor number.   This
                     mechanism  is  primarily intended for compatibility with older mount(2)-based programs, and
                     only works for parameters that only accept file descriptor arguments.

              FSCONFIG_SET_PATH
                     Set the path parameter named by key to the object at a provided path, resolved in a similar
                     manner to openat(2).  value points  to  a  null-terminated  pathname  string,  and  aux  is
                     equivalent  to  the  dirfd  argument to openat(2).  See openat(2) for an explanation of the
                     need for FSCONFIG_SET_PATH.

                     You may also use FSCONFIG_SET_STRING  for  path  parameters,  the  behaviour  of  which  is
                     equivalent to FSCONFIG_SET_PATH with aux set to AT_FDCWD.

              FSCONFIG_SET_PATH_EMPTY
                     As  with  FSCONFIG_SET_PATH,  except  that if value is an empty string, the file descriptor
                     specified by aux is operated on  directly  and  may  be  any  type  of  file  (not  just  a
                     directory).   This is equivalent to the behaviour of AT_EMPTY_PATH with most "*at()" system
                     calls.  If aux is AT_FDCWD, the parameter will be set to the current working  directory  of
                     the calling process.

              FSCONFIG_CMD_CREATE
                     This  command  instructs the filesystem driver to instantiate an instance of the filesystem
                     in the kernel with the parameters specified in the filesystem configuration  context.   key
                     and value must be NULL, and aux must be 0.

                     This  command  can  only  be  issued  once in the lifetime of a filesystem context.  If the
                     operation  succeeds,  the  filesystem  context  associated  with  file  descriptor  fd  now
                     references  the  created filesystem instance, and is placed into a special "awaiting-mount"
                     mode that allows you to use fsmount(2)  to  create  a  mount  object  from  the  filesystem
                     instance.   If  the  operation  fails,  in most cases the filesystem context is placed in a
                     failed mode and cannot be used for any further fsconfig() operations (though you may  still
                     retrieve  diagnostic  messages through the message retrieval interface, as described in the
                     corresponding subsection of fsopen(2)).

                     This command can only be issued against filesystem configuration contexts that were created
                     with fsopen(2).  In order to create a filesystem instance, the calling  process  must  have
                     the CAP_SYS_ADMIN capability.

                     An  important  thing  to  be  aware  of is that the Linux kernel will silently reuse extant
                     filesystem instances depending on the filesystem type and the configured  parameters  (each
                     filesystem  driver has its own policy for how filesystem instances are reused).  This means
                     that the filesystem instance "created" by FSCONFIG_CMD_CREATE may, in fact, be a  reference
                     to  an  extant  filesystem  instance  in  the  kernel.  (For reference, this behaviour also
                     applies to mount(2).)

                     One side-effect of this behaviour is that if an extant filesystem instance is  reused,  all
                     parameters  configured for this filesystem configuration context are silently ignored (with
                     the exception of the ro and rw flag parameters; if the state of the read-only flag  in  the
                     extant  filesystem  instance  and  the  filesystem configuration context do not match, this
                     operation will return EBUSY).   This  also  means  that  FSCONFIG_CMD_RECONFIGURE  commands
                     issued  against  the  "created"  filesystem  instance  will  also  affect any mount objects
                     associated with the extant filesystem instance.

                     Programs that need to ensure that they create  a  new  filesystem  instance  with  specific
                     parameters  (notably,  security-related  parameters  such  as  acl  to enable POSIX ACLs—as
                     described in acl(5)) should use FSCONFIG_CMD_CREATE_EXCL instead.

              FSCONFIG_CMD_CREATE_EXCL (since Linux 6.6)
                     As with FSCONFIG_CMD_CREATE, except that the kernel  is  instructed  to  not  reuse  extant
                     filesystem  instances.   If  the  operation  would  be forced to reuse an extant filesystem
                     instance, this operation will return EBUSY instead.

                     As a result (unlike FSCONFIG_CMD_CREATE), if  this  operation  succeeds  then  the  calling
                     process can be sure that all of the parameters successfully configured with fsconfig() will
                     actually be applied to the created filesystem instance.

              FSCONFIG_CMD_RECONFIGURE
                     This  command  instructs  the  filesystem  driver  to apply the parameters specified in the
                     filesystem configuration context to  the  extant  filesystem  instance  referenced  by  the
                     filesystem configuration context.  key and value must be NULL, and aux must be 0.

                     This  is  primarily  intended  for  use  with fspick(2), but may also be used to modify the
                     parameters of a filesystem instance after FSCONFIG_CMD_CREATE was used to create it  and  a
                     mount  object  was  created using fsmount(2).  In order to reconfigure an extant filesystem
                     instance, the calling process must have the CAP_SYS_ADMIN capability.

                     If the operation succeeds, the filesystem context is reset but remains  in  reconfiguration
                     mode  and  thus  can  be  reused  for subsequent FSCONFIG_CMD_RECONFIGURE commands.  If the
                     operation fails, in most cases the filesystem context is placed in a failed mode and cannot
                     be used for any further fsconfig() operations (though you  may  still  retrieve  diagnostic
                     messages  through  the  message  retrieval  interface,  as  described  in the corresponding
                     subsection of fsopen(2)).

       Parameters specified with FSCONFIG_SET_* do not take effect until a corresponding FSCONFIG_CMD_CREATE  or
       FSCONFIG_CMD_RECONFIGURE command is issued.

RETURN VALUE

       On success, fsconfig() returns 0.  On error, -1 is returned, and errno is set to indicate the error.

ERRORS

       If  an error occurs, the filesystem driver may provide additional information about the error through the
       message retrieval interface for filesystem configuration contexts.  This additional  information  can  be
       retrieved  at  any time by calling read(2) on the filesystem instance or filesystem configuration context
       referenced by the file descriptor fd.  (See the "Message retrieval interface" subsection in fsopen(2) for
       more details on the message format.)

       Even after an error occurs, the filesystem configuration context is not invalidated, and thus  can  still
       be  used  with  other  fsconfig()  commands.   This  means  that  users  can probe support for filesystem
       parameters on a per-parameter basis, and adjust which parameters they wish to set.

       The error values given below result from filesystem type independent errors.  Each  filesystem  type  may
       have its own special errors and its own special behavior.  See the Linux kernel source code for details.

       EACCES A   component   of   a  path  provided  as  a  path  parameter  was  not  searchable.   (See  also
              path_resolution(7).)

       EACCES FSCONFIG_CMD_CREATE was attempted for a read-only filesystem  without  specifying  the  'ro'  flag
              parameter.

       EACCES A specified block device parameter is located on a filesystem mounted with the MS_NODEV option.

       EBADF  The file descriptor given by fd (or possibly by aux, depending on the command) is invalid.

       EBUSY  The filesystem context associated with fd is in the wrong state for the given command.

       EBUSY  The  filesystem instance cannot be reconfigured as read-only with FSCONFIG_CMD_RECONFIGURE because
              some programs still hold files open for writing.

       EBUSY  A new filesystem instance was requested with FSCONFIG_CMD_CREATE_EXCL but  a  matching  superblock
              already existed.

       EFAULT One of the pointer arguments points to a location outside the calling process's accessible address
              space.

       EINVAL fd does not refer to a filesystem configuration context or filesystem instance.

       EINVAL One  of  the  values of key, value, and/or aux were set to a non-zero value when cmd required that
              they be zero (or NULL).

       EINVAL The parameter named by key cannot be set using the type specified with cmd.

       EINVAL One of the source parameters referred to an invalid superblock.

       ELOOP  Too many links encountered during pathname resolution of a path argument.

       ENAMETOOLONG
              A path argument was longer than PATH_MAX.

       ENOENT A path argument had a non-existent component.

       ENOENT A path argument is an empty string, but cmd is not FSCONFIG_SET_PATH_EMPTY.

       ENOMEM The kernel could not allocate sufficient memory to complete the operation.

       ENOTBLK
              The parameter named by key must be a block device, but the provided  parameter  value  was  not  a
              block device.

       ENOTDIR
              A component of the path prefix of a path argument was not a directory.

       EOPNOTSUPP
              The command given by cmd is not valid.

       ENXIO  The major number of a block device parameter is out of range.

       EPERM  The    command    given    by    cmd   was   FSCONFIG_CMD_CREATE,   FSCONFIG_CMD_CREATE_EXCL,   or
              FSCONFIG_CMD_RECONFIGURE, but the  calling  process  does  not  have  the  required  CAP_SYS_ADMIN
              capability.

STANDARDS

       Linux.

HISTORY

       Linux 5.2.  glibc 2.36.

NOTES

   Generic filesystem parameters
       Each filesystem driver is responsible for parsing most parameters specified with fsconfig(), meaning that
       individual filesystems may have very different behaviour when encountering parameters with the same name.
       In  general,  you  should  not assume that the behaviour of fsconfig() when specifying a parameter to one
       filesystem type will match the behaviour of the same parameter with a different filesystem type.

       However, the following generic parameters apply to all filesystems and have unified behaviour.  They  are
       set using the listed FSCONFIG_SET_* command.

       ro and rw (FSCONFIG_SET_FLAG)
              Configure whether the filesystem instance is read-only.

       dirsync (FSCONFIG_SET_FLAG)
              Make directory changes on this filesystem instance synchronous.

       sync and async (FSCONFIG_SET_FLAG)
              Configure  whether  writes  on  this  filesystem  instance will be made synchronous (as though the
              O_SYNC flag to open(2) was specified for all file opens in this filesystem instance).

       lazytime and nolazytime (FSCONFIG_SET_FLAG)
              Configure whether to reduce on-disk updates of inode timestamps on this  filesystem  instance  (as
              described in the MS_LAZYTIME section of mount(2)).

       mand and nomand (FSCONFIG_SET_FLAG)
              Configure  whether  the  filesystem  instance  should permit mandatory locking.  Since Linux 5.15,
              mandatory locking has been deprecated and setting this flag is a no-op.

       source (FSCONFIG_SET_STRING)
              This parameter is equivalent to the source parameter passed to mount(2) for  the  same  filesystem
              type, and is usually the pathname of a block device containing the filesystem.  This parameter may
              only be set once per filesystem configuration context transaction.

       In  addition,  any  filesystem  parameters associated with Linux Security Modules (LSMs) are also generic
       with respect to the underlying filesystem.  See the documentation for the LSM you wish to  configure  for
       more details.

   Mount attributes and filesystem parameters
       Some  filesystem  parameters  (traditionally associated with mount(8)-style options) have a sibling mount
       attribute with superficially similar user-facing behaviour.

       For a description of the distinction between mount attributes and filesystem parameters, see  the  "Mount
       attributes and filesystem parameters" subsection of mount_setattr(2).

CAVEATS

   Filesystem parameter types
       As  a  result  of  each  filesystem  driver  being responsible for parsing most parameters specified with
       fsconfig(), some filesystem drivers may have unintuitive behaviour with regards to  which  FSCONFIG_SET_*
       commands are permitted to configure a given parameter.

       In  order  for  filesystem parameters to be backwards compatible with mount(2), they must be parseable as
       strings; this almost universally means that FSCONFIG_SET_STRING can  also  be  used  to  configure  them.
       However,  other  FSCONFIG_SET_*  commands  need  to  be  opted into by each filesystem driver's parameter
       parser.

       One of the most user-visible instances of this inconsistency is that  many  filesystems  do  not  support
       configuring  path  parameters  with  FSCONFIG_SET_PATH  (despite  the  name),  which can lead to somewhat
       confusing EINVAL errors.  (For example, the generic source parameter—which is usually a path—can only  be
       configured with FSCONFIG_SET_STRING.)

       When   writing   programs   that  use  fsconfig()  to  configure  parameters  with  commands  other  than
       FSCONFIG_SET_STRING, users should  verify  that  the  FSCONFIG_SET_*  commands  used  to  configure  each
       parameter are supported by the corresponding filesystem driver.

EXAMPLES

       To  illustrate  the  different  kinds  of  flags  that  can be configured with fsconfig(), here are a few
       examples of some different filesystems being created:

           int fsfd, mntfd;

           fsfd = fsopen("tmpfs", FSOPEN_CLOEXEC);
           fsconfig(fsfd, FSCONFIG_SET_FLAG, "inode64", NULL, 0);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "uid", "1234", 0);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "huge", "never", 0);
           fsconfig(fsfd, FSCONFIG_SET_FLAG, "casefold", NULL, 0);
           fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);
           mntfd = fsmount(fsfd, FSMOUNT_CLOEXEC, MOUNT_ATTR_NOEXEC);
           move_mount(mntfd, "", AT_FDCWD, "/tmp", MOVE_MOUNT_F_EMPTY_PATH);

           fsfd = fsopen("erofs", FSOPEN_CLOEXEC);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "source", "/dev/loop0", 0);
           fsconfig(fsfd, FSCONFIG_SET_FLAG, "acl", NULL, 0);
           fsconfig(fsfd, FSCONFIG_SET_FLAG, "user_xattr", NULL, 0);
           fsconfig(fsfd, FSCONFIG_CMD_CREATE_EXCL, NULL, NULL, 0);
           mntfd = fsmount(fsfd, FSMOUNT_CLOEXEC, MOUNT_ATTR_NOSUID);
           move_mount(mntfd, "", AT_FDCWD, "/mnt", MOVE_MOUNT_F_EMPTY_PATH);

       Usually, specifying the same parameter named by key multiple times with fsconfig() causes  the  parameter
       value to be replaced.  However, some filesystems may have unique behaviour:

           int fsfd, mntfd;
           int lowerdirfd = open("/o/ctr/lower1", O_DIRECTORY | O_CLOEXEC);

           fsfd = fsopen("overlay", FSOPEN_CLOEXEC);
           /* "lowerdir+" appends to the lower dir stack each time */
           fsconfig(fsfd, FSCONFIG_SET_FD, "lowerdir+", NULL, lowerdirfd);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "lowerdir+", "/o/ctr/lower2", 0);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "lowerdir+", "/o/ctr/lower3", 0);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "lowerdir+", "/o/ctr/lower4", 0);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "xino", "auto", 0);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "nfs_export", "off", 0);
           fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);
           mntfd = fsmount(fsfd, FSMOUNT_CLOEXEC, 0);
           move_mount(mntfd, "", AT_FDCWD, "/mnt", MOVE_MOUNT_F_EMPTY_PATH);

       And  here  is an example of how fspick(2) can be used with fsconfig() to reconfigure the parameters of an
       extant filesystem instance attached to /proc:

           int fsfd = fspick(AT_FDCWD, "/proc", FSPICK_CLOEXEC);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "hidepid", "ptraceable", 0);
           fsconfig(fsfd, FSCONFIG_SET_STRING, "subset", "pid", 0);
           fsconfig(fsfd, FSCONFIG_CMD_RECONFIGURE, NULL, NULL, 0);

SEE ALSO

       fsmount(2),   fsopen(2),   fspick(2),   mount(2),    mount_setattr(2),    move_mount(2),    open_tree(2),
       mount_namespaces(7)

Linux man-pages 6.16                               2025-10-01                                        fsconfig(2)