mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
fs: factor out vfs_parse_monolithic_sep() helper
[ Upstream commite001d1447c
] Factor out vfs_parse_monolithic_sep() from generic_parse_monolithic(), so filesystems could use it with a custom option separator callback. Acked-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Amir Goldstein <amir73il@gmail.com> Stable-dep-of:c34706acf4
("ovl: fix regression in parsing of mount options with escaped comma") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
87be623442
commit
cd86498418
@ -192,17 +192,19 @@ int vfs_parse_fs_string(struct fs_context *fc, const char *key,
|
||||
EXPORT_SYMBOL(vfs_parse_fs_string);
|
||||
|
||||
/**
|
||||
* generic_parse_monolithic - Parse key[=val][,key[=val]]* mount data
|
||||
* vfs_parse_monolithic_sep - Parse key[=val][,key[=val]]* mount data
|
||||
* @fc: The superblock configuration to fill in.
|
||||
* @data: The data to parse
|
||||
* @sep: callback for separating next option
|
||||
*
|
||||
* Parse a blob of data that's in key[=val][,key[=val]]* form. This can be
|
||||
* called from the ->monolithic_mount_data() fs_context operation.
|
||||
* Parse a blob of data that's in key[=val][,key[=val]]* form with a custom
|
||||
* option separator callback.
|
||||
*
|
||||
* Returns 0 on success or the error returned by the ->parse_option() fs_context
|
||||
* operation on failure.
|
||||
*/
|
||||
int generic_parse_monolithic(struct fs_context *fc, void *data)
|
||||
int vfs_parse_monolithic_sep(struct fs_context *fc, void *data,
|
||||
char *(*sep)(char **))
|
||||
{
|
||||
char *options = data, *key;
|
||||
int ret = 0;
|
||||
@ -214,7 +216,7 @@ int generic_parse_monolithic(struct fs_context *fc, void *data)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
while ((key = strsep(&options, ",")) != NULL) {
|
||||
while ((key = sep(&options)) != NULL) {
|
||||
if (*key) {
|
||||
size_t v_len = 0;
|
||||
char *value = strchr(key, '=');
|
||||
@ -233,6 +235,28 @@ int generic_parse_monolithic(struct fs_context *fc, void *data)
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(vfs_parse_monolithic_sep);
|
||||
|
||||
static char *vfs_parse_comma_sep(char **s)
|
||||
{
|
||||
return strsep(s, ",");
|
||||
}
|
||||
|
||||
/**
|
||||
* generic_parse_monolithic - Parse key[=val][,key[=val]]* mount data
|
||||
* @fc: The superblock configuration to fill in.
|
||||
* @data: The data to parse
|
||||
*
|
||||
* Parse a blob of data that's in key[=val][,key[=val]]* form. This can be
|
||||
* called from the ->monolithic_mount_data() fs_context operation.
|
||||
*
|
||||
* Returns 0 on success or the error returned by the ->parse_option() fs_context
|
||||
* operation on failure.
|
||||
*/
|
||||
int generic_parse_monolithic(struct fs_context *fc, void *data)
|
||||
{
|
||||
return vfs_parse_monolithic_sep(fc, data, vfs_parse_comma_sep);
|
||||
}
|
||||
EXPORT_SYMBOL(generic_parse_monolithic);
|
||||
|
||||
/**
|
||||
|
@ -135,6 +135,8 @@ extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc);
|
||||
extern int vfs_parse_fs_param(struct fs_context *fc, struct fs_parameter *param);
|
||||
extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
|
||||
const char *value, size_t v_size);
|
||||
int vfs_parse_monolithic_sep(struct fs_context *fc, void *data,
|
||||
char *(*sep)(char **));
|
||||
extern int generic_parse_monolithic(struct fs_context *fc, void *data);
|
||||
extern int vfs_get_tree(struct fs_context *fc);
|
||||
extern void put_fs_context(struct fs_context *fc);
|
||||
|
Loading…
Reference in New Issue
Block a user