1
2
3
4
5
6
7
8#ifndef _LINUX_FS_PARSER_H
9#define _LINUX_FS_PARSER_H
10
11#include <linux/fs_context.h>
12
13struct path;
14
15struct constant_table {
16 const char *name;
17 int value;
18};
19
20struct fs_parameter_spec;
21struct fs_parse_result;
22typedef int fs_param_type(struct p_log *,
23 const struct fs_parameter_spec *,
24 struct fs_parameter *,
25 struct fs_parse_result *);
26
27
28
29fs_param_type fs_param_is_bool, fs_param_is_u32, fs_param_is_s32, fs_param_is_u64,
30 fs_param_is_enum, fs_param_is_string, fs_param_is_blob, fs_param_is_blockdev,
31 fs_param_is_path, fs_param_is_fd;
32
33
34
35
36
37
38
39struct fs_parameter_spec {
40 const char *name;
41 fs_param_type *type;
42 u8 opt;
43 unsigned short flags;
44#define fs_param_neg_with_no 0x0002
45#define fs_param_neg_with_empty 0x0004
46#define fs_param_deprecated 0x0008
47 const void *data;
48};
49
50
51
52
53struct fs_parse_result {
54 bool negated;
55 union {
56 bool boolean;
57 int int_32;
58 unsigned int uint_32;
59 u64 uint_64;
60 };
61};
62
63extern int __fs_parse(struct p_log *log,
64 const struct fs_parameter_spec *desc,
65 struct fs_parameter *value,
66 struct fs_parse_result *result);
67
68static inline int fs_parse(struct fs_context *fc,
69 const struct fs_parameter_spec *desc,
70 struct fs_parameter *param,
71 struct fs_parse_result *result)
72{
73 return __fs_parse(&fc->log, desc, param, result);
74}
75
76extern int fs_lookup_param(struct fs_context *fc,
77 struct fs_parameter *param,
78 bool want_bdev,
79 struct path *_path);
80
81extern int lookup_constant(const struct constant_table tbl[], const char *name, int not_found);
82
83#ifdef CONFIG_VALIDATE_FS_PARSER
84extern bool validate_constant_table(const struct constant_table *tbl, size_t tbl_size,
85 int low, int high, int special);
86extern bool fs_validate_description(const char *name,
87 const struct fs_parameter_spec *desc);
88#else
89static inline bool validate_constant_table(const struct constant_table *tbl, size_t tbl_size,
90 int low, int high, int special)
91{ return true; }
92static inline bool fs_validate_description(const char *name,
93 const struct fs_parameter_spec *desc)
94{ return true; }
95#endif
96
97
98
99
100
101
102
103
104
105
106#define __fsparam(TYPE, NAME, OPT, FLAGS, DATA) \
107 { \
108 .name = NAME, \
109 .opt = OPT, \
110 .type = TYPE, \
111 .flags = FLAGS, \
112 .data = DATA \
113 }
114
115#define fsparam_flag(NAME, OPT) __fsparam(NULL, NAME, OPT, 0, NULL)
116#define fsparam_flag_no(NAME, OPT) \
117 __fsparam(NULL, NAME, OPT, fs_param_neg_with_no, NULL)
118#define fsparam_bool(NAME, OPT) __fsparam(fs_param_is_bool, NAME, OPT, 0, NULL)
119#define fsparam_u32(NAME, OPT) __fsparam(fs_param_is_u32, NAME, OPT, 0, NULL)
120#define fsparam_u32oct(NAME, OPT) \
121 __fsparam(fs_param_is_u32, NAME, OPT, 0, (void *)8)
122#define fsparam_u32hex(NAME, OPT) \
123 __fsparam(fs_param_is_u32_hex, NAME, OPT, 0, (void *)16)
124#define fsparam_s32(NAME, OPT) __fsparam(fs_param_is_s32, NAME, OPT, 0, NULL)
125#define fsparam_u64(NAME, OPT) __fsparam(fs_param_is_u64, NAME, OPT, 0, NULL)
126#define fsparam_enum(NAME, OPT, array) __fsparam(fs_param_is_enum, NAME, OPT, 0, array)
127#define fsparam_string(NAME, OPT) \
128 __fsparam(fs_param_is_string, NAME, OPT, 0, NULL)
129#define fsparam_blob(NAME, OPT) __fsparam(fs_param_is_blob, NAME, OPT, 0, NULL)
130#define fsparam_bdev(NAME, OPT) __fsparam(fs_param_is_blockdev, NAME, OPT, 0, NULL)
131#define fsparam_path(NAME, OPT) __fsparam(fs_param_is_path, NAME, OPT, 0, NULL)
132#define fsparam_fd(NAME, OPT) __fsparam(fs_param_is_fd, NAME, OPT, 0, NULL)
133
134#endif
135