blob: 0db0b645c7b876219291f4cfa3d037684dd3edbc [file] [log] [blame]
David Howells9bc61ab2018-11-04 03:19:03 -05001/* Filesystem superblock creation and reconfiguration context.
2 *
3 * Copyright (C) 2018 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
10 */
11
12#ifndef _LINUX_FS_CONTEXT_H
13#define _LINUX_FS_CONTEXT_H
14
15#include <linux/kernel.h>
16#include <linux/errno.h>
17#include <linux/security.h>
18
19struct cred;
20struct dentry;
21struct file_operations;
22struct file_system_type;
Al Virof3a09c92018-12-23 18:55:56 -050023struct mnt_namespace;
David Howells9bc61ab2018-11-04 03:19:03 -050024struct net;
Al Virof3a09c92018-12-23 18:55:56 -050025struct pid_namespace;
26struct super_block;
David Howells9bc61ab2018-11-04 03:19:03 -050027struct user_namespace;
Al Virof3a09c92018-12-23 18:55:56 -050028struct vfsmount;
29struct path;
David Howells9bc61ab2018-11-04 03:19:03 -050030
31enum fs_context_purpose {
32 FS_CONTEXT_FOR_MOUNT, /* New superblock for explicit mount */
Al Viroe1a91582018-12-23 16:25:31 -050033 FS_CONTEXT_FOR_SUBMOUNT, /* New superblock for automatic submount */
David Howells8d0347f2018-11-04 09:28:36 -050034 FS_CONTEXT_FOR_RECONFIGURE, /* Superblock reconfiguration (remount) */
David Howells9bc61ab2018-11-04 03:19:03 -050035};
36
37/*
David Howells31d921c2018-11-01 23:07:24 +000038 * Type of parameter value.
39 */
40enum fs_value_type {
41 fs_value_is_undefined,
42 fs_value_is_flag, /* Value not given a value */
43 fs_value_is_string, /* Value is a string */
44 fs_value_is_blob, /* Value is a binary blob */
45 fs_value_is_filename, /* Value is a filename* + dirfd */
46 fs_value_is_filename_empty, /* Value is a filename* + dirfd + AT_EMPTY_PATH */
47 fs_value_is_file, /* Value is a file* */
48};
49
50/*
51 * Configuration parameter.
52 */
53struct fs_parameter {
54 const char *key; /* Parameter name */
55 enum fs_value_type type:8; /* The type of value here */
56 union {
57 char *string;
58 void *blob;
59 struct filename *name;
60 struct file *file;
61 };
62 size_t size;
63 int dirfd;
64};
65
66/*
David Howells9bc61ab2018-11-04 03:19:03 -050067 * Filesystem context for holding the parameters used in the creation or
68 * reconfiguration of a superblock.
69 *
70 * Superblock creation fills in ->root whereas reconfiguration begins with this
71 * already set.
72 *
73 * See Documentation/filesystems/mounting.txt
74 */
75struct fs_context {
Al Virof3a09c92018-12-23 18:55:56 -050076 const struct fs_context_operations *ops;
David Howells9bc61ab2018-11-04 03:19:03 -050077 struct file_system_type *fs_type;
78 void *fs_private; /* The filesystem's context */
79 struct dentry *root; /* The root and superblock */
80 struct user_namespace *user_ns; /* The user namespace for this mount */
81 struct net *net_ns; /* The network namespace for this mount */
82 const struct cred *cred; /* The mounter's credentials */
83 const char *source; /* The source name (eg. dev path) */
84 const char *subtype; /* The subtype to set on the superblock */
85 void *security; /* Linux S&M options */
Al Virocb50b342018-12-23 17:25:47 -050086 void *s_fs_info; /* Proposed s_fs_info */
David Howells9bc61ab2018-11-04 03:19:03 -050087 unsigned int sb_flags; /* Proposed superblock flags (SB_*) */
88 unsigned int sb_flags_mask; /* Superblock flags that were changed */
David Howells846e5662018-11-01 23:07:24 +000089 unsigned int lsm_flags; /* Information flags from the fs to the LSM */
David Howells9bc61ab2018-11-04 03:19:03 -050090 enum fs_context_purpose purpose:8;
91 bool need_free:1; /* Need to call ops->free() */
Al Virocb50b342018-12-23 17:25:47 -050092 bool global:1; /* Goes into &init_user_ns */
David Howells9bc61ab2018-11-04 03:19:03 -050093};
94
Al Virof3a09c92018-12-23 18:55:56 -050095struct fs_context_operations {
96 void (*free)(struct fs_context *fc);
Al Viro0b520752018-12-23 16:02:47 -050097 int (*dup)(struct fs_context *fc, struct fs_context *src_fc);
David Howells3e1aeb02018-11-01 23:07:25 +000098 int (*parse_param)(struct fs_context *fc, struct fs_parameter *param);
Al Virof3a09c92018-12-23 18:55:56 -050099 int (*parse_monolithic)(struct fs_context *fc, void *data);
100 int (*get_tree)(struct fs_context *fc);
101 int (*reconfigure)(struct fs_context *fc);
102};
103
David Howells9bc61ab2018-11-04 03:19:03 -0500104/*
105 * fs_context manipulation functions.
106 */
107extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
108 unsigned int sb_flags);
David Howells8d0347f2018-11-04 09:28:36 -0500109extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
110 unsigned int sb_flags,
111 unsigned int sb_flags_mask);
Al Viroe1a91582018-12-23 16:25:31 -0500112extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
113 struct dentry *reference);
David Howells9bc61ab2018-11-04 03:19:03 -0500114
Al Viro0b520752018-12-23 16:02:47 -0500115extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
David Howells3e1aeb02018-11-01 23:07:25 +0000116extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
117extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
118 const char *value, size_t v_size);
119extern int generic_parse_monolithic(struct fs_context *fc, void *data);
David Howells9bc61ab2018-11-04 03:19:03 -0500120extern int vfs_get_tree(struct fs_context *fc);
121extern void put_fs_context(struct fs_context *fc);
122
Al Virocb50b342018-12-23 17:25:47 -0500123/*
124 * sget() wrapper to be called from the ->get_tree() op.
125 */
126enum vfs_get_super_keying {
127 vfs_get_single_super, /* Only one such superblock may exist */
128 vfs_get_keyed_super, /* Superblocks with different s_fs_info keys may exist */
129 vfs_get_independent_super, /* Multiple independent superblocks may exist */
130};
131extern int vfs_get_super(struct fs_context *fc,
132 enum vfs_get_super_keying keying,
133 int (*fill_super)(struct super_block *sb,
134 struct fs_context *fc));
135
David Howellsc6b82262018-11-01 23:07:23 +0000136#define logfc(FC, FMT, ...) pr_notice(FMT, ## __VA_ARGS__)
137
138/**
139 * infof - Store supplementary informational message
140 * @fc: The context in which to log the informational message
141 * @fmt: The format string
142 *
143 * Store the supplementary informational message for the process if the process
144 * has enabled the facility.
145 */
146#define infof(fc, fmt, ...) ({ logfc(fc, fmt, ## __VA_ARGS__); })
147
148/**
149 * warnf - Store supplementary warning message
150 * @fc: The context in which to log the error message
151 * @fmt: The format string
152 *
153 * Store the supplementary warning message for the process if the process has
154 * enabled the facility.
155 */
156#define warnf(fc, fmt, ...) ({ logfc(fc, fmt, ## __VA_ARGS__); })
157
158/**
159 * errorf - Store supplementary error message
160 * @fc: The context in which to log the error message
161 * @fmt: The format string
162 *
163 * Store the supplementary error message for the process if the process has
164 * enabled the facility.
165 */
166#define errorf(fc, fmt, ...) ({ logfc(fc, fmt, ## __VA_ARGS__); })
167
168/**
169 * invalf - Store supplementary invalid argument error message
170 * @fc: The context in which to log the error message
171 * @fmt: The format string
172 *
173 * Store the supplementary error message for the process if the process has
174 * enabled the facility and return -EINVAL.
175 */
176#define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
177
David Howells9bc61ab2018-11-04 03:19:03 -0500178#endif /* _LINUX_FS_CONTEXT_H */