Skip to content

Commit 142fa60

Browse files
andrealmeidbrauner
authored andcommitted
unicode: Recreate utf8_parse_version()
All filesystems that currently support UTF-8 casefold can fetch the UTF-8 version from the filesystem metadata stored on disk. They can get the data stored and directly match it to a integer, so they can skip the string parsing step, which motivated the removal of this function in the first place. However, for tmpfs, the only way to tell the kernel which UTF-8 version we are about to use is via mount options, using a string. Re-introduce utf8_parse_version() to be used by tmpfs. This version differs from the original by skipping the intermediate step of copying the version string to an auxiliary string before calling match_token(). This versions calls match_token() in the argument string. The paramenters are simpler now as well. utf8_parse_version() was created by 9d53690 ("unicode: implement higher level API for string handling") and later removed by 49bd03c ("unicode: pass a UNICODE_AGE() tripple to utf8_load"). Signed-off-by: André Almeida <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Theodore Ts'o <[email protected]> Reviewed-by: Gabriel Krisman Bertazi <[email protected]> Signed-off-by: Christian Brauner <[email protected]>
1 parent 04dad6c commit 142fa60

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

fs/unicode/utf8-core.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,3 +214,29 @@ void utf8_unload(struct unicode_map *um)
214214
}
215215
EXPORT_SYMBOL(utf8_unload);
216216

217+
/**
218+
* utf8_parse_version - Parse a UTF-8 version number from a string
219+
*
220+
* @version: input string
221+
*
222+
* Returns the parsed version on success, negative code on error
223+
*/
224+
int utf8_parse_version(char *version)
225+
{
226+
substring_t args[3];
227+
unsigned int maj, min, rev;
228+
static const struct match_token token[] = {
229+
{1, "%d.%d.%d"},
230+
{0, NULL}
231+
};
232+
233+
if (match_token(version, token, args) != 1)
234+
return -EINVAL;
235+
236+
if (match_int(&args[0], &maj) || match_int(&args[1], &min) ||
237+
match_int(&args[2], &rev))
238+
return -EINVAL;
239+
240+
return UNICODE_AGE(maj, min, rev);
241+
}
242+
EXPORT_SYMBOL(utf8_parse_version);

include/linux/unicode.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,6 @@ int utf8_casefold_hash(const struct unicode_map *um, const void *salt,
7878
struct unicode_map *utf8_load(unsigned int version);
7979
void utf8_unload(struct unicode_map *um);
8080

81+
int utf8_parse_version(char *version);
82+
8183
#endif /* _LINUX_UNICODE_H */

0 commit comments

Comments
 (0)