1791a17eeSMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0 2791a17eeSMauro Carvalho Chehab 3791a17eeSMauro Carvalho Chehab==================== 48ede5648SRandy DunlapFilesystem Mount API 5791a17eeSMauro Carvalho Chehab==================== 6791a17eeSMauro Carvalho Chehab 7791a17eeSMauro Carvalho Chehab.. CONTENTS 8791a17eeSMauro Carvalho Chehab 9791a17eeSMauro Carvalho Chehab (1) Overview. 10791a17eeSMauro Carvalho Chehab 11791a17eeSMauro Carvalho Chehab (2) The filesystem context. 12791a17eeSMauro Carvalho Chehab 13791a17eeSMauro Carvalho Chehab (3) The filesystem context operations. 14791a17eeSMauro Carvalho Chehab 15791a17eeSMauro Carvalho Chehab (4) Filesystem context security. 16791a17eeSMauro Carvalho Chehab 17791a17eeSMauro Carvalho Chehab (5) VFS filesystem context API. 18791a17eeSMauro Carvalho Chehab 19791a17eeSMauro Carvalho Chehab (6) Superblock creation helpers. 20791a17eeSMauro Carvalho Chehab 21791a17eeSMauro Carvalho Chehab (7) Parameter description. 22791a17eeSMauro Carvalho Chehab 23791a17eeSMauro Carvalho Chehab (8) Parameter helper functions. 24791a17eeSMauro Carvalho Chehab 25791a17eeSMauro Carvalho Chehab 26791a17eeSMauro Carvalho ChehabOverview 27791a17eeSMauro Carvalho Chehab======== 28791a17eeSMauro Carvalho Chehab 29791a17eeSMauro Carvalho ChehabThe creation of new mounts is now to be done in a multistep process: 30791a17eeSMauro Carvalho Chehab 31791a17eeSMauro Carvalho Chehab (1) Create a filesystem context. 32791a17eeSMauro Carvalho Chehab 33791a17eeSMauro Carvalho Chehab (2) Parse the parameters and attach them to the context. Parameters are 34791a17eeSMauro Carvalho Chehab expected to be passed individually from userspace, though legacy binary 35791a17eeSMauro Carvalho Chehab parameters can also be handled. 36791a17eeSMauro Carvalho Chehab 37791a17eeSMauro Carvalho Chehab (3) Validate and pre-process the context. 38791a17eeSMauro Carvalho Chehab 39791a17eeSMauro Carvalho Chehab (4) Get or create a superblock and mountable root. 40791a17eeSMauro Carvalho Chehab 41791a17eeSMauro Carvalho Chehab (5) Perform the mount. 42791a17eeSMauro Carvalho Chehab 43791a17eeSMauro Carvalho Chehab (6) Return an error message attached to the context. 44791a17eeSMauro Carvalho Chehab 45791a17eeSMauro Carvalho Chehab (7) Destroy the context. 46791a17eeSMauro Carvalho Chehab 47791a17eeSMauro Carvalho ChehabTo support this, the file_system_type struct gains two new fields:: 48791a17eeSMauro Carvalho Chehab 49791a17eeSMauro Carvalho Chehab int (*init_fs_context)(struct fs_context *fc); 50791a17eeSMauro Carvalho Chehab const struct fs_parameter_description *parameters; 51791a17eeSMauro Carvalho Chehab 52791a17eeSMauro Carvalho ChehabThe first is invoked to set up the filesystem-specific parts of a filesystem 53791a17eeSMauro Carvalho Chehabcontext, including the additional space, and the second points to the 54791a17eeSMauro Carvalho Chehabparameter description for validation at registration time and querying by a 55791a17eeSMauro Carvalho Chehabfuture system call. 56791a17eeSMauro Carvalho Chehab 57791a17eeSMauro Carvalho ChehabNote that security initialisation is done *after* the filesystem is called so 58791a17eeSMauro Carvalho Chehabthat the namespaces may be adjusted first. 59791a17eeSMauro Carvalho Chehab 60791a17eeSMauro Carvalho Chehab 61791a17eeSMauro Carvalho ChehabThe Filesystem context 62791a17eeSMauro Carvalho Chehab====================== 63791a17eeSMauro Carvalho Chehab 64791a17eeSMauro Carvalho ChehabThe creation and reconfiguration of a superblock is governed by a filesystem 65791a17eeSMauro Carvalho Chehabcontext. This is represented by the fs_context structure:: 66791a17eeSMauro Carvalho Chehab 67791a17eeSMauro Carvalho Chehab struct fs_context { 68791a17eeSMauro Carvalho Chehab const struct fs_context_operations *ops; 69791a17eeSMauro Carvalho Chehab struct file_system_type *fs_type; 70791a17eeSMauro Carvalho Chehab void *fs_private; 71791a17eeSMauro Carvalho Chehab struct dentry *root; 72791a17eeSMauro Carvalho Chehab struct user_namespace *user_ns; 73791a17eeSMauro Carvalho Chehab struct net *net_ns; 74791a17eeSMauro Carvalho Chehab const struct cred *cred; 75791a17eeSMauro Carvalho Chehab char *source; 76791a17eeSMauro Carvalho Chehab char *subtype; 77791a17eeSMauro Carvalho Chehab void *security; 78791a17eeSMauro Carvalho Chehab void *s_fs_info; 79791a17eeSMauro Carvalho Chehab unsigned int sb_flags; 80791a17eeSMauro Carvalho Chehab unsigned int sb_flags_mask; 81791a17eeSMauro Carvalho Chehab unsigned int s_iflags; 82791a17eeSMauro Carvalho Chehab enum fs_context_purpose purpose:8; 83791a17eeSMauro Carvalho Chehab ... 84791a17eeSMauro Carvalho Chehab }; 85791a17eeSMauro Carvalho Chehab 86791a17eeSMauro Carvalho ChehabThe fs_context fields are as follows: 87791a17eeSMauro Carvalho Chehab 88791a17eeSMauro Carvalho Chehab * :: 89791a17eeSMauro Carvalho Chehab 90791a17eeSMauro Carvalho Chehab const struct fs_context_operations *ops 91791a17eeSMauro Carvalho Chehab 92791a17eeSMauro Carvalho Chehab These are operations that can be done on a filesystem context (see 93791a17eeSMauro Carvalho Chehab below). This must be set by the ->init_fs_context() file_system_type 94791a17eeSMauro Carvalho Chehab operation. 95791a17eeSMauro Carvalho Chehab 96791a17eeSMauro Carvalho Chehab * :: 97791a17eeSMauro Carvalho Chehab 98791a17eeSMauro Carvalho Chehab struct file_system_type *fs_type 99791a17eeSMauro Carvalho Chehab 100791a17eeSMauro Carvalho Chehab A pointer to the file_system_type of the filesystem that is being 101791a17eeSMauro Carvalho Chehab constructed or reconfigured. This retains a reference on the type owner. 102791a17eeSMauro Carvalho Chehab 103791a17eeSMauro Carvalho Chehab * :: 104791a17eeSMauro Carvalho Chehab 105791a17eeSMauro Carvalho Chehab void *fs_private 106791a17eeSMauro Carvalho Chehab 107791a17eeSMauro Carvalho Chehab A pointer to the file system's private data. This is where the filesystem 108791a17eeSMauro Carvalho Chehab will need to store any options it parses. 109791a17eeSMauro Carvalho Chehab 110791a17eeSMauro Carvalho Chehab * :: 111791a17eeSMauro Carvalho Chehab 112791a17eeSMauro Carvalho Chehab struct dentry *root 113791a17eeSMauro Carvalho Chehab 114791a17eeSMauro Carvalho Chehab A pointer to the root of the mountable tree (and indirectly, the 115791a17eeSMauro Carvalho Chehab superblock thereof). This is filled in by the ->get_tree() op. If this 116791a17eeSMauro Carvalho Chehab is set, an active reference on root->d_sb must also be held. 117791a17eeSMauro Carvalho Chehab 118791a17eeSMauro Carvalho Chehab * :: 119791a17eeSMauro Carvalho Chehab 120791a17eeSMauro Carvalho Chehab struct user_namespace *user_ns 121791a17eeSMauro Carvalho Chehab struct net *net_ns 122791a17eeSMauro Carvalho Chehab 123791a17eeSMauro Carvalho Chehab There are a subset of the namespaces in use by the invoking process. They 124791a17eeSMauro Carvalho Chehab retain references on each namespace. The subscribed namespaces may be 125791a17eeSMauro Carvalho Chehab replaced by the filesystem to reflect other sources, such as the parent 126791a17eeSMauro Carvalho Chehab mount superblock on an automount. 127791a17eeSMauro Carvalho Chehab 128791a17eeSMauro Carvalho Chehab * :: 129791a17eeSMauro Carvalho Chehab 130791a17eeSMauro Carvalho Chehab const struct cred *cred 131791a17eeSMauro Carvalho Chehab 132791a17eeSMauro Carvalho Chehab The mounter's credentials. This retains a reference on the credentials. 133791a17eeSMauro Carvalho Chehab 134791a17eeSMauro Carvalho Chehab * :: 135791a17eeSMauro Carvalho Chehab 136791a17eeSMauro Carvalho Chehab char *source 137791a17eeSMauro Carvalho Chehab 138791a17eeSMauro Carvalho Chehab This specifies the source. It may be a block device (e.g. /dev/sda1) or 139791a17eeSMauro Carvalho Chehab something more exotic, such as the "host:/path" that NFS desires. 140791a17eeSMauro Carvalho Chehab 141791a17eeSMauro Carvalho Chehab * :: 142791a17eeSMauro Carvalho Chehab 143791a17eeSMauro Carvalho Chehab char *subtype 144791a17eeSMauro Carvalho Chehab 145791a17eeSMauro Carvalho Chehab This is a string to be added to the type displayed in /proc/mounts to 146791a17eeSMauro Carvalho Chehab qualify it (used by FUSE). This is available for the filesystem to set if 147791a17eeSMauro Carvalho Chehab desired. 148791a17eeSMauro Carvalho Chehab 149791a17eeSMauro Carvalho Chehab * :: 150791a17eeSMauro Carvalho Chehab 151791a17eeSMauro Carvalho Chehab void *security 152791a17eeSMauro Carvalho Chehab 153791a17eeSMauro Carvalho Chehab A place for the LSMs to hang their security data for the superblock. The 154791a17eeSMauro Carvalho Chehab relevant security operations are described below. 155791a17eeSMauro Carvalho Chehab 156791a17eeSMauro Carvalho Chehab * :: 157791a17eeSMauro Carvalho Chehab 158791a17eeSMauro Carvalho Chehab void *s_fs_info 159791a17eeSMauro Carvalho Chehab 160791a17eeSMauro Carvalho Chehab The proposed s_fs_info for a new superblock, set in the superblock by 161791a17eeSMauro Carvalho Chehab sget_fc(). This can be used to distinguish superblocks. 162791a17eeSMauro Carvalho Chehab 163791a17eeSMauro Carvalho Chehab * :: 164791a17eeSMauro Carvalho Chehab 165791a17eeSMauro Carvalho Chehab unsigned int sb_flags 166791a17eeSMauro Carvalho Chehab unsigned int sb_flags_mask 167791a17eeSMauro Carvalho Chehab 168791a17eeSMauro Carvalho Chehab Which bits SB_* flags are to be set/cleared in super_block::s_flags. 169791a17eeSMauro Carvalho Chehab 170791a17eeSMauro Carvalho Chehab * :: 171791a17eeSMauro Carvalho Chehab 172791a17eeSMauro Carvalho Chehab unsigned int s_iflags 173791a17eeSMauro Carvalho Chehab 174791a17eeSMauro Carvalho Chehab These will be bitwise-OR'd with s->s_iflags when a superblock is created. 175791a17eeSMauro Carvalho Chehab 176791a17eeSMauro Carvalho Chehab * :: 177791a17eeSMauro Carvalho Chehab 178791a17eeSMauro Carvalho Chehab enum fs_context_purpose 179791a17eeSMauro Carvalho Chehab 180791a17eeSMauro Carvalho Chehab This indicates the purpose for which the context is intended. The 181791a17eeSMauro Carvalho Chehab available values are: 182791a17eeSMauro Carvalho Chehab 183791a17eeSMauro Carvalho Chehab ========================== ====================================== 184791a17eeSMauro Carvalho Chehab FS_CONTEXT_FOR_MOUNT, New superblock for explicit mount 185791a17eeSMauro Carvalho Chehab FS_CONTEXT_FOR_SUBMOUNT New automatic submount of extant mount 186791a17eeSMauro Carvalho Chehab FS_CONTEXT_FOR_RECONFIGURE Change an existing mount 187791a17eeSMauro Carvalho Chehab ========================== ====================================== 188791a17eeSMauro Carvalho Chehab 189791a17eeSMauro Carvalho ChehabThe mount context is created by calling vfs_new_fs_context() or 190791a17eeSMauro Carvalho Chehabvfs_dup_fs_context() and is destroyed with put_fs_context(). Note that the 191791a17eeSMauro Carvalho Chehabstructure is not refcounted. 192791a17eeSMauro Carvalho Chehab 193791a17eeSMauro Carvalho ChehabVFS, security and filesystem mount options are set individually with 194791a17eeSMauro Carvalho Chehabvfs_parse_mount_option(). Options provided by the old mount(2) system call as 195791a17eeSMauro Carvalho Chehaba page of data can be parsed with generic_parse_monolithic(). 196791a17eeSMauro Carvalho Chehab 197791a17eeSMauro Carvalho ChehabWhen mounting, the filesystem is allowed to take data from any of the pointers 198791a17eeSMauro Carvalho Chehaband attach it to the superblock (or whatever), provided it clears the pointer 199791a17eeSMauro Carvalho Chehabin the mount context. 200791a17eeSMauro Carvalho Chehab 201791a17eeSMauro Carvalho ChehabThe filesystem is also allowed to allocate resources and pin them with the 202791a17eeSMauro Carvalho Chehabmount context. For instance, NFS might pin the appropriate protocol version 203791a17eeSMauro Carvalho Chehabmodule. 204791a17eeSMauro Carvalho Chehab 205791a17eeSMauro Carvalho Chehab 206791a17eeSMauro Carvalho ChehabThe Filesystem Context Operations 207791a17eeSMauro Carvalho Chehab================================= 208791a17eeSMauro Carvalho Chehab 209791a17eeSMauro Carvalho ChehabThe filesystem context points to a table of operations:: 210791a17eeSMauro Carvalho Chehab 211791a17eeSMauro Carvalho Chehab struct fs_context_operations { 212791a17eeSMauro Carvalho Chehab void (*free)(struct fs_context *fc); 213791a17eeSMauro Carvalho Chehab int (*dup)(struct fs_context *fc, struct fs_context *src_fc); 214791a17eeSMauro Carvalho Chehab int (*parse_param)(struct fs_context *fc, 215d483fa04SRandy Dunlap struct fs_parameter *param); 216791a17eeSMauro Carvalho Chehab int (*parse_monolithic)(struct fs_context *fc, void *data); 217791a17eeSMauro Carvalho Chehab int (*get_tree)(struct fs_context *fc); 218791a17eeSMauro Carvalho Chehab int (*reconfigure)(struct fs_context *fc); 219791a17eeSMauro Carvalho Chehab }; 220791a17eeSMauro Carvalho Chehab 221791a17eeSMauro Carvalho ChehabThese operations are invoked by the various stages of the mount procedure to 222791a17eeSMauro Carvalho Chehabmanage the filesystem context. They are as follows: 223791a17eeSMauro Carvalho Chehab 224791a17eeSMauro Carvalho Chehab * :: 225791a17eeSMauro Carvalho Chehab 226791a17eeSMauro Carvalho Chehab void (*free)(struct fs_context *fc); 227791a17eeSMauro Carvalho Chehab 228791a17eeSMauro Carvalho Chehab Called to clean up the filesystem-specific part of the filesystem context 229791a17eeSMauro Carvalho Chehab when the context is destroyed. It should be aware that parts of the 230791a17eeSMauro Carvalho Chehab context may have been removed and NULL'd out by ->get_tree(). 231791a17eeSMauro Carvalho Chehab 232791a17eeSMauro Carvalho Chehab * :: 233791a17eeSMauro Carvalho Chehab 234791a17eeSMauro Carvalho Chehab int (*dup)(struct fs_context *fc, struct fs_context *src_fc); 235791a17eeSMauro Carvalho Chehab 236791a17eeSMauro Carvalho Chehab Called when a filesystem context has been duplicated to duplicate the 237791a17eeSMauro Carvalho Chehab filesystem-private data. An error may be returned to indicate failure to 238791a17eeSMauro Carvalho Chehab do this. 239791a17eeSMauro Carvalho Chehab 240791a17eeSMauro Carvalho Chehab .. Warning:: 241791a17eeSMauro Carvalho Chehab 242791a17eeSMauro Carvalho Chehab Note that even if this fails, put_fs_context() will be called 243791a17eeSMauro Carvalho Chehab immediately thereafter, so ->dup() *must* make the 244791a17eeSMauro Carvalho Chehab filesystem-private data safe for ->free(). 245791a17eeSMauro Carvalho Chehab 246791a17eeSMauro Carvalho Chehab * :: 247791a17eeSMauro Carvalho Chehab 248791a17eeSMauro Carvalho Chehab int (*parse_param)(struct fs_context *fc, 249d483fa04SRandy Dunlap struct fs_parameter *param); 250791a17eeSMauro Carvalho Chehab 251791a17eeSMauro Carvalho Chehab Called when a parameter is being added to the filesystem context. param 252791a17eeSMauro Carvalho Chehab points to the key name and maybe a value object. VFS-specific options 253791a17eeSMauro Carvalho Chehab will have been weeded out and fc->sb_flags updated in the context. 254791a17eeSMauro Carvalho Chehab Security options will also have been weeded out and fc->security updated. 255791a17eeSMauro Carvalho Chehab 256791a17eeSMauro Carvalho Chehab The parameter can be parsed with fs_parse() and fs_lookup_param(). Note 257791a17eeSMauro Carvalho Chehab that the source(s) are presented as parameters named "source". 258791a17eeSMauro Carvalho Chehab 259791a17eeSMauro Carvalho Chehab If successful, 0 should be returned or a negative error code otherwise. 260791a17eeSMauro Carvalho Chehab 261791a17eeSMauro Carvalho Chehab * :: 262791a17eeSMauro Carvalho Chehab 263791a17eeSMauro Carvalho Chehab int (*parse_monolithic)(struct fs_context *fc, void *data); 264791a17eeSMauro Carvalho Chehab 265791a17eeSMauro Carvalho Chehab Called when the mount(2) system call is invoked to pass the entire data 266791a17eeSMauro Carvalho Chehab page in one go. If this is expected to be just a list of "key[=val]" 267791a17eeSMauro Carvalho Chehab items separated by commas, then this may be set to NULL. 268791a17eeSMauro Carvalho Chehab 269791a17eeSMauro Carvalho Chehab The return value is as for ->parse_param(). 270791a17eeSMauro Carvalho Chehab 271791a17eeSMauro Carvalho Chehab If the filesystem (e.g. NFS) needs to examine the data first and then 272791a17eeSMauro Carvalho Chehab finds it's the standard key-val list then it may pass it off to 273791a17eeSMauro Carvalho Chehab generic_parse_monolithic(). 274791a17eeSMauro Carvalho Chehab 275791a17eeSMauro Carvalho Chehab * :: 276791a17eeSMauro Carvalho Chehab 277791a17eeSMauro Carvalho Chehab int (*get_tree)(struct fs_context *fc); 278791a17eeSMauro Carvalho Chehab 279791a17eeSMauro Carvalho Chehab Called to get or create the mountable root and superblock, using the 280791a17eeSMauro Carvalho Chehab information stored in the filesystem context (reconfiguration goes via a 281791a17eeSMauro Carvalho Chehab different vector). It may detach any resources it desires from the 282791a17eeSMauro Carvalho Chehab filesystem context and transfer them to the superblock it creates. 283791a17eeSMauro Carvalho Chehab 284791a17eeSMauro Carvalho Chehab On success it should set fc->root to the mountable root and return 0. In 285791a17eeSMauro Carvalho Chehab the case of an error, it should return a negative error code. 286791a17eeSMauro Carvalho Chehab 287791a17eeSMauro Carvalho Chehab The phase on a userspace-driven context will be set to only allow this to 288791a17eeSMauro Carvalho Chehab be called once on any particular context. 289791a17eeSMauro Carvalho Chehab 290791a17eeSMauro Carvalho Chehab * :: 291791a17eeSMauro Carvalho Chehab 292791a17eeSMauro Carvalho Chehab int (*reconfigure)(struct fs_context *fc); 293791a17eeSMauro Carvalho Chehab 294791a17eeSMauro Carvalho Chehab Called to effect reconfiguration of a superblock using information stored 295791a17eeSMauro Carvalho Chehab in the filesystem context. It may detach any resources it desires from 296791a17eeSMauro Carvalho Chehab the filesystem context and transfer them to the superblock. The 297791a17eeSMauro Carvalho Chehab superblock can be found from fc->root->d_sb. 298791a17eeSMauro Carvalho Chehab 299791a17eeSMauro Carvalho Chehab On success it should return 0. In the case of an error, it should return 300791a17eeSMauro Carvalho Chehab a negative error code. 301791a17eeSMauro Carvalho Chehab 302791a17eeSMauro Carvalho Chehab .. Note:: reconfigure is intended as a replacement for remount_fs. 303791a17eeSMauro Carvalho Chehab 304791a17eeSMauro Carvalho Chehab 305791a17eeSMauro Carvalho ChehabFilesystem context Security 306791a17eeSMauro Carvalho Chehab=========================== 307791a17eeSMauro Carvalho Chehab 308791a17eeSMauro Carvalho ChehabThe filesystem context contains a security pointer that the LSMs can use for 309791a17eeSMauro Carvalho Chehabbuilding up a security context for the superblock to be mounted. There are a 310791a17eeSMauro Carvalho Chehabnumber of operations used by the new mount code for this purpose: 311791a17eeSMauro Carvalho Chehab 312791a17eeSMauro Carvalho Chehab * :: 313791a17eeSMauro Carvalho Chehab 314791a17eeSMauro Carvalho Chehab int security_fs_context_alloc(struct fs_context *fc, 315791a17eeSMauro Carvalho Chehab struct dentry *reference); 316791a17eeSMauro Carvalho Chehab 317791a17eeSMauro Carvalho Chehab Called to initialise fc->security (which is preset to NULL) and allocate 318791a17eeSMauro Carvalho Chehab any resources needed. It should return 0 on success or a negative error 319791a17eeSMauro Carvalho Chehab code on failure. 320791a17eeSMauro Carvalho Chehab 321791a17eeSMauro Carvalho Chehab reference will be non-NULL if the context is being created for superblock 322791a17eeSMauro Carvalho Chehab reconfiguration (FS_CONTEXT_FOR_RECONFIGURE) in which case it indicates 323791a17eeSMauro Carvalho Chehab the root dentry of the superblock to be reconfigured. It will also be 324791a17eeSMauro Carvalho Chehab non-NULL in the case of a submount (FS_CONTEXT_FOR_SUBMOUNT) in which case 325791a17eeSMauro Carvalho Chehab it indicates the automount point. 326791a17eeSMauro Carvalho Chehab 327791a17eeSMauro Carvalho Chehab * :: 328791a17eeSMauro Carvalho Chehab 329791a17eeSMauro Carvalho Chehab int security_fs_context_dup(struct fs_context *fc, 330791a17eeSMauro Carvalho Chehab struct fs_context *src_fc); 331791a17eeSMauro Carvalho Chehab 332791a17eeSMauro Carvalho Chehab Called to initialise fc->security (which is preset to NULL) and allocate 333791a17eeSMauro Carvalho Chehab any resources needed. The original filesystem context is pointed to by 334791a17eeSMauro Carvalho Chehab src_fc and may be used for reference. It should return 0 on success or a 335791a17eeSMauro Carvalho Chehab negative error code on failure. 336791a17eeSMauro Carvalho Chehab 337791a17eeSMauro Carvalho Chehab * :: 338791a17eeSMauro Carvalho Chehab 339791a17eeSMauro Carvalho Chehab void security_fs_context_free(struct fs_context *fc); 340791a17eeSMauro Carvalho Chehab 341791a17eeSMauro Carvalho Chehab Called to clean up anything attached to fc->security. Note that the 342791a17eeSMauro Carvalho Chehab contents may have been transferred to a superblock and the pointer cleared 343791a17eeSMauro Carvalho Chehab during get_tree. 344791a17eeSMauro Carvalho Chehab 345791a17eeSMauro Carvalho Chehab * :: 346791a17eeSMauro Carvalho Chehab 347791a17eeSMauro Carvalho Chehab int security_fs_context_parse_param(struct fs_context *fc, 348791a17eeSMauro Carvalho Chehab struct fs_parameter *param); 349791a17eeSMauro Carvalho Chehab 350791a17eeSMauro Carvalho Chehab Called for each mount parameter, including the source. The arguments are 351791a17eeSMauro Carvalho Chehab as for the ->parse_param() method. It should return 0 to indicate that 352791a17eeSMauro Carvalho Chehab the parameter should be passed on to the filesystem, 1 to indicate that 353791a17eeSMauro Carvalho Chehab the parameter should be discarded or an error to indicate that the 354791a17eeSMauro Carvalho Chehab parameter should be rejected. 355791a17eeSMauro Carvalho Chehab 356791a17eeSMauro Carvalho Chehab The value pointed to by param may be modified (if a string) or stolen 357791a17eeSMauro Carvalho Chehab (provided the value pointer is NULL'd out). If it is stolen, 1 must be 358791a17eeSMauro Carvalho Chehab returned to prevent it being passed to the filesystem. 359791a17eeSMauro Carvalho Chehab 360791a17eeSMauro Carvalho Chehab * :: 361791a17eeSMauro Carvalho Chehab 362791a17eeSMauro Carvalho Chehab int security_fs_context_validate(struct fs_context *fc); 363791a17eeSMauro Carvalho Chehab 364791a17eeSMauro Carvalho Chehab Called after all the options have been parsed to validate the collection 365791a17eeSMauro Carvalho Chehab as a whole and to do any necessary allocation so that 366791a17eeSMauro Carvalho Chehab security_sb_get_tree() and security_sb_reconfigure() are less likely to 367791a17eeSMauro Carvalho Chehab fail. It should return 0 or a negative error code. 368791a17eeSMauro Carvalho Chehab 369791a17eeSMauro Carvalho Chehab In the case of reconfiguration, the target superblock will be accessible 370791a17eeSMauro Carvalho Chehab via fc->root. 371791a17eeSMauro Carvalho Chehab 372791a17eeSMauro Carvalho Chehab * :: 373791a17eeSMauro Carvalho Chehab 374791a17eeSMauro Carvalho Chehab int security_sb_get_tree(struct fs_context *fc); 375791a17eeSMauro Carvalho Chehab 376791a17eeSMauro Carvalho Chehab Called during the mount procedure to verify that the specified superblock 377791a17eeSMauro Carvalho Chehab is allowed to be mounted and to transfer the security data there. It 378791a17eeSMauro Carvalho Chehab should return 0 or a negative error code. 379791a17eeSMauro Carvalho Chehab 380791a17eeSMauro Carvalho Chehab * :: 381791a17eeSMauro Carvalho Chehab 382791a17eeSMauro Carvalho Chehab void security_sb_reconfigure(struct fs_context *fc); 383791a17eeSMauro Carvalho Chehab 384791a17eeSMauro Carvalho Chehab Called to apply any reconfiguration to an LSM's context. It must not 385791a17eeSMauro Carvalho Chehab fail. Error checking and resource allocation must be done in advance by 386791a17eeSMauro Carvalho Chehab the parameter parsing and validation hooks. 387791a17eeSMauro Carvalho Chehab 388791a17eeSMauro Carvalho Chehab * :: 389791a17eeSMauro Carvalho Chehab 390791a17eeSMauro Carvalho Chehab int security_sb_mountpoint(struct fs_context *fc, 391791a17eeSMauro Carvalho Chehab struct path *mountpoint, 392791a17eeSMauro Carvalho Chehab unsigned int mnt_flags); 393791a17eeSMauro Carvalho Chehab 394791a17eeSMauro Carvalho Chehab Called during the mount procedure to verify that the root dentry attached 395791a17eeSMauro Carvalho Chehab to the context is permitted to be attached to the specified mountpoint. 396791a17eeSMauro Carvalho Chehab It should return 0 on success or a negative error code on failure. 397791a17eeSMauro Carvalho Chehab 398791a17eeSMauro Carvalho Chehab 399791a17eeSMauro Carvalho ChehabVFS Filesystem context API 400791a17eeSMauro Carvalho Chehab========================== 401791a17eeSMauro Carvalho Chehab 402791a17eeSMauro Carvalho ChehabThere are four operations for creating a filesystem context and one for 403791a17eeSMauro Carvalho Chehabdestroying a context: 404791a17eeSMauro Carvalho Chehab 405791a17eeSMauro Carvalho Chehab * :: 406791a17eeSMauro Carvalho Chehab 407791a17eeSMauro Carvalho Chehab struct fs_context *fs_context_for_mount(struct file_system_type *fs_type, 408791a17eeSMauro Carvalho Chehab unsigned int sb_flags); 409791a17eeSMauro Carvalho Chehab 410791a17eeSMauro Carvalho Chehab Allocate a filesystem context for the purpose of setting up a new mount, 411791a17eeSMauro Carvalho Chehab whether that be with a new superblock or sharing an existing one. This 412791a17eeSMauro Carvalho Chehab sets the superblock flags, initialises the security and calls 413791a17eeSMauro Carvalho Chehab fs_type->init_fs_context() to initialise the filesystem private data. 414791a17eeSMauro Carvalho Chehab 415791a17eeSMauro Carvalho Chehab fs_type specifies the filesystem type that will manage the context and 416791a17eeSMauro Carvalho Chehab sb_flags presets the superblock flags stored therein. 417791a17eeSMauro Carvalho Chehab 418791a17eeSMauro Carvalho Chehab * :: 419791a17eeSMauro Carvalho Chehab 420791a17eeSMauro Carvalho Chehab struct fs_context *fs_context_for_reconfigure( 421791a17eeSMauro Carvalho Chehab struct dentry *dentry, 422791a17eeSMauro Carvalho Chehab unsigned int sb_flags, 423791a17eeSMauro Carvalho Chehab unsigned int sb_flags_mask); 424791a17eeSMauro Carvalho Chehab 425791a17eeSMauro Carvalho Chehab Allocate a filesystem context for the purpose of reconfiguring an 426791a17eeSMauro Carvalho Chehab existing superblock. dentry provides a reference to the superblock to be 427791a17eeSMauro Carvalho Chehab configured. sb_flags and sb_flags_mask indicate which superblock flags 428791a17eeSMauro Carvalho Chehab need changing and to what. 429791a17eeSMauro Carvalho Chehab 430791a17eeSMauro Carvalho Chehab * :: 431791a17eeSMauro Carvalho Chehab 432791a17eeSMauro Carvalho Chehab struct fs_context *fs_context_for_submount( 433791a17eeSMauro Carvalho Chehab struct file_system_type *fs_type, 434791a17eeSMauro Carvalho Chehab struct dentry *reference); 435791a17eeSMauro Carvalho Chehab 436791a17eeSMauro Carvalho Chehab Allocate a filesystem context for the purpose of creating a new mount for 437791a17eeSMauro Carvalho Chehab an automount point or other derived superblock. fs_type specifies the 438791a17eeSMauro Carvalho Chehab filesystem type that will manage the context and the reference dentry 439791a17eeSMauro Carvalho Chehab supplies the parameters. Namespaces are propagated from the reference 440791a17eeSMauro Carvalho Chehab dentry's superblock also. 441791a17eeSMauro Carvalho Chehab 442791a17eeSMauro Carvalho Chehab Note that it's not a requirement that the reference dentry be of the same 443791a17eeSMauro Carvalho Chehab filesystem type as fs_type. 444791a17eeSMauro Carvalho Chehab 445791a17eeSMauro Carvalho Chehab * :: 446791a17eeSMauro Carvalho Chehab 447791a17eeSMauro Carvalho Chehab struct fs_context *vfs_dup_fs_context(struct fs_context *src_fc); 448791a17eeSMauro Carvalho Chehab 449791a17eeSMauro Carvalho Chehab Duplicate a filesystem context, copying any options noted and duplicating 450791a17eeSMauro Carvalho Chehab or additionally referencing any resources held therein. This is available 451791a17eeSMauro Carvalho Chehab for use where a filesystem has to get a mount within a mount, such as NFS4 452791a17eeSMauro Carvalho Chehab does by internally mounting the root of the target server and then doing a 453791a17eeSMauro Carvalho Chehab private pathwalk to the target directory. 454791a17eeSMauro Carvalho Chehab 455791a17eeSMauro Carvalho Chehab The purpose in the new context is inherited from the old one. 456791a17eeSMauro Carvalho Chehab 457791a17eeSMauro Carvalho Chehab * :: 458791a17eeSMauro Carvalho Chehab 459791a17eeSMauro Carvalho Chehab void put_fs_context(struct fs_context *fc); 460791a17eeSMauro Carvalho Chehab 461791a17eeSMauro Carvalho Chehab Destroy a filesystem context, releasing any resources it holds. This 462791a17eeSMauro Carvalho Chehab calls the ->free() operation. This is intended to be called by anyone who 463791a17eeSMauro Carvalho Chehab created a filesystem context. 464791a17eeSMauro Carvalho Chehab 465791a17eeSMauro Carvalho Chehab .. Warning:: 466791a17eeSMauro Carvalho Chehab 467791a17eeSMauro Carvalho Chehab filesystem contexts are not refcounted, so this causes unconditional 468791a17eeSMauro Carvalho Chehab destruction. 469791a17eeSMauro Carvalho Chehab 470791a17eeSMauro Carvalho ChehabIn all the above operations, apart from the put op, the return is a mount 471791a17eeSMauro Carvalho Chehabcontext pointer or a negative error code. 472791a17eeSMauro Carvalho Chehab 473791a17eeSMauro Carvalho ChehabFor the remaining operations, if an error occurs, a negative error code will be 474791a17eeSMauro Carvalho Chehabreturned. 475791a17eeSMauro Carvalho Chehab 476791a17eeSMauro Carvalho Chehab * :: 477791a17eeSMauro Carvalho Chehab 478791a17eeSMauro Carvalho Chehab int vfs_parse_fs_param(struct fs_context *fc, 479791a17eeSMauro Carvalho Chehab struct fs_parameter *param); 480791a17eeSMauro Carvalho Chehab 4818ede5648SRandy Dunlap Supply a single mount parameter to the filesystem context. This includes 482791a17eeSMauro Carvalho Chehab the specification of the source/device which is specified as the "source" 483791a17eeSMauro Carvalho Chehab parameter (which may be specified multiple times if the filesystem 484791a17eeSMauro Carvalho Chehab supports that). 485791a17eeSMauro Carvalho Chehab 486791a17eeSMauro Carvalho Chehab param specifies the parameter key name and the value. The parameter is 487791a17eeSMauro Carvalho Chehab first checked to see if it corresponds to a standard mount flag (in which 488791a17eeSMauro Carvalho Chehab case it is used to set an SB_xxx flag and consumed) or a security option 489791a17eeSMauro Carvalho Chehab (in which case the LSM consumes it) before it is passed on to the 490791a17eeSMauro Carvalho Chehab filesystem. 491791a17eeSMauro Carvalho Chehab 492791a17eeSMauro Carvalho Chehab The parameter value is typed and can be one of: 493791a17eeSMauro Carvalho Chehab 494791a17eeSMauro Carvalho Chehab ==================== ============================= 495791a17eeSMauro Carvalho Chehab fs_value_is_flag Parameter not given a value 496791a17eeSMauro Carvalho Chehab fs_value_is_string Value is a string 497791a17eeSMauro Carvalho Chehab fs_value_is_blob Value is a binary blob 498791a17eeSMauro Carvalho Chehab fs_value_is_filename Value is a filename* + dirfd 499791a17eeSMauro Carvalho Chehab fs_value_is_file Value is an open file (file*) 500791a17eeSMauro Carvalho Chehab ==================== ============================= 501791a17eeSMauro Carvalho Chehab 502791a17eeSMauro Carvalho Chehab If there is a value, that value is stored in a union in the struct in one 503791a17eeSMauro Carvalho Chehab of param->{string,blob,name,file}. Note that the function may steal and 504791a17eeSMauro Carvalho Chehab clear the pointer, but then becomes responsible for disposing of the 505791a17eeSMauro Carvalho Chehab object. 506791a17eeSMauro Carvalho Chehab 507791a17eeSMauro Carvalho Chehab * :: 508791a17eeSMauro Carvalho Chehab 509791a17eeSMauro Carvalho Chehab int vfs_parse_fs_string(struct fs_context *fc, const char *key, 510791a17eeSMauro Carvalho Chehab const char *value, size_t v_size); 511791a17eeSMauro Carvalho Chehab 512791a17eeSMauro Carvalho Chehab A wrapper around vfs_parse_fs_param() that copies the value string it is 513791a17eeSMauro Carvalho Chehab passed. 514791a17eeSMauro Carvalho Chehab 515791a17eeSMauro Carvalho Chehab * :: 516791a17eeSMauro Carvalho Chehab 517791a17eeSMauro Carvalho Chehab int generic_parse_monolithic(struct fs_context *fc, void *data); 518791a17eeSMauro Carvalho Chehab 519791a17eeSMauro Carvalho Chehab Parse a sys_mount() data page, assuming the form to be a text list 520791a17eeSMauro Carvalho Chehab consisting of key[=val] options separated by commas. Each item in the 521791a17eeSMauro Carvalho Chehab list is passed to vfs_mount_option(). This is the default when the 522791a17eeSMauro Carvalho Chehab ->parse_monolithic() method is NULL. 523791a17eeSMauro Carvalho Chehab 524791a17eeSMauro Carvalho Chehab * :: 525791a17eeSMauro Carvalho Chehab 526791a17eeSMauro Carvalho Chehab int vfs_get_tree(struct fs_context *fc); 527791a17eeSMauro Carvalho Chehab 528791a17eeSMauro Carvalho Chehab Get or create the mountable root and superblock, using the parameters in 529791a17eeSMauro Carvalho Chehab the filesystem context to select/configure the superblock. This invokes 530791a17eeSMauro Carvalho Chehab the ->get_tree() method. 531791a17eeSMauro Carvalho Chehab 532791a17eeSMauro Carvalho Chehab * :: 533791a17eeSMauro Carvalho Chehab 534791a17eeSMauro Carvalho Chehab struct vfsmount *vfs_create_mount(struct fs_context *fc); 535791a17eeSMauro Carvalho Chehab 536791a17eeSMauro Carvalho Chehab Create a mount given the parameters in the specified filesystem context. 537791a17eeSMauro Carvalho Chehab Note that this does not attach the mount to anything. 538791a17eeSMauro Carvalho Chehab 539791a17eeSMauro Carvalho Chehab 540791a17eeSMauro Carvalho ChehabSuperblock Creation Helpers 541791a17eeSMauro Carvalho Chehab=========================== 542791a17eeSMauro Carvalho Chehab 543791a17eeSMauro Carvalho ChehabA number of VFS helpers are available for use by filesystems for the creation 544791a17eeSMauro Carvalho Chehabor looking up of superblocks. 545791a17eeSMauro Carvalho Chehab 546791a17eeSMauro Carvalho Chehab * :: 547791a17eeSMauro Carvalho Chehab 548791a17eeSMauro Carvalho Chehab struct super_block * 549791a17eeSMauro Carvalho Chehab sget_fc(struct fs_context *fc, 550791a17eeSMauro Carvalho Chehab int (*test)(struct super_block *sb, struct fs_context *fc), 551791a17eeSMauro Carvalho Chehab int (*set)(struct super_block *sb, struct fs_context *fc)); 552791a17eeSMauro Carvalho Chehab 553791a17eeSMauro Carvalho Chehab This is the core routine. If test is non-NULL, it searches for an 554791a17eeSMauro Carvalho Chehab existing superblock matching the criteria held in the fs_context, using 555791a17eeSMauro Carvalho Chehab the test function to match them. If no match is found, a new superblock 556791a17eeSMauro Carvalho Chehab is created and the set function is called to set it up. 557791a17eeSMauro Carvalho Chehab 558791a17eeSMauro Carvalho Chehab Prior to the set function being called, fc->s_fs_info will be transferred 559791a17eeSMauro Carvalho Chehab to sb->s_fs_info - and fc->s_fs_info will be cleared if set returns 560791a17eeSMauro Carvalho Chehab success (ie. 0). 561791a17eeSMauro Carvalho Chehab 562791a17eeSMauro Carvalho ChehabThe following helpers all wrap sget_fc(): 563791a17eeSMauro Carvalho Chehab 564791a17eeSMauro Carvalho Chehab (1) vfs_get_single_super 565791a17eeSMauro Carvalho Chehab 566791a17eeSMauro Carvalho Chehab Only one such superblock may exist in the system. Any further 567791a17eeSMauro Carvalho Chehab attempt to get a new superblock gets this one (and any parameter 568791a17eeSMauro Carvalho Chehab differences are ignored). 569791a17eeSMauro Carvalho Chehab 570791a17eeSMauro Carvalho Chehab (2) vfs_get_keyed_super 571791a17eeSMauro Carvalho Chehab 572791a17eeSMauro Carvalho Chehab Multiple superblocks of this type may exist and they're keyed on 573791a17eeSMauro Carvalho Chehab their s_fs_info pointer (for example this may refer to a 574791a17eeSMauro Carvalho Chehab namespace). 575791a17eeSMauro Carvalho Chehab 576791a17eeSMauro Carvalho Chehab (3) vfs_get_independent_super 577791a17eeSMauro Carvalho Chehab 578791a17eeSMauro Carvalho Chehab Multiple independent superblocks of this type may exist. This 579791a17eeSMauro Carvalho Chehab function never matches an existing one and always creates a new 580791a17eeSMauro Carvalho Chehab one. 581791a17eeSMauro Carvalho Chehab 582791a17eeSMauro Carvalho Chehab 5838ede5648SRandy DunlapParameter Description 584791a17eeSMauro Carvalho Chehab===================== 585791a17eeSMauro Carvalho Chehab 586791a17eeSMauro Carvalho ChehabParameters are described using structures defined in linux/fs_parser.h. 587791a17eeSMauro Carvalho ChehabThere's a core description struct that links everything together:: 588791a17eeSMauro Carvalho Chehab 589791a17eeSMauro Carvalho Chehab struct fs_parameter_description { 590791a17eeSMauro Carvalho Chehab const struct fs_parameter_spec *specs; 591791a17eeSMauro Carvalho Chehab const struct fs_parameter_enum *enums; 592791a17eeSMauro Carvalho Chehab }; 593791a17eeSMauro Carvalho Chehab 594791a17eeSMauro Carvalho ChehabFor example:: 595791a17eeSMauro Carvalho Chehab 596791a17eeSMauro Carvalho Chehab enum { 597791a17eeSMauro Carvalho Chehab Opt_autocell, 598791a17eeSMauro Carvalho Chehab Opt_bar, 599791a17eeSMauro Carvalho Chehab Opt_dyn, 600791a17eeSMauro Carvalho Chehab Opt_foo, 601791a17eeSMauro Carvalho Chehab Opt_source, 602791a17eeSMauro Carvalho Chehab }; 603791a17eeSMauro Carvalho Chehab 604791a17eeSMauro Carvalho Chehab static const struct fs_parameter_description afs_fs_parameters = { 605791a17eeSMauro Carvalho Chehab .specs = afs_param_specs, 606791a17eeSMauro Carvalho Chehab .enums = afs_param_enums, 607791a17eeSMauro Carvalho Chehab }; 608791a17eeSMauro Carvalho Chehab 609791a17eeSMauro Carvalho ChehabThe members are as follows: 610791a17eeSMauro Carvalho Chehab 611791a17eeSMauro Carvalho Chehab (1) :: 612791a17eeSMauro Carvalho Chehab 613791a17eeSMauro Carvalho Chehab const struct fs_parameter_specification *specs; 614791a17eeSMauro Carvalho Chehab 615791a17eeSMauro Carvalho Chehab Table of parameter specifications, terminated with a null entry, where the 616791a17eeSMauro Carvalho Chehab entries are of type:: 617791a17eeSMauro Carvalho Chehab 618791a17eeSMauro Carvalho Chehab struct fs_parameter_spec { 619791a17eeSMauro Carvalho Chehab const char *name; 620791a17eeSMauro Carvalho Chehab u8 opt; 621791a17eeSMauro Carvalho Chehab enum fs_parameter_type type:8; 622791a17eeSMauro Carvalho Chehab unsigned short flags; 623791a17eeSMauro Carvalho Chehab }; 624791a17eeSMauro Carvalho Chehab 625791a17eeSMauro Carvalho Chehab The 'name' field is a string to match exactly to the parameter key (no 626791a17eeSMauro Carvalho Chehab wildcards, patterns and no case-independence) and 'opt' is the value that 627791a17eeSMauro Carvalho Chehab will be returned by the fs_parser() function in the case of a successful 628791a17eeSMauro Carvalho Chehab match. 629791a17eeSMauro Carvalho Chehab 630791a17eeSMauro Carvalho Chehab The 'type' field indicates the desired value type and must be one of: 631791a17eeSMauro Carvalho Chehab 632791a17eeSMauro Carvalho Chehab ======================= ======================= ===================== 633791a17eeSMauro Carvalho Chehab TYPE NAME EXPECTED VALUE RESULT IN 634791a17eeSMauro Carvalho Chehab ======================= ======================= ===================== 635791a17eeSMauro Carvalho Chehab fs_param_is_flag No value n/a 636791a17eeSMauro Carvalho Chehab fs_param_is_bool Boolean value result->boolean 637791a17eeSMauro Carvalho Chehab fs_param_is_u32 32-bit unsigned int result->uint_32 638791a17eeSMauro Carvalho Chehab fs_param_is_u32_octal 32-bit octal int result->uint_32 639791a17eeSMauro Carvalho Chehab fs_param_is_u32_hex 32-bit hex int result->uint_32 640791a17eeSMauro Carvalho Chehab fs_param_is_s32 32-bit signed int result->int_32 641791a17eeSMauro Carvalho Chehab fs_param_is_u64 64-bit unsigned int result->uint_64 642791a17eeSMauro Carvalho Chehab fs_param_is_enum Enum value name result->uint_32 643791a17eeSMauro Carvalho Chehab fs_param_is_string Arbitrary string param->string 644791a17eeSMauro Carvalho Chehab fs_param_is_blob Binary blob param->blob 645791a17eeSMauro Carvalho Chehab fs_param_is_blockdev Blockdev path * Needs lookup 646791a17eeSMauro Carvalho Chehab fs_param_is_path Path * Needs lookup 647791a17eeSMauro Carvalho Chehab fs_param_is_fd File descriptor result->int_32 648791a17eeSMauro Carvalho Chehab ======================= ======================= ===================== 649791a17eeSMauro Carvalho Chehab 650791a17eeSMauro Carvalho Chehab Note that if the value is of fs_param_is_bool type, fs_parse() will try 651791a17eeSMauro Carvalho Chehab to match any string value against "0", "1", "no", "yes", "false", "true". 652791a17eeSMauro Carvalho Chehab 653791a17eeSMauro Carvalho Chehab Each parameter can also be qualified with 'flags': 654791a17eeSMauro Carvalho Chehab 655791a17eeSMauro Carvalho Chehab ======================= ================================================ 656791a17eeSMauro Carvalho Chehab fs_param_v_optional The value is optional 657791a17eeSMauro Carvalho Chehab fs_param_neg_with_no result->negated set if key is prefixed with "no" 658791a17eeSMauro Carvalho Chehab fs_param_neg_with_empty result->negated set if value is "" 659791a17eeSMauro Carvalho Chehab fs_param_deprecated The parameter is deprecated. 660791a17eeSMauro Carvalho Chehab ======================= ================================================ 661791a17eeSMauro Carvalho Chehab 662791a17eeSMauro Carvalho Chehab These are wrapped with a number of convenience wrappers: 663791a17eeSMauro Carvalho Chehab 664791a17eeSMauro Carvalho Chehab ======================= =============================================== 665791a17eeSMauro Carvalho Chehab MACRO SPECIFIES 666791a17eeSMauro Carvalho Chehab ======================= =============================================== 667791a17eeSMauro Carvalho Chehab fsparam_flag() fs_param_is_flag 668791a17eeSMauro Carvalho Chehab fsparam_flag_no() fs_param_is_flag, fs_param_neg_with_no 669791a17eeSMauro Carvalho Chehab fsparam_bool() fs_param_is_bool 670791a17eeSMauro Carvalho Chehab fsparam_u32() fs_param_is_u32 671791a17eeSMauro Carvalho Chehab fsparam_u32oct() fs_param_is_u32_octal 672791a17eeSMauro Carvalho Chehab fsparam_u32hex() fs_param_is_u32_hex 673791a17eeSMauro Carvalho Chehab fsparam_s32() fs_param_is_s32 674791a17eeSMauro Carvalho Chehab fsparam_u64() fs_param_is_u64 675791a17eeSMauro Carvalho Chehab fsparam_enum() fs_param_is_enum 676791a17eeSMauro Carvalho Chehab fsparam_string() fs_param_is_string 677791a17eeSMauro Carvalho Chehab fsparam_blob() fs_param_is_blob 678791a17eeSMauro Carvalho Chehab fsparam_bdev() fs_param_is_blockdev 679791a17eeSMauro Carvalho Chehab fsparam_path() fs_param_is_path 680791a17eeSMauro Carvalho Chehab fsparam_fd() fs_param_is_fd 681791a17eeSMauro Carvalho Chehab ======================= =============================================== 682791a17eeSMauro Carvalho Chehab 683791a17eeSMauro Carvalho Chehab all of which take two arguments, name string and option number - for 684791a17eeSMauro Carvalho Chehab example:: 685791a17eeSMauro Carvalho Chehab 686791a17eeSMauro Carvalho Chehab static const struct fs_parameter_spec afs_param_specs[] = { 687791a17eeSMauro Carvalho Chehab fsparam_flag ("autocell", Opt_autocell), 688791a17eeSMauro Carvalho Chehab fsparam_flag ("dyn", Opt_dyn), 689791a17eeSMauro Carvalho Chehab fsparam_string ("source", Opt_source), 690791a17eeSMauro Carvalho Chehab fsparam_flag_no ("foo", Opt_foo), 691791a17eeSMauro Carvalho Chehab {} 692791a17eeSMauro Carvalho Chehab }; 693791a17eeSMauro Carvalho Chehab 694791a17eeSMauro Carvalho Chehab An addition macro, __fsparam() is provided that takes an additional pair 695791a17eeSMauro Carvalho Chehab of arguments to specify the type and the flags for anything that doesn't 696791a17eeSMauro Carvalho Chehab match one of the above macros. 697791a17eeSMauro Carvalho Chehab 698791a17eeSMauro Carvalho Chehab (2) :: 699791a17eeSMauro Carvalho Chehab 700791a17eeSMauro Carvalho Chehab const struct fs_parameter_enum *enums; 701791a17eeSMauro Carvalho Chehab 702791a17eeSMauro Carvalho Chehab Table of enum value names to integer mappings, terminated with a null 703791a17eeSMauro Carvalho Chehab entry. This is of type:: 704791a17eeSMauro Carvalho Chehab 705791a17eeSMauro Carvalho Chehab struct fs_parameter_enum { 706791a17eeSMauro Carvalho Chehab u8 opt; 707791a17eeSMauro Carvalho Chehab char name[14]; 708791a17eeSMauro Carvalho Chehab u8 value; 709791a17eeSMauro Carvalho Chehab }; 710791a17eeSMauro Carvalho Chehab 711791a17eeSMauro Carvalho Chehab Where the array is an unsorted list of { parameter ID, name }-keyed 712791a17eeSMauro Carvalho Chehab elements that indicate the value to map to, e.g.:: 713791a17eeSMauro Carvalho Chehab 714791a17eeSMauro Carvalho Chehab static const struct fs_parameter_enum afs_param_enums[] = { 715791a17eeSMauro Carvalho Chehab { Opt_bar, "x", 1}, 716791a17eeSMauro Carvalho Chehab { Opt_bar, "y", 23}, 717791a17eeSMauro Carvalho Chehab { Opt_bar, "z", 42}, 718791a17eeSMauro Carvalho Chehab }; 719791a17eeSMauro Carvalho Chehab 720791a17eeSMauro Carvalho Chehab If a parameter of type fs_param_is_enum is encountered, fs_parse() will 721791a17eeSMauro Carvalho Chehab try to look the value up in the enum table and the result will be stored 722791a17eeSMauro Carvalho Chehab in the parse result. 723791a17eeSMauro Carvalho Chehab 724791a17eeSMauro Carvalho ChehabThe parser should be pointed to by the parser pointer in the file_system_type 725791a17eeSMauro Carvalho Chehabstruct as this will provide validation on registration (if 726791a17eeSMauro Carvalho ChehabCONFIG_VALIDATE_FS_PARSER=y) and will allow the description to be queried from 727791a17eeSMauro Carvalho Chehabuserspace using the fsinfo() syscall. 728791a17eeSMauro Carvalho Chehab 729791a17eeSMauro Carvalho Chehab 730791a17eeSMauro Carvalho ChehabParameter Helper Functions 731791a17eeSMauro Carvalho Chehab========================== 732791a17eeSMauro Carvalho Chehab 733791a17eeSMauro Carvalho ChehabA number of helper functions are provided to help a filesystem or an LSM 734791a17eeSMauro Carvalho Chehabprocess the parameters it is given. 735791a17eeSMauro Carvalho Chehab 736791a17eeSMauro Carvalho Chehab * :: 737791a17eeSMauro Carvalho Chehab 738791a17eeSMauro Carvalho Chehab int lookup_constant(const struct constant_table tbl[], 739791a17eeSMauro Carvalho Chehab const char *name, int not_found); 740791a17eeSMauro Carvalho Chehab 741791a17eeSMauro Carvalho Chehab Look up a constant by name in a table of name -> integer mappings. The 742791a17eeSMauro Carvalho Chehab table is an array of elements of the following type:: 743791a17eeSMauro Carvalho Chehab 744791a17eeSMauro Carvalho Chehab struct constant_table { 745791a17eeSMauro Carvalho Chehab const char *name; 746791a17eeSMauro Carvalho Chehab int value; 747791a17eeSMauro Carvalho Chehab }; 748791a17eeSMauro Carvalho Chehab 749791a17eeSMauro Carvalho Chehab If a match is found, the corresponding value is returned. If a match 750791a17eeSMauro Carvalho Chehab isn't found, the not_found value is returned instead. 751791a17eeSMauro Carvalho Chehab 752791a17eeSMauro Carvalho Chehab * :: 753791a17eeSMauro Carvalho Chehab 754791a17eeSMauro Carvalho Chehab bool validate_constant_table(const struct constant_table *tbl, 755791a17eeSMauro Carvalho Chehab size_t tbl_size, 756791a17eeSMauro Carvalho Chehab int low, int high, int special); 757791a17eeSMauro Carvalho Chehab 758791a17eeSMauro Carvalho Chehab Validate a constant table. Checks that all the elements are appropriately 759791a17eeSMauro Carvalho Chehab ordered, that there are no duplicates and that the values are between low 760791a17eeSMauro Carvalho Chehab and high inclusive, though provision is made for one allowable special 761791a17eeSMauro Carvalho Chehab value outside of that range. If no special value is required, special 762791a17eeSMauro Carvalho Chehab should just be set to lie inside the low-to-high range. 763791a17eeSMauro Carvalho Chehab 764791a17eeSMauro Carvalho Chehab If all is good, true is returned. If the table is invalid, errors are 765263b6a5bSRandy Dunlap logged to the kernel log buffer and false is returned. 766791a17eeSMauro Carvalho Chehab 767791a17eeSMauro Carvalho Chehab * :: 768791a17eeSMauro Carvalho Chehab 769791a17eeSMauro Carvalho Chehab bool fs_validate_description(const struct fs_parameter_description *desc); 770791a17eeSMauro Carvalho Chehab 771791a17eeSMauro Carvalho Chehab This performs some validation checks on a parameter description. It 772791a17eeSMauro Carvalho Chehab returns true if the description is good and false if it is not. It will 773263b6a5bSRandy Dunlap log errors to the kernel log buffer if validation fails. 774791a17eeSMauro Carvalho Chehab 775791a17eeSMauro Carvalho Chehab * :: 776791a17eeSMauro Carvalho Chehab 777791a17eeSMauro Carvalho Chehab int fs_parse(struct fs_context *fc, 778791a17eeSMauro Carvalho Chehab const struct fs_parameter_description *desc, 779791a17eeSMauro Carvalho Chehab struct fs_parameter *param, 780791a17eeSMauro Carvalho Chehab struct fs_parse_result *result); 781791a17eeSMauro Carvalho Chehab 782791a17eeSMauro Carvalho Chehab This is the main interpreter of parameters. It uses the parameter 783791a17eeSMauro Carvalho Chehab description to look up a parameter by key name and to convert that to an 784791a17eeSMauro Carvalho Chehab option number (which it returns). 785791a17eeSMauro Carvalho Chehab 786791a17eeSMauro Carvalho Chehab If successful, and if the parameter type indicates the result is a 787791a17eeSMauro Carvalho Chehab boolean, integer or enum type, the value is converted by this function and 788791a17eeSMauro Carvalho Chehab the result stored in result->{boolean,int_32,uint_32,uint_64}. 789791a17eeSMauro Carvalho Chehab 790791a17eeSMauro Carvalho Chehab If a match isn't initially made, the key is prefixed with "no" and no 791791a17eeSMauro Carvalho Chehab value is present then an attempt will be made to look up the key with the 792791a17eeSMauro Carvalho Chehab prefix removed. If this matches a parameter for which the type has flag 793791a17eeSMauro Carvalho Chehab fs_param_neg_with_no set, then a match will be made and result->negated 794791a17eeSMauro Carvalho Chehab will be set to true. 795791a17eeSMauro Carvalho Chehab 796791a17eeSMauro Carvalho Chehab If the parameter isn't matched, -ENOPARAM will be returned; if the 797791a17eeSMauro Carvalho Chehab parameter is matched, but the value is erroneous, -EINVAL will be 798791a17eeSMauro Carvalho Chehab returned; otherwise the parameter's option number will be returned. 799791a17eeSMauro Carvalho Chehab 800791a17eeSMauro Carvalho Chehab * :: 801791a17eeSMauro Carvalho Chehab 802791a17eeSMauro Carvalho Chehab int fs_lookup_param(struct fs_context *fc, 803791a17eeSMauro Carvalho Chehab struct fs_parameter *value, 804791a17eeSMauro Carvalho Chehab bool want_bdev, 805*e3ea75eeSLukas Czerner unsigned int flags, 806791a17eeSMauro Carvalho Chehab struct path *_path); 807791a17eeSMauro Carvalho Chehab 808791a17eeSMauro Carvalho Chehab This takes a parameter that carries a string or filename type and attempts 809791a17eeSMauro Carvalho Chehab to do a path lookup on it. If the parameter expects a blockdev, a check 810791a17eeSMauro Carvalho Chehab is made that the inode actually represents one. 811791a17eeSMauro Carvalho Chehab 812791a17eeSMauro Carvalho Chehab Returns 0 if successful and ``*_path`` will be set; returns a negative 813791a17eeSMauro Carvalho Chehab error code if not. 814