Commit e001d144 authored by Amir Goldstein's avatar Amir Goldstein

fs: factor out vfs_parse_monolithic_sep() helper

Factor out vfs_parse_monolithic_sep() from generic_parse_monolithic(),
so filesystems could use it with a custom option separator callback.
Acked-by: default avatarChristian Brauner <brauner@kernel.org>
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
parent 94f6f055
...@@ -192,17 +192,19 @@ int vfs_parse_fs_string(struct fs_context *fc, const char *key, ...@@ -192,17 +192,19 @@ int vfs_parse_fs_string(struct fs_context *fc, const char *key,
EXPORT_SYMBOL(vfs_parse_fs_string); 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. * @fc: The superblock configuration to fill in.
* @data: The data to parse * @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 * Parse a blob of data that's in key[=val][,key[=val]]* form with a custom
* called from the ->monolithic_mount_data() fs_context operation. * option separator callback.
* *
* Returns 0 on success or the error returned by the ->parse_option() fs_context * Returns 0 on success or the error returned by the ->parse_option() fs_context
* operation on failure. * 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; char *options = data, *key;
int ret = 0; int ret = 0;
...@@ -214,7 +216,7 @@ int generic_parse_monolithic(struct fs_context *fc, void *data) ...@@ -214,7 +216,7 @@ int generic_parse_monolithic(struct fs_context *fc, void *data)
if (ret) if (ret)
return ret; return ret;
while ((key = strsep(&options, ",")) != NULL) { while ((key = sep(&options)) != NULL) {
if (*key) { if (*key) {
size_t v_len = 0; size_t v_len = 0;
char *value = strchr(key, '='); char *value = strchr(key, '=');
...@@ -233,6 +235,28 @@ int generic_parse_monolithic(struct fs_context *fc, void *data) ...@@ -233,6 +235,28 @@ int generic_parse_monolithic(struct fs_context *fc, void *data)
return ret; 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); EXPORT_SYMBOL(generic_parse_monolithic);
/** /**
......
...@@ -136,6 +136,8 @@ extern struct fs_context *vfs_dup_fs_context(struct fs_context *fc); ...@@ -136,6 +136,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_param(struct fs_context *fc, struct fs_parameter *param);
extern int vfs_parse_fs_string(struct fs_context *fc, const char *key, extern int vfs_parse_fs_string(struct fs_context *fc, const char *key,
const char *value, size_t v_size); 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 generic_parse_monolithic(struct fs_context *fc, void *data);
extern int vfs_get_tree(struct fs_context *fc); extern int vfs_get_tree(struct fs_context *fc);
extern void put_fs_context(struct fs_context *fc); extern void put_fs_context(struct fs_context *fc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment