linux/include/linux/fs_context.h
<<
>>
Prefs
   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
  17struct cred;
  18struct dentry;
  19struct file_operations;
  20struct file_system_type;
  21struct mnt_namespace;
  22struct net;
  23struct pid_namespace;
  24struct super_block;
  25struct user_namespace;
  26struct vfsmount;
  27struct path;
  28
  29enum 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 */
  38enum 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 */
  51enum 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 */
  64struct 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 */
  86struct 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        struct dentry           *root;          /* The root and superblock */
  92        struct user_namespace   *user_ns;       /* The user namespace for this mount */
  93        struct net              *net_ns;        /* The network namespace for this mount */
  94        const struct cred       *cred;          /* The mounter's credentials */
  95        struct fc_log           *log;           /* Logging buffer */
  96        const char              *source;        /* The source name (eg. dev path) */
  97        const char              *subtype;       /* The subtype to set on the superblock */
  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
 110struct 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 */
 122extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
 123                                                unsigned int sb_flags);
 124extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
 125                                                unsigned int sb_flags,
 126                                                unsigned int sb_flags_mask);
 127extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
 128                                                struct dentry *reference);
 129
 130extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
 131extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
 132extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
 133                               const char *value, size_t v_size);
 134extern int generic_parse_monolithic(struct fs_context *fc, void *data);
 135extern int vfs_get_tree(struct fs_context *fc);
 136extern void put_fs_context(struct fs_context *fc);
 137
 138/*
 139 * sget() wrapper to be called from the ->get_tree() op.
 140 */
 141enum vfs_get_super_keying {
 142        vfs_get_single_super,   /* Only one such superblock may exist */
 143        vfs_get_keyed_super,    /* Superblocks with different s_fs_info keys may exist */
 144        vfs_get_independent_super, /* Multiple independent superblocks may exist */
 145};
 146extern int vfs_get_super(struct fs_context *fc,
 147                         enum vfs_get_super_keying keying,
 148                         int (*fill_super)(struct super_block *sb,
 149                                           struct fs_context *fc));
 150extern int get_tree_nodev(struct fs_context *fc,
 151                         int (*fill_super)(struct super_block *sb,
 152                                           struct fs_context *fc));
 153extern int get_tree_single(struct fs_context *fc,
 154                         int (*fill_super)(struct super_block *sb,
 155                                           struct fs_context *fc));
 156
 157extern const struct file_operations fscontext_fops;
 158
 159/*
 160 * Mount error, warning and informational message logging.  This structure is
 161 * shareable between a mount and a subordinate mount.
 162 */
 163struct fc_log {
 164        refcount_t      usage;
 165        u8              head;           /* Insertion index in buffer[] */
 166        u8              tail;           /* Removal index in buffer[] */
 167        u8              need_free;      /* Mask of kfree'able items in buffer[] */
 168        struct module   *owner;         /* Owner module for strings that don't then need freeing */
 169        char            *buffer[8];
 170};
 171
 172extern __attribute__((format(printf, 2, 3)))
 173void logfc(struct fs_context *fc, const char *fmt, ...);
 174
 175/**
 176 * infof - Store supplementary informational message
 177 * @fc: The context in which to log the informational message
 178 * @fmt: The format string
 179 *
 180 * Store the supplementary informational message for the process if the process
 181 * has enabled the facility.
 182 */
 183#define infof(fc, fmt, ...) ({ logfc(fc, "i "fmt, ## __VA_ARGS__); })
 184
 185/**
 186 * warnf - Store supplementary warning message
 187 * @fc: The context in which to log the error message
 188 * @fmt: The format string
 189 *
 190 * Store the supplementary warning message for the process if the process has
 191 * enabled the facility.
 192 */
 193#define warnf(fc, fmt, ...) ({ logfc(fc, "w "fmt, ## __VA_ARGS__); })
 194
 195/**
 196 * errorf - Store supplementary error message
 197 * @fc: The context in which to log the error message
 198 * @fmt: The format string
 199 *
 200 * Store the supplementary error message for the process if the process has
 201 * enabled the facility.
 202 */
 203#define errorf(fc, fmt, ...) ({ logfc(fc, "e "fmt, ## __VA_ARGS__); })
 204
 205/**
 206 * invalf - Store supplementary invalid argument error message
 207 * @fc: The context in which to log the error message
 208 * @fmt: The format string
 209 *
 210 * Store the supplementary error message for the process if the process has
 211 * enabled the facility and return -EINVAL.
 212 */
 213#define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
 214
 215#endif /* _LINUX_FS_CONTEXT_H */
 216