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/mounting.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            lsm_flags;      /* Information flags from the fs to the LSM */
 103        enum fs_context_purpose purpose:8;
 104        enum fs_context_phase   phase:8;        /* The phase the context is in */
 105        bool                    need_free:1;    /* Need to call ops->free() */
 106        bool                    global:1;       /* Goes into &init_user_ns */
 107};
 108
 109struct fs_context_operations {
 110        void (*free)(struct fs_context *fc);
 111        int (*dup)(struct fs_context *fc, struct fs_context *src_fc);
 112        int (*parse_param)(struct fs_context *fc, struct fs_parameter *param);
 113        int (*parse_monolithic)(struct fs_context *fc, void *data);
 114        int (*get_tree)(struct fs_context *fc);
 115        int (*reconfigure)(struct fs_context *fc);
 116};
 117
 118/*
 119 * fs_context manipulation functions.
 120 */
 121extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
 122                                                unsigned int sb_flags);
 123extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
 124                                                unsigned int sb_flags,
 125                                                unsigned int sb_flags_mask);
 126extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
 127                                                struct dentry *reference);
 128
 129extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
 130extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
 131extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
 132                               const char *value, size_t v_size);
 133extern int generic_parse_monolithic(struct fs_context *fc, void *data);
 134extern int vfs_get_tree(struct fs_context *fc);
 135extern void put_fs_context(struct fs_context *fc);
 136
 137/*
 138 * sget() wrapper to be called from the ->get_tree() op.
 139 */
 140enum vfs_get_super_keying {
 141        vfs_get_single_super,   /* Only one such superblock may exist */
 142        vfs_get_keyed_super,    /* Superblocks with different s_fs_info keys may exist */
 143        vfs_get_independent_super, /* Multiple independent superblocks may exist */
 144};
 145extern int vfs_get_super(struct fs_context *fc,
 146                         enum vfs_get_super_keying keying,
 147                         int (*fill_super)(struct super_block *sb,
 148                                           struct fs_context *fc));
 149
 150extern const struct file_operations fscontext_fops;
 151
 152/*
 153 * Mount error, warning and informational message logging.  This structure is
 154 * shareable between a mount and a subordinate mount.
 155 */
 156struct fc_log {
 157        refcount_t      usage;
 158        u8              head;           /* Insertion index in buffer[] */
 159        u8              tail;           /* Removal index in buffer[] */
 160        u8              need_free;      /* Mask of kfree'able items in buffer[] */
 161        struct module   *owner;         /* Owner module for strings that don't then need freeing */
 162        char            *buffer[8];
 163};
 164
 165extern __attribute__((format(printf, 2, 3)))
 166void logfc(struct fs_context *fc, const char *fmt, ...);
 167
 168/**
 169 * infof - Store supplementary informational message
 170 * @fc: The context in which to log the informational message
 171 * @fmt: The format string
 172 *
 173 * Store the supplementary informational message for the process if the process
 174 * has enabled the facility.
 175 */
 176#define infof(fc, fmt, ...) ({ logfc(fc, "i "fmt, ## __VA_ARGS__); })
 177
 178/**
 179 * warnf - Store supplementary warning message
 180 * @fc: The context in which to log the error message
 181 * @fmt: The format string
 182 *
 183 * Store the supplementary warning message for the process if the process has
 184 * enabled the facility.
 185 */
 186#define warnf(fc, fmt, ...) ({ logfc(fc, "w "fmt, ## __VA_ARGS__); })
 187
 188/**
 189 * errorf - Store supplementary error message
 190 * @fc: The context in which to log the error message
 191 * @fmt: The format string
 192 *
 193 * Store the supplementary error message for the process if the process has
 194 * enabled the facility.
 195 */
 196#define errorf(fc, fmt, ...) ({ logfc(fc, "e "fmt, ## __VA_ARGS__); })
 197
 198/**
 199 * invalf - Store supplementary invalid argument error message
 200 * @fc: The context in which to log the error message
 201 * @fmt: The format string
 202 *
 203 * Store the supplementary error message for the process if the process has
 204 * enabled the facility and return -EINVAL.
 205 */
 206#define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
 207
 208#endif /* _LINUX_FS_CONTEXT_H */
 209