@@ -367,6 +367,24 @@ EXPORT_SYMBOL(fs_param_is_blockdev);
int fs_param_is_path(struct p_log *log, const struct fs_parameter_spec *p,
struct fs_parameter *param, struct fs_parse_result *result)
{
+ int ret;
+ struct filename *f;
+ struct path path;
+
+ if (param->type != fs_value_is_filename)
+ return fs_param_bad_value(log, param);
+ if (!*param->string && (p->flags & fs_param_can_be_empty))
+ return 0;
+
+ f = param->name;
+ ret = filename_lookup(param->dirfd, f, LOOKUP_FOLLOW, &path, NULL);
+ if (ret < 0) {
+ error_plog(log, "%s: Lookup failure for '%s'", param->key, f->name);
+ return fs_param_bad_value(log, param);
+ }
+ result->ptr = d_backing_inode(path.dentry);
+ path_put(&path);
+
return 0;
}
EXPORT_SYMBOL(fs_param_is_path);
@@ -57,6 +57,7 @@ struct fs_parse_result {
int int_32; /* For spec_s32/spec_enum */
unsigned int uint_32; /* For spec_u32{,_octal,_hex}/spec_enum */
u64 uint_64; /* For spec_u64 */
+ const void *ptr; /* For spec_ptr */
};
};
`fsparam_path` uses `fs_param_is_path` to parse the option, but it is currently empty. The new mount api has considered this option in `fsconfig`(that is FSCONFIG_SET_PATH). Here we add general path parser in filesystem layer. Currently, no filesystem uses this function to parse parameters, we add `void *ptr` in `fs_parse_result` to point to the target structure(such as `struct inode *`). Signed-off-by: Hongbo Li <lihongbo22@huawei.com> --- fs/fs_parser.c | 18 ++++++++++++++++++ include/linux/fs_parser.h | 1 + 2 files changed, 19 insertions(+)