[RFC PATCH 14/20] jfs: Remove custom iso8859-1 implementation

From: Pali Rohár
Date: Sun Aug 08 2021 - 12:25:30 EST


When iocharset= mount option is not specified or when is set to
iocharset=none then jfs driver uses its own custom iso8895-1 encoding
implementation.

NLS already provides iso8895-1 module, so use it instead of custom jfs
iso8859-1 implementation.

Signed-off-by: Pali Rohár <pali@xxxxxxxxxx>
---
fs/jfs/jfs_unicode.c | 14 +-------------
fs/jfs/super.c | 29 +++++++++++++++++++----------
2 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/fs/jfs/jfs_unicode.c b/fs/jfs/jfs_unicode.c
index 0c1e9027245a..1d0f65d13b58 100644
--- a/fs/jfs/jfs_unicode.c
+++ b/fs/jfs/jfs_unicode.c
@@ -33,13 +33,8 @@ int jfs_strfromUCS_le(char *to, const __le16 * from,
NLS_MAX_CHARSET_SIZE);
if (charlen > 0)
outlen += charlen;
- else
+ else {
to[outlen++] = '?';
- }
- } else {
- for (i = 0; (i < len) && from[i]; i++) {
- if (unlikely(le16_to_cpu(from[i]) & 0xff00)) {
- to[i] = '?';
if (unlikely(warn)) {
warn--;
warn_again--;
@@ -49,12 +44,8 @@ int jfs_strfromUCS_le(char *to, const __le16 * from,
printk(KERN_ERR
"mount with iocharset=utf8 to access\n");
}
-
}
- else
- to[i] = (char) (le16_to_cpu(from[i]));
}
- outlen = i;
}
to[outlen] = 0;
return outlen;
@@ -84,9 +75,6 @@ static int jfs_strtoUCS(wchar_t * to, const unsigned char *from, int len,
return charlen;
}
}
- } else {
- for (i = 0; (i < len) && from[i]; i++)
- to[i] = (wchar_t) from[i];
}

to[i] = 0;
diff --git a/fs/jfs/super.c b/fs/jfs/super.c
index 9030aeaf0f88..8ba2ac032292 100644
--- a/fs/jfs/super.c
+++ b/fs/jfs/super.c
@@ -231,7 +231,7 @@ static const match_table_t tokens = {
};

static int parse_options(char *options, struct super_block *sb, s64 *newLVSize,
- int *flag)
+ int *flag, int remount)
{
void *nls_map = (void *)-1; /* -1: no change; NULL: none */
char *p;
@@ -263,14 +263,14 @@ static int parse_options(char *options, struct super_block *sb, s64 *newLVSize,
case Opt_iocharset:
if (nls_map && nls_map != (void *) -1)
unload_nls(nls_map);
- if (!strcmp(args[0].from, "none"))
- nls_map = NULL;
- else {
+ /* compatibility alias none means ISO-8859-1 */
+ if (strcmp(args[0].from, "none") == 0)
+ nls_map = load_nls("iso8859-1");
+ else
nls_map = load_nls(args[0].from);
- if (!nls_map) {
- pr_err("JFS: charset not found\n");
- goto cleanup;
- }
+ if (!nls_map) {
+ pr_err("JFS: charset not found\n");
+ goto cleanup;
}
break;
case Opt_resize:
@@ -414,6 +414,15 @@ static int parse_options(char *options, struct super_block *sb, s64 *newLVSize,
}
}

+ if (!remount && nls_map == (void *) -1) {
+ /* Previously default NLS table was ISO-8859-1 */
+ nls_map = load_nls("iso8859-1");
+ if (!nls_map) {
+ pr_err("JFS: iso8859-1 charset not found\n");
+ goto cleanup;
+ }
+ }
+
if (nls_map != (void *) -1) {
/* Discard old (if remount) */
unload_nls(sbi->nls_tab);
@@ -435,7 +444,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data)
int ret;

sync_filesystem(sb);
- if (!parse_options(data, sb, &newLVSize, &flag))
+ if (!parse_options(data, sb, &newLVSize, &flag, 1))
return -EINVAL;

if (newLVSize) {
@@ -513,7 +522,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
/* initialize the mount flag and determine the default error handler */
flag = JFS_ERR_REMOUNT_RO;

- if (!parse_options((char *) data, sb, &newLVSize, &flag))
+ if (!parse_options((char *) data, sb, &newLVSize, &flag, 0))
goto out_kfree;
sbi->flag = flag;

--
2.20.1