blob: d208cc40b868bba10d9d37fef9ff5142521e3a2e [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/*
38 * Filesystem context for holding the parameters used in the creation or
39 * reconfiguration of a superblock.
40 *
41 * Superblock creation fills in ->root whereas reconfiguration begins with this
42 * already set.
43 *
44 * See Documentation/filesystems/mounting.txt
45 */
46struct fs_context {
Al Virof3a09c92018-12-23 18:55:56 -050047 const struct fs_context_operations *ops;
David Howells9bc61ab2018-11-04 03:19:03 -050048 struct file_system_type *fs_type;
49 void *fs_private; /* The filesystem's context */
50 struct dentry *root; /* The root and superblock */
51 struct user_namespace *user_ns; /* The user namespace for this mount */
52 struct net *net_ns; /* The network namespace for this mount */
53 const struct cred *cred; /* The mounter's credentials */
54 const char *source; /* The source name (eg. dev path) */
55 const char *subtype; /* The subtype to set on the superblock */
56 void *security; /* Linux S&M options */
57 unsigned int sb_flags; /* Proposed superblock flags (SB_*) */
58 unsigned int sb_flags_mask; /* Superblock flags that were changed */
59 enum fs_context_purpose purpose:8;
60 bool need_free:1; /* Need to call ops->free() */
61};
62
Al Virof3a09c92018-12-23 18:55:56 -050063struct fs_context_operations {
64 void (*free)(struct fs_context *fc);
65 int (*parse_monolithic)(struct fs_context *fc, void *data);
66 int (*get_tree)(struct fs_context *fc);
67 int (*reconfigure)(struct fs_context *fc);
68};
69
David Howells9bc61ab2018-11-04 03:19:03 -050070/*
71 * fs_context manipulation functions.
72 */
73extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
74 unsigned int sb_flags);
David Howells8d0347f2018-11-04 09:28:36 -050075extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
76 unsigned int sb_flags,
77 unsigned int sb_flags_mask);
Al Viroe1a91582018-12-23 16:25:31 -050078extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
79 struct dentry *reference);
David Howells9bc61ab2018-11-04 03:19:03 -050080
81extern int vfs_get_tree(struct fs_context *fc);
82extern void put_fs_context(struct fs_context *fc);
83
David Howellsc6b82262018-11-01 23:07:23 +000084#define logfc(FC, FMT, ...) pr_notice(FMT, ## __VA_ARGS__)
85
86/**
87 * infof - Store supplementary informational message
88 * @fc: The context in which to log the informational message
89 * @fmt: The format string
90 *
91 * Store the supplementary informational message for the process if the process
92 * has enabled the facility.
93 */
94#define infof(fc, fmt, ...) ({ logfc(fc, fmt, ## __VA_ARGS__); })
95
96/**
97 * warnf - Store supplementary warning message
98 * @fc: The context in which to log the error message
99 * @fmt: The format string
100 *
101 * Store the supplementary warning message for the process if the process has
102 * enabled the facility.
103 */
104#define warnf(fc, fmt, ...) ({ logfc(fc, fmt, ## __VA_ARGS__); })
105
106/**
107 * errorf - Store supplementary error message
108 * @fc: The context in which to log the error message
109 * @fmt: The format string
110 *
111 * Store the supplementary error message for the process if the process has
112 * enabled the facility.
113 */
114#define errorf(fc, fmt, ...) ({ logfc(fc, fmt, ## __VA_ARGS__); })
115
116/**
117 * invalf - Store supplementary invalid argument error message
118 * @fc: The context in which to log the error message
119 * @fmt: The format string
120 *
121 * Store the supplementary error message for the process if the process has
122 * enabled the facility and return -EINVAL.
123 */
124#define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
125
David Howells9bc61ab2018-11-04 03:19:03 -0500126#endif /* _LINUX_FS_CONTEXT_H */