From f4d852fcd6fbc380fccd37766ebd854d824c6755 Mon Sep 17 00:00:00 2001 From: Paul Keith Date: Fri, 2 Mar 2018 05:10:27 +0100 Subject: [PATCH] fs: sdfat: Add config option to register sdFAT for VFAT Change-Id: I72ba7a14b56175535884390e8601960b5d8ed1cf Signed-off-by: Paul Keith --- fs/sdfat/Kconfig | 7 +++++++ fs/sdfat/sdfat.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/fs/sdfat/Kconfig b/fs/sdfat/Kconfig index 3fe86e72c40b..1b67632c7d39 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 9d50d0ce72de..c1a2c2ec1b67 100644 --- a/fs/sdfat/sdfat.c +++ b/fs/sdfat/sdfat.c @@ -4532,6 +4532,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 = { @@ -4560,6 +4566,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} }; @@ -4726,6 +4738,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, @@ -5065,6 +5085,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; @@ -5111,6 +5145,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(); @@ -5143,6 +5185,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(); } -- 2.20.1