@@ -582,21 +582,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "macceltic",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "macceltic",
+ .tables = &table,
+};
+
static int __init init_nls_macceltic(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_macceltic(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_macceltic)
@@ -512,21 +512,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "maccenteuro",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "maccenteuro",
+ .tables = &table,
+};
+
static int __init init_nls_maccenteuro(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_maccenteuro(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_maccenteuro)
@@ -582,21 +582,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "maccroatian",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "maccroatian",
+ .tables = &table,
+};
+
static int __init init_nls_maccroatian(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_maccroatian(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_maccroatian)
@@ -477,21 +477,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "maccyrillic",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "maccyrillic",
+ .tables = &table,
+};
+
static int __init init_nls_maccyrillic(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_maccyrillic(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_maccyrillic)
@@ -547,21 +547,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "macgaelic",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "macgaelic",
+ .tables = &table,
+};
+
static int __init init_nls_macgaelic(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_macgaelic(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_macgaelic)
@@ -477,21 +477,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "macgreek",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "macgreek",
+ .tables = &table,
+};
+
static int __init init_nls_macgreek(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_macgreek(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_macgreek)
@@ -582,21 +582,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "maciceland",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "maciceland",
+ .tables = &table,
+};
+
static int __init init_nls_maciceland(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_maciceland(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_maciceland)
@@ -512,21 +512,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "macinuit",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "macinuit",
+ .tables = &table,
+};
+
static int __init init_nls_macinuit(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_macinuit(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_macinuit)
@@ -617,21 +617,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "macroman",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "macroman",
+ .tables = &table,
+};
+
static int __init init_nls_macroman(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_macroman(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_macroman)
@@ -582,21 +582,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "macromanian",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "macromanian",
+ .tables = &table,
+};
+
static int __init init_nls_macromanian(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_macromanian(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_macromanian)
@@ -582,21 +582,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "macturkish",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "macturkish",
+ .tables = &table,
+};
+
static int __init init_nls_macturkish(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_macturkish(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_macturkish)
@@ -147,21 +147,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "ascii",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "ascii",
+ .tables = &table,
+};
+
static int __init init_nls_ascii(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_ascii(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_ascii)
@@ -16,13 +16,18 @@
#include <linux/kmod.h>
#include <linux/spinlock.h>
-static struct nls_table default_table;
-static struct nls_table *tables = &default_table;
+extern struct nls_charset default_charset;
+static struct nls_charset *charsets = &default_charset;
static DEFINE_SPINLOCK(nls_lock);
+static struct nls_table *nls_load_table(struct nls_charset *charset)
+{
+ /* For now, return the default table, which is the first one found. */
+ return charset->tables;
+}
-int __register_nls(struct nls_table *nls, struct module *owner)
+int __register_nls(struct nls_charset *nls, struct module *owner)
{
- struct nls_table ** tmp = &tables;
+ struct nls_charset **tmp = &charsets;
if (nls->next)
return -EBUSY;
@@ -36,16 +41,16 @@ int __register_nls(struct nls_table *nls, struct module *owner)
}
tmp = &(*tmp)->next;
}
- nls->next = tables;
- tables = nls;
+ nls->next = charsets;
+ charsets = nls;
spin_unlock(&nls_lock);
return 0;
}
EXPORT_SYMBOL(__register_nls);
-int unregister_nls(struct nls_table * nls)
+int unregister_nls(struct nls_charset * nls)
{
- struct nls_table ** tmp = &tables;
+ struct nls_charset **tmp = &charsets;
spin_lock(&nls_lock);
while (*tmp) {
@@ -60,31 +65,42 @@ int unregister_nls(struct nls_table * nls)
return -EINVAL;
}
-static struct nls_table *find_nls(char *charset)
+static struct nls_charset *find_nls(const char *charset)
{
- struct nls_table *nls;
+ struct nls_charset *nls;
spin_lock(&nls_lock);
- for (nls = tables; nls; nls = nls->next) {
- if (!strcmp(nls_charset_name(nls), charset))
+ for (nls = charsets; nls; nls = nls->next) {
+ if (!strcmp(nls->charset, charset))
break;
if (nls->alias && !strcmp(nls->alias, charset))
break;
}
- if (nls && !try_module_get(nls->owner))
- nls = NULL;
+
+ if (!nls)
+ nls = ERR_PTR(-EINVAL);
+ else if (!try_module_get(nls->owner))
+ nls = ERR_PTR(-EBUSY);
+
spin_unlock(&nls_lock);
return nls;
}
struct nls_table *load_nls(char *charset)
{
- return try_then_request_module(find_nls(charset), "nls_%s", charset);
+ struct nls_charset *nls_charset;
+
+ nls_charset = try_then_request_module(find_nls(charset),
+ "nls_%s", charset);
+ if (!IS_ERR(nls_charset))
+ return NULL;
+
+ return nls_load_table(nls_charset);
}
void unload_nls(struct nls_table *nls)
{
if (nls)
- module_put(nls->owner);
+ module_put(nls->charset->owner);
}
EXPORT_SYMBOL(unregister_nls);
@@ -328,20 +328,26 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp1250",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp1250",
+ .tables = &table,
+};
+
static int __init init_nls_cp1250(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp1250(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp1250)
@@ -282,21 +282,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp1251",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp1251",
+ .tables = &table,
+};
+
static int __init init_nls_cp1251(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp1251(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp1251)
@@ -363,22 +363,28 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp1255",
- .alias = "iso8859-8",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .alias = "iso8859-8",
+ .charset = "cp1255",
+ .tables = &table,
+};
+
static int __init init_nls_cp1255(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp1255(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp1255)
@@ -368,21 +368,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp437",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp437",
+ .tables = &table,
+};
+
static int __init init_nls_cp437(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp437(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp437)
@@ -331,21 +331,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp737",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp737",
+ .tables = &table,
+};
+
static int __init init_nls_cp737(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp737(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp737)
@@ -300,21 +300,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp775",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp775",
+ .tables = &table,
+};
+
static int __init init_nls_cp775(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp775(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp775)
@@ -296,21 +296,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp850",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp850",
+ .tables = &table,
+};
+
static int __init init_nls_cp850(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp850(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp850)
@@ -318,21 +318,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp852",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp852",
+ .tables = &table,
+};
+
static int __init init_nls_cp852(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp852(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp852)
@@ -280,21 +280,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp855",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp855",
+ .tables = &table,
+};
+
static int __init init_nls_cp855(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp855(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp855)
@@ -282,21 +282,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp857",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp857",
+ .tables = &table,
+};
+
static int __init init_nls_cp857(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp857(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp857)
@@ -345,21 +345,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp860",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp860",
+ .tables = &table,
+};
+
static int __init init_nls_cp860(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp860(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp860)
@@ -368,21 +368,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp861",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp861",
+ .tables = &table,
+};
+
static int __init init_nls_cp861(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp861(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp861)
@@ -402,21 +402,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp862",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp862",
+ .tables = &table,
+};
+
static int __init init_nls_cp862(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp862(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp862)
@@ -362,21 +362,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp863",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp863",
+ .tables = &table,
+};
+
static int __init init_nls_cp863(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp863(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp863)
@@ -388,21 +388,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp864",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp864",
+ .tables = &table,
+};
+
static int __init init_nls_cp864(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp864(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp864)
@@ -368,21 +368,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp865",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp865",
+ .tables = &table,
+};
+
static int __init init_nls_cp865(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp865(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp865)
@@ -286,21 +286,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp866",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp866",
+ .tables = &table,
+};
+
static int __init init_nls_cp866(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp866(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp866)
@@ -296,21 +296,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp869",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "cp869",
+ .tables = &table,
+};
+
static int __init init_nls_cp869(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp869(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp869)
@@ -254,22 +254,28 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp874",
- .alias = "tis-620",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .alias = "tis-620",
+ .charset = "cp874",
+ .tables = &table,
+};
+
static int __init init_nls_cp874(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp874(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp874)
@@ -7912,22 +7912,28 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp932",
- .alias = "sjis",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .alias = "sjis",
+ .charset = "cp932",
+ .tables = &table,
+};
+
static int __init init_nls_cp932(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp932(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp932)
@@ -11090,22 +11090,28 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp936",
- .alias = "gb2312",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .alias = "gb2312",
+ .charset = "cp936",
+ .tables = &table,
+};
+
static int __init init_nls_cp936(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp936(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp936)
@@ -13925,22 +13925,28 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp949",
- .alias = "euc-kr",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .alias = "euc-kr",
+ .charset = "cp949",
+ .tables = &table,
+};
+
static int __init init_nls_cp949(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp949(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp949)
@@ -9461,22 +9461,28 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "cp950",
- .alias = "big5",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .alias = "big5",
+ .charset = "cp950",
+ .tables = &table,
+};
+
static int __init init_nls_cp950(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_cp950(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_cp950)
@@ -17,7 +17,7 @@
#include <asm/byteorder.h>
#include <linux/nls.h>
-static struct nls_table default_table;
+struct nls_charset default_charset;
struct utf8_table {
int cmask;
@@ -453,12 +453,17 @@ static const struct nls_ops charset_ops = {
};
static struct nls_table default_table = {
- .charset = "default",
+ .charset = &default_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+struct nls_charset default_charset = {
+ .charset = "default",
+ .tables = &default_table,
+};
+
/* Returns a simple default translation table */
struct nls_table *load_nls_default(void)
{
@@ -554,11 +554,17 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "euc-jp",
+ .charset = &nls_charset,
.ops = &charset_ops,
};
+static struct nls_charset nls_charset = {
+ .charset = "euc-jp",
+ .tables = &table,
+};
+
static int __init init_nls_euc_jp(void)
{
p_nls = load_nls("cp932");
@@ -566,7 +572,7 @@ static int __init init_nls_euc_jp(void)
if (p_nls) {
table.charset2upper = p_nls->charset2upper;
table.charset2lower = p_nls->charset2lower;
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
return -EINVAL;
@@ -574,7 +580,7 @@ static int __init init_nls_euc_jp(void)
static void __exit exit_nls_euc_jp(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
unload_nls(p_nls);
}
@@ -238,21 +238,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-1",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-1",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_1(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_1(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_1)
@@ -266,21 +266,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-13",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-13",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_13(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_13(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_13)
@@ -322,21 +322,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-14",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-14",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_14(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_14(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_14)
@@ -288,21 +288,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-15",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-15",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_15(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_15(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_15)
@@ -289,21 +289,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-2",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-2",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_2(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_2(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_2)
@@ -289,21 +289,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-3",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-3",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_3(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_3(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_3)
@@ -289,21 +289,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-4",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-4",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_4(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_4(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_4)
@@ -253,21 +253,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-5",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-5",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_5(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_5(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_5)
@@ -244,21 +244,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-6",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-6",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_6(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_6(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_6)
@@ -298,21 +298,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-7",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-7",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_7(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_7(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_7)
@@ -253,21 +253,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "iso8859-9",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "iso8859-9",
+ .tables = &table,
+};
+
static int __init init_nls_iso8859_9(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_iso8859_9(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_iso8859_9)
@@ -304,21 +304,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "koi8-r",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "koi8-r",
+ .tables = &table,
+};
+
static int __init init_nls_koi8_r(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_koi8_r(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_koi8_r)
@@ -56,11 +56,17 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "koi8-ru",
+ .charset = &nls_charset,
.ops = &charset_ops,
};
+static struct nls_charset nls_charset = {
+ .charset = "koi8-ru",
+ .tables = &table,
+};
+
static int __init init_nls_koi8_ru(void)
{
p_nls = load_nls("koi8-u");
@@ -68,7 +74,7 @@ static int __init init_nls_koi8_ru(void)
if (p_nls) {
table.charset2upper = p_nls->charset2upper;
table.charset2lower = p_nls->charset2lower;
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
return -EINVAL;
@@ -76,7 +82,7 @@ static int __init init_nls_koi8_ru(void)
static void __exit exit_nls_koi8_ru(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
unload_nls(p_nls);
}
@@ -311,21 +311,27 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "koi8-u",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = charset2lower,
.charset2upper = charset2upper,
};
+static struct nls_charset nls_charset = {
+ .charset = "koi8-u",
+ .tables = &table,
+};
+
static int __init init_nls_koi8_u(void)
{
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_koi8_u(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_koi8_u)
@@ -45,25 +45,31 @@ static const struct nls_ops charset_ops = {
.char2uni = char2uni,
};
+static struct nls_charset nls_charset;
static struct nls_table table = {
- .charset = "utf8",
+ .charset = &nls_charset,
.ops = &charset_ops,
.charset2lower = identity, /* no conversion */
.charset2upper = identity,
};
+static struct nls_charset nls_charset = {
+ .charset = "utf8",
+ .tables = &table,
+};
+
static int __init init_nls_utf8(void)
{
int i;
for (i=0; i<256; i++)
identity[i] = i;
- return register_nls(&table);
+ return register_nls(&nls_charset);
}
static void __exit exit_nls_utf8(void)
{
- unregister_nls(&table);
+ unregister_nls(&nls_charset);
}
module_init(init_nls_utf8)
@@ -29,15 +29,21 @@ struct nls_ops {
};
struct nls_table {
- const char *charset;
- const char *alias;
+ const struct nls_charset *charset;
const struct nls_ops *ops;
const unsigned char *charset2lower;
const unsigned char *charset2upper;
- struct module *owner;
struct nls_table *next;
};
+struct nls_charset {
+ const char *charset;
+ const char *alias;
+ struct module *owner;
+ struct nls_table *tables;
+ struct nls_charset *next;
+};
+
/* this value hold the maximum octet of charset */
#define NLS_MAX_CHARSET_SIZE 6 /* for UTF-8 */
@@ -49,8 +55,8 @@ enum utf16_endian {
};
/* nls_base.c */
-extern int __register_nls(struct nls_table *, struct module *);
-extern int unregister_nls(struct nls_table *);
+extern int __register_nls(struct nls_charset *, struct module *);
+extern int unregister_nls(struct nls_charset *);
extern struct nls_table *load_nls(char *);
extern void unload_nls(struct nls_table *);
extern struct nls_table *load_nls_default(void);
@@ -78,7 +84,7 @@ static inline int nls_char2uni(const struct nls_table *table,
static inline const char *nls_charset_name(const struct nls_table *table)
{
- return table->charset;
+ return table->charset->charset;
}
static inline unsigned char nls_tolower(struct nls_table *t, unsigned char c)
In order to support multiple versions of the same encoding, we want to split the charset registering data, which enrolls it with the NLS subsystem and is valid for all versions of the encoding, from the version specific data, that is actually going to be returned when the caller loads an NLS charset. With the exception of the following files (files declaration and default charset), which were edited by hand, the other files were generated with the following Coccinelle patch: Files edited by hand: - fs/nls/nls_base.c - include/linux/nls.h - fs/nls/nls_default.c <smpl> @nlstable@ identifier p; expression charset_str; @@ static struct nls_table p = { - .charset = charset_str, }; @createops@ identifier nlstable.p; expression nlstable.charset_str; @@ +static struct nls_charset nls_charset; static struct nls_table p = { + .charset = &nls_charset, }; + +static struct nls_charset nls_charset = { + .charset = charset_str, + .tables = &p, +}; @@ expression A; @@ ? return - register_nls(A); + register_nls(&nls_charset); @@ expression A; @@ - unregister_nls(A); + unregister_nls(&nls_charset); @mvalias@ identifier p; expression alias_str; @@ static struct nls_table p = { - .alias = alias_str, }; @@ expression mvalias.alias_str; @@ static struct nls_charset nls_charset = { + .alias = alias_str, }; </smpl> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.co.uk> --- fs/nls/mac-celtic.c | 12 ++++++++--- fs/nls/mac-centeuro.c | 12 ++++++++--- fs/nls/mac-croatian.c | 12 ++++++++--- fs/nls/mac-cyrillic.c | 12 ++++++++--- fs/nls/mac-gaelic.c | 12 ++++++++--- fs/nls/mac-greek.c | 12 ++++++++--- fs/nls/mac-iceland.c | 12 ++++++++--- fs/nls/mac-inuit.c | 12 ++++++++--- fs/nls/mac-roman.c | 12 ++++++++--- fs/nls/mac-romanian.c | 12 ++++++++--- fs/nls/mac-turkish.c | 12 ++++++++--- fs/nls/nls_ascii.c | 12 ++++++++--- fs/nls/nls_core.c | 48 +++++++++++++++++++++++++++-------------- fs/nls/nls_cp1250.c | 12 ++++++++--- fs/nls/nls_cp1251.c | 12 ++++++++--- fs/nls/nls_cp1255.c | 14 ++++++++---- fs/nls/nls_cp437.c | 12 ++++++++--- fs/nls/nls_cp737.c | 12 ++++++++--- fs/nls/nls_cp775.c | 12 ++++++++--- fs/nls/nls_cp850.c | 12 ++++++++--- fs/nls/nls_cp852.c | 12 ++++++++--- fs/nls/nls_cp855.c | 12 ++++++++--- fs/nls/nls_cp857.c | 12 ++++++++--- fs/nls/nls_cp860.c | 12 ++++++++--- fs/nls/nls_cp861.c | 12 ++++++++--- fs/nls/nls_cp862.c | 12 ++++++++--- fs/nls/nls_cp863.c | 12 ++++++++--- fs/nls/nls_cp864.c | 12 ++++++++--- fs/nls/nls_cp865.c | 12 ++++++++--- fs/nls/nls_cp866.c | 12 ++++++++--- fs/nls/nls_cp869.c | 12 ++++++++--- fs/nls/nls_cp874.c | 14 ++++++++---- fs/nls/nls_cp932.c | 14 ++++++++---- fs/nls/nls_cp936.c | 14 ++++++++---- fs/nls/nls_cp949.c | 14 ++++++++---- fs/nls/nls_cp950.c | 14 ++++++++---- fs/nls/nls_default.c | 9 ++++++-- fs/nls/nls_euc-jp.c | 12 ++++++++--- fs/nls/nls_iso8859-1.c | 12 ++++++++--- fs/nls/nls_iso8859-13.c | 12 ++++++++--- fs/nls/nls_iso8859-14.c | 12 ++++++++--- fs/nls/nls_iso8859-15.c | 12 ++++++++--- fs/nls/nls_iso8859-2.c | 12 ++++++++--- fs/nls/nls_iso8859-3.c | 12 ++++++++--- fs/nls/nls_iso8859-4.c | 12 ++++++++--- fs/nls/nls_iso8859-5.c | 12 ++++++++--- fs/nls/nls_iso8859-6.c | 12 ++++++++--- fs/nls/nls_iso8859-7.c | 12 ++++++++--- fs/nls/nls_iso8859-9.c | 12 ++++++++--- fs/nls/nls_koi8-r.c | 12 ++++++++--- fs/nls/nls_koi8-ru.c | 12 ++++++++--- fs/nls/nls_koi8-u.c | 12 ++++++++--- fs/nls/nls_utf8.c | 12 ++++++++--- include/linux/nls.h | 18 ++++++++++------ 54 files changed, 516 insertions(+), 183 deletions(-)