root/include/linux/fs_context.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /* Filesystem superblock creation and reconfiguration context.
   3  *
   4  * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
   5  * Written by David Howells (dhowells@redhat.com)
   6  */
   7 
   8 #ifndef _LINUX_FS_CONTEXT_H
   9 #define _LINUX_FS_CONTEXT_H
  10 
  11 #include <linux/kernel.h>
  12 #include <linux/refcount.h>
  13 #include <linux/errno.h>
  14 #include <linux/security.h>
  15 #include <linux/mutex.h>
  16 
  17 struct cred;
  18 struct dentry;
  19 struct file_operations;
  20 struct file_system_type;
  21 struct mnt_namespace;
  22 struct net;
  23 struct pid_namespace;
  24 struct super_block;
  25 struct user_namespace;
  26 struct vfsmount;
  27 struct path;
  28 
  29 enum fs_context_purpose {
  30         FS_CONTEXT_FOR_MOUNT,           /* New superblock for explicit mount */
  31         FS_CONTEXT_FOR_SUBMOUNT,        /* New superblock for automatic submount */
  32         FS_CONTEXT_FOR_RECONFIGURE,     /* Superblock reconfiguration (remount) */
  33 };
  34 
  35 /*
  36  * Userspace usage phase for fsopen/fspick.
  37  */
  38 enum fs_context_phase {
  39         FS_CONTEXT_CREATE_PARAMS,       /* Loading params for sb creation */
  40         FS_CONTEXT_CREATING,            /* A superblock is being created */
  41         FS_CONTEXT_AWAITING_MOUNT,      /* Superblock created, awaiting fsmount() */
  42         FS_CONTEXT_AWAITING_RECONF,     /* Awaiting initialisation for reconfiguration */
  43         FS_CONTEXT_RECONF_PARAMS,       /* Loading params for reconfiguration */
  44         FS_CONTEXT_RECONFIGURING,       /* Reconfiguring the superblock */
  45         FS_CONTEXT_FAILED,              /* Failed to correctly transition a context */
  46 };
  47 
  48 /*
  49  * Type of parameter value.
  50  */
  51 enum fs_value_type {
  52         fs_value_is_undefined,
  53         fs_value_is_flag,               /* Value not given a value */
  54         fs_value_is_string,             /* Value is a string */
  55         fs_value_is_blob,               /* Value is a binary blob */
  56         fs_value_is_filename,           /* Value is a filename* + dirfd */
  57         fs_value_is_filename_empty,     /* Value is a filename* + dirfd + AT_EMPTY_PATH */
  58         fs_value_is_file,               /* Value is a file* */
  59 };
  60 
  61 /*
  62  * Configuration parameter.
  63  */
  64 struct fs_parameter {
  65         const char              *key;           /* Parameter name */
  66         enum fs_value_type      type:8;         /* The type of value here */
  67         union {
  68                 char            *string;
  69                 void            *blob;
  70                 struct filename *name;
  71                 struct file     *file;
  72         };
  73         size_t  size;
  74         int     dirfd;
  75 };
  76 
  77 /*
  78  * Filesystem context for holding the parameters used in the creation or
  79  * reconfiguration of a superblock.
  80  *
  81  * Superblock creation fills in ->root whereas reconfiguration begins with this
  82  * already set.
  83  *
  84  * See Documentation/filesystems/mount_api.txt
  85  */
  86 struct fs_context {
  87         const struct fs_context_operations *ops;
  88         struct mutex            uapi_mutex;     /* Userspace access mutex */
  89         struct file_system_type *fs_type;
  90         void                    *fs_private;    /* The filesystem's context */
  91         void                    *sget_key;
  92         struct dentry           *root;          /* The root and superblock */
  93         struct user_namespace   *user_ns;       /* The user namespace for this mount */
  94         struct net              *net_ns;        /* The network namespace for this mount */
  95         const struct cred       *cred;          /* The mounter's credentials */
  96         struct fc_log           *log;           /* Logging buffer */
  97         const char              *source;        /* The source name (eg. dev path) */
  98         void                    *security;      /* Linux S&M options */
  99         void                    *s_fs_info;     /* Proposed s_fs_info */
 100         unsigned int            sb_flags;       /* Proposed superblock flags (SB_*) */
 101         unsigned int            sb_flags_mask;  /* Superblock flags that were changed */
 102         unsigned int            s_iflags;       /* OR'd with sb->s_iflags */
 103         unsigned int            lsm_flags;      /* Information flags from the fs to the LSM */
 104         enum fs_context_purpose purpose:8;
 105         enum fs_context_phase   phase:8;        /* The phase the context is in */
 106         bool                    need_free:1;    /* Need to call ops->free() */
 107         bool                    global:1;       /* Goes into &init_user_ns */
 108 };
 109 
 110 struct fs_context_operations {
 111         void (*free)(struct fs_context *fc);
 112         int (*dup)(struct fs_context *fc, struct fs_context *src_fc);
 113         int (*parse_param)(struct fs_context *fc, struct fs_parameter *param);
 114         int (*parse_monolithic)(struct fs_context *fc, void *data);
 115         int (*get_tree)(struct fs_context *fc);
 116         int (*reconfigure)(struct fs_context *fc);
 117 };
 118 
 119 /*
 120  * fs_context manipulation functions.
 121  */
 122 extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
 123                                                 unsigned int sb_flags);
 124 extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
 125                                                 unsigned int sb_flags,
 126                                                 unsigned int sb_flags_mask);
 127 extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
 128                                                 struct dentry *reference);
 129 
 130 extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
 131 extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
 132 extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
 133                                const char *value, size_t v_size);
 134 extern int generic_parse_monolithic(struct fs_context *fc, void *data);
 135 extern int vfs_get_tree(struct fs_context *fc);
 136 extern void put_fs_context(struct fs_context *fc);
 137 
 138 /*
 139  * sget() wrappers to be called from the ->get_tree() op.
 140  */
 141 enum vfs_get_super_keying {
 142         vfs_get_single_super,   /* Only one such superblock may exist */
 143         vfs_get_single_reconf_super, /* As above, but reconfigure if it exists */
 144         vfs_get_keyed_super,    /* Superblocks with different s_fs_info keys may exist */
 145         vfs_get_independent_super, /* Multiple independent superblocks may exist */
 146 };
 147 extern int vfs_get_super(struct fs_context *fc,
 148                          enum vfs_get_super_keying keying,
 149                          int (*fill_super)(struct super_block *sb,
 150                                            struct fs_context *fc));
 151 
 152 extern int get_tree_nodev(struct fs_context *fc,
 153                          int (*fill_super)(struct super_block *sb,
 154                                            struct fs_context *fc));
 155 extern int get_tree_single(struct fs_context *fc,
 156                          int (*fill_super)(struct super_block *sb,
 157                                            struct fs_context *fc));
 158 extern int get_tree_single_reconf(struct fs_context *fc,
 159                          int (*fill_super)(struct super_block *sb,
 160                                            struct fs_context *fc));
 161 extern int get_tree_keyed(struct fs_context *fc,
 162                          int (*fill_super)(struct super_block *sb,
 163                                            struct fs_context *fc),
 164                          void *key);
 165 
 166 extern int get_tree_bdev(struct fs_context *fc,
 167                                int (*fill_super)(struct super_block *sb,
 168                                                  struct fs_context *fc));
 169 
 170 extern const struct file_operations fscontext_fops;
 171 
 172 /*
 173  * Mount error, warning and informational message logging.  This structure is
 174  * shareable between a mount and a subordinate mount.
 175  */
 176 struct fc_log {
 177         refcount_t      usage;
 178         u8              head;           /* Insertion index in buffer[] */
 179         u8              tail;           /* Removal index in buffer[] */
 180         u8              need_free;      /* Mask of kfree'able items in buffer[] */
 181         struct module   *owner;         /* Owner module for strings that don't then need freeing */
 182         char            *buffer[8];
 183 };
 184 
 185 extern __attribute__((format(printf, 2, 3)))
 186 void logfc(struct fs_context *fc, const char *fmt, ...);
 187 
 188 /**
 189  * infof - Store supplementary informational message
 190  * @fc: The context in which to log the informational message
 191  * @fmt: The format string
 192  *
 193  * Store the supplementary informational message for the process if the process
 194  * has enabled the facility.
 195  */
 196 #define infof(fc, fmt, ...) ({ logfc(fc, "i "fmt, ## __VA_ARGS__); })
 197 
 198 /**
 199  * warnf - Store supplementary warning message
 200  * @fc: The context in which to log the error message
 201  * @fmt: The format string
 202  *
 203  * Store the supplementary warning message for the process if the process has
 204  * enabled the facility.
 205  */
 206 #define warnf(fc, fmt, ...) ({ logfc(fc, "w "fmt, ## __VA_ARGS__); })
 207 
 208 /**
 209  * errorf - Store supplementary error message
 210  * @fc: The context in which to log the error message
 211  * @fmt: The format string
 212  *
 213  * Store the supplementary error message for the process if the process has
 214  * enabled the facility.
 215  */
 216 #define errorf(fc, fmt, ...) ({ logfc(fc, "e "fmt, ## __VA_ARGS__); })
 217 
 218 /**
 219  * invalf - Store supplementary invalid argument error message
 220  * @fc: The context in which to log the error message
 221  * @fmt: The format string
 222  *
 223  * Store the supplementary error message for the process if the process has
 224  * enabled the facility and return -EINVAL.
 225  */
 226 #define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
 227 
 228 #endif /* _LINUX_FS_CONTEXT_H */

/* [<][>][^][v][top][bottom][index][help] */