aboutsummaryrefslogtreecommitdiff
path: root/fs/sdfat
diff options
context:
space:
mode:
authorPaul Keith <javelinanddart@gmail.com>2018-03-02 05:10:27 +0100
committerMoyster <oysterized@gmail.com>2018-12-02 01:34:25 +0100
commit8894b63d8bb372ccb9bbda9c6d8e69c6d4183149 (patch)
tree5d5580f9dd90117ceb60708d89b0bbf376af488b /fs/sdfat
parent796e4cc1081eea0d3ca72d91b48a7e27a4cfb07d (diff)
fs: sdfat: Add config option to register sdFAT for VFAT
Change-Id: I72ba7a14b56175535884390e8601960b5d8ed1cf Signed-off-by: Paul Keith <javelinanddart@gmail.com>
Diffstat (limited to 'fs/sdfat')
-rw-r--r--fs/sdfat/Kconfig7
-rw-r--r--fs/sdfat/sdfat.c45
2 files changed, 52 insertions, 0 deletions
diff --git a/fs/sdfat/Kconfig b/fs/sdfat/Kconfig
index 90265a198..bcaa7a1a3 100644
--- a/fs/sdfat/Kconfig
+++ b/fs/sdfat/Kconfig
@@ -22,6 +22,13 @@ config SDFAT_USE_FOR_EXFAT
help
If you want to register sdFAT as available for exFAT, say Y.
+config SDFAT_USE_FOR_VFAT
+ bool "Register sdFAT as VFAT"
+ default y
+ depends on SDFAT_FS && !VFAT_FS
+ help
+ If you want to register sdFAT as available for VFAT, say Y.
+
config SDFAT_DELAYED_META_DIRTY
bool "Enable delayed metadata dirty"
default y
diff --git a/fs/sdfat/sdfat.c b/fs/sdfat/sdfat.c
index 0829f4d83..9534725e5 100644
--- a/fs/sdfat/sdfat.c
+++ b/fs/sdfat/sdfat.c
@@ -4459,6 +4459,12 @@ enum {
Opt_discard,
Opt_fs,
Opt_adj_req,
+#ifdef CONFIG_SDFAT_USE_FOR_VFAT
+ Opt_shortname_lower,
+ Opt_shortname_win95,
+ Opt_shortname_winnt,
+ Opt_shortname_mixed,
+#endif /* CONFIG_SDFAT_USE_FOR_VFAT */
};
static const match_table_t sdfat_tokens = {
@@ -4487,6 +4493,12 @@ static const match_table_t sdfat_tokens = {
{Opt_discard, "discard"},
{Opt_fs, "fs=%s"},
{Opt_adj_req, "adj_req"},
+#ifdef CONFIG_SDFAT_USE_FOR_VFAT
+ {Opt_shortname_lower, "shortname=lower"},
+ {Opt_shortname_win95, "shortname=win95"},
+ {Opt_shortname_winnt, "shortname=winnt"},
+ {Opt_shortname_mixed, "shortname=mixed"},
+#endif /* CONFIG_SDFAT_USE_FOR_VFAT */
{Opt_err, NULL}
};
@@ -4653,6 +4665,14 @@ static int parse_options(struct super_block *sb, char *options, int silent,
IMSG("adjust request config is not enabled. ignore\n");
#endif
break;
+#ifdef CONFIG_SDFAT_USE_FOR_VFAT
+ case Opt_shortname_lower:
+ case Opt_shortname_win95:
+ case Opt_shortname_mixed:
+ pr_warn("[SDFAT] DRAGONS AHEAD! sdFAT only understands \"shortname=winnt\"!\n");
+ case Opt_shortname_winnt:
+ break;
+#endif /* CONFIG_SDFAT_USE_FOR_VFAT */
default:
if (!silent) {
sdfat_msg(sb, KERN_ERR,
@@ -4992,6 +5012,20 @@ static struct file_system_type exfat_fs_type = {
};
#endif /* CONFIG_SDFAT_USE_FOR_EXFAT */
+#ifdef CONFIG_SDFAT_USE_FOR_VFAT
+static struct file_system_type vfat_fs_type = {
+ .owner = THIS_MODULE,
+ .name = "vfat",
+ .mount = sdfat_fs_mount,
+#ifdef CONFIG_SDFAT_DBG_IOCTL
+ .kill_sb = sdfat_debug_kill_sb,
+#else
+ .kill_sb = kill_block_super,
+#endif /* CONFIG_SDFAT_DBG_IOCTL */
+ .fs_flags = FS_REQUIRES_DEV,
+};
+#endif /* CONFIG_SDFAT_USE_FOR_VFAT */
+
static int __init init_sdfat_fs(void)
{
int err;
@@ -5038,6 +5072,14 @@ static int __init init_sdfat_fs(void)
}
#endif /* CONFIG_SDFAT_USE_FOR_EXFAT */
+#ifdef CONFIG_SDFAT_USE_FOR_VFAT
+ err = register_filesystem(&vfat_fs_type);
+ if (err) {
+ pr_err("[SDFAT] failed to register for vfat filesystem\n");
+ goto error;
+ }
+#endif /* CONFIG_SDFAT_USE_FOR_VFAT */
+
return 0;
error:
sdfat_statistics_uninit();
@@ -5070,6 +5112,9 @@ static void __exit exit_sdfat_fs(void)
#ifdef CONFIG_SDFAT_USE_FOR_EXFAT
unregister_filesystem(&exfat_fs_type);
#endif /* CONFIG_SDFAT_USE_FOR_EXFAT */
+#ifdef CONFIG_SDFAT_USE_FOR_VFAT
+ unregister_filesystem(&vfat_fs_type);
+#endif /* CONFIG_SDFAT_USE_FOR_VFAT */
fsapi_shutdown();
}