introduce fs_context methods
[muen/linux.git] / include / linux / fs_context.h
1 /* 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
19 struct cred;
20 struct dentry;
21 struct file_operations;
22 struct file_system_type;
23 struct mnt_namespace;
24 struct net;
25 struct pid_namespace;
26 struct super_block;
27 struct user_namespace;
28 struct vfsmount;
29 struct path;
30
31 enum fs_context_purpose {
32         FS_CONTEXT_FOR_MOUNT,           /* New superblock for explicit mount */
33         FS_CONTEXT_FOR_SUBMOUNT,        /* New superblock for automatic submount */
34         FS_CONTEXT_FOR_RECONFIGURE,     /* Superblock reconfiguration (remount) */
35 };
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  */
46 struct fs_context {
47         const struct fs_context_operations *ops;
48         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
63 struct 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
70 /*
71  * fs_context manipulation functions.
72  */
73 extern struct fs_context *fs_context_for_mount(struct file_system_type *fs_type,
74                                                 unsigned int sb_flags);
75 extern struct fs_context *fs_context_for_reconfigure(struct dentry *dentry,
76                                                 unsigned int sb_flags,
77                                                 unsigned int sb_flags_mask);
78 extern struct fs_context *fs_context_for_submount(struct file_system_type *fs_type,
79                                                 struct dentry *reference);
80
81 extern int vfs_get_tree(struct fs_context *fc);
82 extern void put_fs_context(struct fs_context *fc);
83
84 #endif /* _LINUX_FS_CONTEXT_H */