From eb5f3af3cf4fef975c092f9e1f3bb5ed8c48ab2b Mon Sep 17 00:00:00 2001 From: Rmys Date: Wed, 5 Aug 2020 18:27:05 +0300 Subject: [PATCH] kernel-5.7.13 --- .../files/0001-proc_ops-struct.patch | 36 + .../files/0002-kernel-5.7.patch | 11 + kernel/drivers/module-bbswitch/pspec.xml | 14 +- kernel/drivers/module-broadcom-wl/pspec.xml | 11 +- .../drivers/module-virtualbox-guest/pspec.xml | 13 +- kernel/drivers/module-virtualbox/pspec.xml | 13 +- kernel/drivers/ndiswrapper/pspec.xml | 13 +- .../files/patches/linux/patch-5.7.13.xz | Bin 0 -> 585008 bytes .../fs-MAINTAINERS-add-exfat-filesystem.patch | 39 - .../fs-exfat-add-Kconfig-and-Makefile.patch | 96 - .../fs-exfat-add-bitmap-operations.patch | 309 - .../fs-exfat-add-directory-operations.patch | 1267 --- .../mageia/fs-exfat-add-exfat-cache.patch | 354 - .../fs-exfat-add-fat-entry-operations.patch | 492 - .../mageia/fs-exfat-add-file-operations.patch | 390 - ...ory-and-on-disk-structures-and-heade.patch | 740 -- .../fs-exfat-add-inode-operations.patch | 2156 ---- .../mageia/fs-exfat-add-misc-operations.patch | 193 - .../mageia/fs-exfat-add-module_alias_fs.patch | 30 - .../mageia/fs-exfat-add-nls-operations.patch | 860 -- .../fs-exfat-add-super-block-operations.patch | 758 -- .../mageia/fs-exfat-fix-discard-support.patch | 32 - .../mageia/fs-exfat-remove-from-staging.patch | 9152 ----------------- ...pdate-file-system-parameter-handling.patch | 84 - kernel/tools/cpupowertools/pspec.xml | 27 +- 25 files changed, 106 insertions(+), 16984 deletions(-) create mode 100644 kernel/drivers/module-bbswitch/files/0001-proc_ops-struct.patch create mode 100644 kernel/drivers/module-bbswitch/files/0002-kernel-5.7.patch create mode 100644 kernel/tools/cpupowertools/files/patches/linux/patch-5.7.13.xz delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-bitmap-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-directory-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-exfat-cache.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-fat-entry-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-file-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-inode-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-misc-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-module_alias_fs.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-nls-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-super-block-operations.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-fix-discard-support.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-remove-from-staging.patch delete mode 100644 kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-update-file-system-parameter-handling.patch diff --git a/kernel/drivers/module-bbswitch/files/0001-proc_ops-struct.patch b/kernel/drivers/module-bbswitch/files/0001-proc_ops-struct.patch new file mode 100644 index 00000000..c2b823ba --- /dev/null +++ b/kernel/drivers/module-bbswitch/files/0001-proc_ops-struct.patch @@ -0,0 +1,36 @@ +diff --unified --recursive --text bbswitch-0.8.orig/bbswitch.c bbswitch-0.8.new/bbswitch.c +--- bbswitch-0.8.orig/bbswitch.c 2013-12-04 21:22:06.000000000 -0200 ++++ bbswitch-0.8.new/bbswitch.c 2020-04-01 12:02:35.518754892 -0300 +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + + #define BBSWITCH_VERSION "0.8" + +@@ -375,13 +376,23 @@ + return 0; + } + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0) ++static struct proc_ops bbswitch_fops = { ++ .proc_open = bbswitch_proc_open, ++ .proc_read = seq_read, ++ .proc_write = bbswitch_proc_write, ++ .proc_lseek = seq_lseek, ++ .proc_release= single_release ++}; ++#else + static struct file_operations bbswitch_fops = { + .open = bbswitch_proc_open, + .read = seq_read, + .write = bbswitch_proc_write, + .llseek = seq_lseek, + .release= single_release +-}; ++ }; ++#endif + + static struct notifier_block nb = { + .notifier_call = &bbswitch_pm_handler diff --git a/kernel/drivers/module-bbswitch/files/0002-kernel-5.7.patch b/kernel/drivers/module-bbswitch/files/0002-kernel-5.7.patch new file mode 100644 index 00000000..ef542817 --- /dev/null +++ b/kernel/drivers/module-bbswitch/files/0002-kernel-5.7.patch @@ -0,0 +1,11 @@ +diff -u -r bbswitch-0.8/bbswitch.c bbswitch-0.8-5.7/bbswitch.c +--- bbswitch-0.8/bbswitch.c 2020-06-02 00:34:20.370571802 +0000 ++++ bbswitch-0.8-5.7/bbswitch.c 2020-06-02 00:35:18.161403639 +0000 +@@ -29,6 +29,7 @@ + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + + #include ++#include + #include + #include + #include diff --git a/kernel/drivers/module-bbswitch/pspec.xml b/kernel/drivers/module-bbswitch/pspec.xml index dab83d03..db9fd283 100644 --- a/kernel/drivers/module-bbswitch/pspec.xml +++ b/kernel/drivers/module-bbswitch/pspec.xml @@ -13,17 +13,18 @@ Kernel module allowing to switch dedicated graphics card on Optimus laptops kernel module allowing to switch dedicated graphics card on Optimus laptops - kernel-module-headers + kernel-module-headers https://github.com/Bumblebee-Project/bbswitch/archive/v0.8.tar.gz - kernel56.patch + 0001-proc_ops-struct.patch + 0002-kernel-5.7.patch module-bbswitch - kernel + kernel bbswitch-common @@ -61,6 +62,13 @@ + + 2020-08-05 + 0.8 + Rebuild + İdris Kalp + idriskalp@gmail.com + 2020-06-17 0.8 diff --git a/kernel/drivers/module-broadcom-wl/pspec.xml b/kernel/drivers/module-broadcom-wl/pspec.xml index e7e68dda..1becb421 100755 --- a/kernel/drivers/module-broadcom-wl/pspec.xml +++ b/kernel/drivers/module-broadcom-wl/pspec.xml @@ -15,7 +15,7 @@ https://docs.broadcom.com/docs-and-downloads/docs/linux_sta/hybrid-v35-nodebug-pcoem-6_30_223_271.tar.gz https://docs.broadcom.com/docs-and-downloads/docs/linux_sta/hybrid-v35_64-nodebug-pcoem-6_30_223_271.tar.gz - kernel-module-headers + kernel-module-headers patch/license.patch @@ -33,7 +33,7 @@ module-broadcom-wl - kernel + kernel module-broadcom-wl-userspace @@ -62,6 +62,13 @@ + + 2020-08-05 + 6.30.223.271 + Rebuild. + İdris Kalp + idriskalpp@gmail.com + 2020-06-17 6.30.223.271 diff --git a/kernel/drivers/module-virtualbox-guest/pspec.xml b/kernel/drivers/module-virtualbox-guest/pspec.xml index 67a53e7f..a5181b14 100644 --- a/kernel/drivers/module-virtualbox-guest/pspec.xml +++ b/kernel/drivers/module-virtualbox-guest/pspec.xml @@ -12,9 +12,9 @@ driver Kernel modules for VirtualBox guest machines This package provides the kernel modules needed for mouse integration and shared folder support between VirtualBox host and guest systems. - https://sourceforge.net/projects/pisilinux/files/source/module-virtualbox-guest-6.1.10.tar.xz + https://sourceforge.net/projects/pisilinux/files/source/module-virtualbox-guest-6.1.12.tar.xz - kernel-module-headers + kernel-module-headers @@ -24,7 +24,7 @@ module-virtualbox-guest - kernel + kernel baselayout module-virtualbox-guest-userspace @@ -55,6 +55,13 @@ + + 2020-08-02 + 6.1.12 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2020-06-17 6.1.10 diff --git a/kernel/drivers/module-virtualbox/pspec.xml b/kernel/drivers/module-virtualbox/pspec.xml index 3d21a97f..788f483b 100644 --- a/kernel/drivers/module-virtualbox/pspec.xml +++ b/kernel/drivers/module-virtualbox/pspec.xml @@ -12,9 +12,9 @@ driver Kernel modules for VirtualBox This package provides the kernel support for VirtualBox. - https://sourceforge.net/projects/pisilinux/files/source/module-virtualbox-6.1.10.tar.xz + https://sourceforge.net/projects/pisilinux/files/source/module-virtualbox-6.1.12.tar.xz - kernel-module-headers + kernel-module-headers @@ -45,7 +45,7 @@ module-ndiswrapper - kernel + kernel ndiswrapper-common @@ -77,7 +77,14 @@ - + + 2020-08-05 + 1.63 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + + 2020-06-17 1.63 Version bump. diff --git a/kernel/tools/cpupowertools/files/patches/linux/patch-5.7.13.xz b/kernel/tools/cpupowertools/files/patches/linux/patch-5.7.13.xz new file mode 100644 index 0000000000000000000000000000000000000000..001389b1f3124fc9a3b1367d6f0c6c9c6046829c GIT binary patch literal 585008 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

ZW-UM-5;-S#ZCL_d|8rKVtch&i#U0I3lE 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

QJQKA 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%0D&K#c6puhxs>mbG!}XHtTo8#vCErWS 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

(kdw!VT2;LhPO`Qg9+L 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 literal 0 HcmV?d00001 diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch deleted file mode 100644 index 750af057..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 88ab55f16aae90e2e974eb67cc2380edb92b0661 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:43 +0900 -Subject: [PATCH 12/14] MAINTAINERS: add exfat filesystem -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Add myself and Sungjong Seo as exfat maintainer. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - MAINTAINERS | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/MAINTAINERS b/MAINTAINERS -index 38fe2f3f7b6f..27d912bc5ae2 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -6240,6 +6240,13 @@ F: include/trace/events/mdio.h - F: include/uapi/linux/mdio.h - F: include/uapi/linux/mii.h - -+EXFAT FILE SYSTEM -+M: Namjae Jeon -+M: Sungjong Seo -+L: linux-fsdevel@vger.kernel.org -+S: Maintained -+F: fs/exfat/ -+ - EXT2 FILE SYSTEM - M: Jan Kara - L: linux-ext4@vger.kernel.org --- -2.25.1 diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch deleted file mode 100644 index 674116ff..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch +++ /dev/null @@ -1,96 +0,0 @@ -From b9d1e2e6265f5dc25e9f5dbfbde3e53d8a4958ac Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:42 +0900 -Subject: [PATCH 11/14] exfat: add Kconfig and Makefile -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the Kconfig and Makefile for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/Kconfig | 3 ++- - fs/Makefile | 1 + - fs/exfat/Kconfig | 21 +++++++++++++++++++++ - fs/exfat/Makefile | 8 ++++++++ - 4 files changed, 32 insertions(+), 1 deletion(-) - create mode 100644 fs/exfat/Kconfig - create mode 100644 fs/exfat/Makefile - -diff --git a/fs/Kconfig b/fs/Kconfig -index 708ba336e689..f08fbbfafd9a 100644 ---- a/fs/Kconfig -+++ b/fs/Kconfig -@@ -140,9 +140,10 @@ endmenu - endif # BLOCK - - if BLOCK --menu "DOS/FAT/NT Filesystems" -+menu "DOS/FAT/EXFAT/NT Filesystems" - - source "fs/fat/Kconfig" -+source "fs/exfat/Kconfig" - source "fs/ntfs/Kconfig" - - endmenu -diff --git a/fs/Makefile b/fs/Makefile -index 505e51166973..2ce5112b02c8 100644 ---- a/fs/Makefile -+++ b/fs/Makefile -@@ -83,6 +83,7 @@ obj-$(CONFIG_HUGETLBFS) += hugetlbfs/ - obj-$(CONFIG_CODA_FS) += coda/ - obj-$(CONFIG_MINIX_FS) += minix/ - obj-$(CONFIG_FAT_FS) += fat/ -+obj-$(CONFIG_EXFAT_FS) += exfat/ - obj-$(CONFIG_BFS_FS) += bfs/ - obj-$(CONFIG_ISO9660_FS) += isofs/ - obj-$(CONFIG_HFSPLUS_FS) += hfsplus/ # Before hfs to find wrapped HFS+ -diff --git a/fs/exfat/Kconfig b/fs/exfat/Kconfig -new file mode 100644 -index 000000000000..2d3636dc5b8c ---- /dev/null -+++ b/fs/exfat/Kconfig -@@ -0,0 +1,21 @@ -+# SPDX-License-Identifier: GPL-2.0-or-later -+ -+config EXFAT_FS -+ tristate "exFAT filesystem support" -+ select NLS -+ help -+ This allows you to mount devices formatted with the exFAT file system. -+ exFAT is typically used on SD-Cards or USB sticks. -+ -+ To compile this as a module, choose M here: the module will be called -+ exfat. -+ -+config EXFAT_DEFAULT_IOCHARSET -+ string "Default iocharset for exFAT" -+ default "utf8" -+ depends on EXFAT_FS -+ help -+ Set this to the default input/output character set to use for -+ converting between the encoding is used for user visible filename and -+ UTF-16 character that exfat filesystem use, and can be overridden with -+ the "iocharset" mount option for exFAT filesystems. -diff --git a/fs/exfat/Makefile b/fs/exfat/Makefile -new file mode 100644 -index 000000000000..ed51926a4971 ---- /dev/null -+++ b/fs/exfat/Makefile -@@ -0,0 +1,8 @@ -+# SPDX-License-Identifier: GPL-2.0-or-later -+# -+# Makefile for the linux exFAT filesystem support. -+# -+obj-$(CONFIG_EXFAT_FS) += exfat.o -+ -+exfat-y := inode.o namei.o dir.o super.o fatent.o cache.o nls.o misc.o \ -+ file.o balloc.o --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-bitmap-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-bitmap-operations.patch deleted file mode 100644 index 5505b308..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-bitmap-operations.patch +++ /dev/null @@ -1,309 +0,0 @@ -From 1e49a94cf707204b66a3fb242f2814712c941f52 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:38 +0900 -Subject: [PATCH 07/14] exfat: add bitmap operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of bitmap operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/balloc.c | 280 ++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 280 insertions(+) - create mode 100644 fs/exfat/balloc.c - -diff --git a/fs/exfat/balloc.c b/fs/exfat/balloc.c -new file mode 100644 -index 000000000000..6a04cc02565a ---- /dev/null -+++ b/fs/exfat/balloc.c -@@ -0,0 +1,280 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+static const unsigned char free_bit[] = { -+ 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,/* 0 ~ 19*/ -+ 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3,/* 20 ~ 39*/ -+ 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/* 40 ~ 59*/ -+ 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,/* 60 ~ 79*/ -+ 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2,/* 80 ~ 99*/ -+ 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3,/*100 ~ 119*/ -+ 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/*120 ~ 139*/ -+ 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,/*140 ~ 159*/ -+ 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2,/*160 ~ 179*/ -+ 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3,/*180 ~ 199*/ -+ 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,/*200 ~ 219*/ -+ 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,/*220 ~ 239*/ -+ 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /*240 ~ 254*/ -+}; -+ -+static const unsigned char used_bit[] = { -+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3,/* 0 ~ 19*/ -+ 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4,/* 20 ~ 39*/ -+ 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,/* 40 ~ 59*/ -+ 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,/* 60 ~ 79*/ -+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4,/* 80 ~ 99*/ -+ 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,/*100 ~ 119*/ -+ 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,/*120 ~ 139*/ -+ 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,/*140 ~ 159*/ -+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5,/*160 ~ 179*/ -+ 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5,/*180 ~ 199*/ -+ 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6,/*200 ~ 219*/ -+ 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,/*220 ~ 239*/ -+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 /*240 ~ 255*/ -+}; -+ -+/* -+ * Allocation Bitmap Management Functions -+ */ -+static int exfat_allocate_bitmap(struct super_block *sb, -+ struct exfat_dentry *ep) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ long long map_size; -+ unsigned int i, need_map_size; -+ sector_t sector; -+ -+ sbi->map_clu = le32_to_cpu(ep->dentry.bitmap.start_clu); -+ map_size = le64_to_cpu(ep->dentry.bitmap.size); -+ need_map_size = ((EXFAT_DATA_CLUSTER_COUNT(sbi) - 1) / BITS_PER_BYTE) -+ + 1; -+ if (need_map_size != map_size) { -+ exfat_msg(sb, KERN_ERR, -+ "bogus allocation bitmap size(need : %u, cur : %lld)", -+ need_map_size, map_size); -+ /* -+ * Only allowed when bogus allocation -+ * bitmap size is large -+ */ -+ if (need_map_size > map_size) -+ return -EIO; -+ } -+ sbi->map_sectors = ((need_map_size - 1) >> -+ (sb->s_blocksize_bits)) + 1; -+ sbi->vol_amap = kmalloc_array(sbi->map_sectors, -+ sizeof(struct buffer_head *), GFP_KERNEL); -+ if (!sbi->vol_amap) -+ return -ENOMEM; -+ -+ sector = exfat_cluster_to_sector(sbi, sbi->map_clu); -+ for (i = 0; i < sbi->map_sectors; i++) { -+ sbi->vol_amap[i] = sb_bread(sb, sector + i); -+ if (!sbi->vol_amap[i]) { -+ /* release all buffers and free vol_amap */ -+ int j = 0; -+ -+ while (j < i) -+ brelse(sbi->vol_amap[j++]); -+ -+ kfree(sbi->vol_amap); -+ sbi->vol_amap = NULL; -+ return -EIO; -+ } -+ } -+ -+ sbi->pbr_bh = NULL; -+ return 0; -+} -+ -+int exfat_load_bitmap(struct super_block *sb) -+{ -+ unsigned int i, type; -+ struct exfat_chain clu; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ exfat_chain_set(&clu, sbi->root_dir, 0, ALLOC_FAT_CHAIN); -+ while (clu.dir != EXFAT_EOF_CLUSTER) { -+ for (i = 0; i < sbi->dentries_per_clu; i++) { -+ struct exfat_dentry *ep; -+ struct buffer_head *bh; -+ -+ ep = exfat_get_dentry(sb, &clu, i, &bh, NULL); -+ if (!ep) -+ return -EIO; -+ -+ type = exfat_get_entry_type(ep); -+ if (type == TYPE_UNUSED) -+ break; -+ if (type != TYPE_BITMAP) -+ continue; -+ if (ep->dentry.bitmap.flags == 0x0) { -+ int err; -+ -+ err = exfat_allocate_bitmap(sb, ep); -+ brelse(bh); -+ return err; -+ } -+ brelse(bh); -+ } -+ -+ if (exfat_get_next_cluster(sb, &clu.dir)) -+ return -EIO; -+ } -+ -+ return -EINVAL; -+} -+ -+void exfat_free_bitmap(struct exfat_sb_info *sbi) -+{ -+ int i; -+ -+ brelse(sbi->pbr_bh); -+ -+ for (i = 0; i < sbi->map_sectors; i++) -+ __brelse(sbi->vol_amap[i]); -+ -+ kfree(sbi->vol_amap); -+} -+ -+/* -+ * If the value of "clu" is 0, it means cluster 2 which is the first cluster of -+ * the cluster heap. -+ */ -+int exfat_set_bitmap(struct inode *inode, unsigned int clu) -+{ -+ int i, b; -+ unsigned int ent_idx; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ WARN_ON(clu < EXFAT_FIRST_CLUSTER); -+ ent_idx = CLUSTER_TO_BITMAP_ENT(clu); -+ i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx); -+ b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent_idx); -+ -+ set_bit_le(b, sbi->vol_amap[i]->b_data); -+ exfat_update_bh(sb, sbi->vol_amap[i], IS_DIRSYNC(inode)); -+ return 0; -+} -+ -+/* -+ * If the value of "clu" is 0, it means cluster 2 which is the first cluster of -+ * the cluster heap. -+ */ -+void exfat_clear_bitmap(struct inode *inode, unsigned int clu) -+{ -+ int i, b; -+ unsigned int ent_idx; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_mount_options *opts = &sbi->options; -+ -+ WARN_ON(clu < EXFAT_FIRST_CLUSTER); -+ ent_idx = CLUSTER_TO_BITMAP_ENT(clu); -+ i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx); -+ b = BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent_idx); -+ -+ clear_bit_le(b, sbi->vol_amap[i]->b_data); -+ exfat_update_bh(sb, sbi->vol_amap[i], IS_DIRSYNC(inode)); -+ -+ if (opts->discard) { -+ int ret_discard; -+ -+ ret_discard = sb_issue_discard(sb, -+ exfat_cluster_to_sector(sbi, clu + -+ EXFAT_RESERVED_CLUSTERS), -+ (1 << sbi->sect_per_clus_bits), GFP_NOFS, 0); -+ -+ if (ret_discard == -EOPNOTSUPP) { -+ exfat_msg(sb, KERN_ERR, -+ "discard not supported by device, disabling"); -+ opts->discard = 0; -+ } -+ } -+} -+ -+/* -+ * If the value of "clu" is 0, it means cluster 2 which is the first cluster of -+ * the cluster heap. -+ */ -+unsigned int exfat_find_free_bitmap(struct super_block *sb, unsigned int clu) -+{ -+ unsigned int i, map_i, map_b, ent_idx; -+ unsigned int clu_base, clu_free; -+ unsigned char k, clu_mask; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ WARN_ON(clu < EXFAT_FIRST_CLUSTER); -+ ent_idx = CLUSTER_TO_BITMAP_ENT(clu); -+ clu_base = BITMAP_ENT_TO_CLUSTER(ent_idx & ~(BITS_PER_BYTE_MASK)); -+ clu_mask = IGNORED_BITS_REMAINED(clu, clu_base); -+ -+ map_i = BITMAP_OFFSET_SECTOR_INDEX(sb, ent_idx); -+ map_b = BITMAP_OFFSET_BYTE_IN_SECTOR(sb, ent_idx); -+ -+ for (i = EXFAT_FIRST_CLUSTER; i < sbi->num_clusters; -+ i += BITS_PER_BYTE) { -+ k = *(sbi->vol_amap[map_i]->b_data + map_b); -+ if (clu_mask > 0) { -+ k |= clu_mask; -+ clu_mask = 0; -+ } -+ if (k < 0xFF) { -+ clu_free = clu_base + free_bit[k]; -+ if (clu_free < sbi->num_clusters) -+ return clu_free; -+ } -+ clu_base += BITS_PER_BYTE; -+ -+ if (++map_b >= sb->s_blocksize || -+ clu_base >= sbi->num_clusters) { -+ if (++map_i >= sbi->map_sectors) { -+ clu_base = EXFAT_FIRST_CLUSTER; -+ map_i = 0; -+ } -+ map_b = 0; -+ } -+ } -+ -+ return EXFAT_EOF_CLUSTER; -+} -+ -+int exfat_count_used_clusters(struct super_block *sb, unsigned int *ret_count) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned int count = 0; -+ unsigned int i, map_i = 0, map_b = 0; -+ unsigned int total_clus = EXFAT_DATA_CLUSTER_COUNT(sbi); -+ unsigned int last_mask = total_clus & BITS_PER_BYTE_MASK; -+ unsigned char clu_bits; -+ const unsigned char last_bit_mask[] = {0, 0b00000001, 0b00000011, -+ 0b00000111, 0b00001111, 0b00011111, 0b00111111, 0b01111111}; -+ -+ total_clus &= ~last_mask; -+ for (i = 0; i < total_clus; i += BITS_PER_BYTE) { -+ clu_bits = *(sbi->vol_amap[map_i]->b_data + map_b); -+ count += used_bit[clu_bits]; -+ if (++map_b >= (unsigned int)sb->s_blocksize) { -+ map_i++; -+ map_b = 0; -+ } -+ } -+ -+ if (last_mask) { -+ clu_bits = *(sbi->vol_amap[map_i]->b_data + map_b); -+ clu_bits &= last_bit_mask[last_mask]; -+ count += used_bit[clu_bits]; -+ } -+ -+ *ret_count = count; -+ return 0; -+} --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-directory-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-directory-operations.patch deleted file mode 100644 index 857c1dbb..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-directory-operations.patch +++ /dev/null @@ -1,1267 +0,0 @@ -From ca06197382bde0a3bc20215595d1c9ce20c6e341 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:35 +0900 -Subject: [PATCH 04/14] exfat: add directory operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of directory operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/dir.c | 1238 ++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 1238 insertions(+) - create mode 100644 fs/exfat/dir.c - -diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c -new file mode 100644 -index 000000000000..4b91afb0f051 ---- /dev/null -+++ b/fs/exfat/dir.c -@@ -0,0 +1,1238 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+static int exfat_extract_uni_name(struct exfat_dentry *ep, -+ unsigned short *uniname) -+{ -+ int i, len = 0; -+ -+ for (i = 0; i < EXFAT_FILE_NAME_LEN; i++) { -+ *uniname = le16_to_cpu(ep->dentry.name.unicode_0_14[i]); -+ if (*uniname == 0x0) -+ return len; -+ uniname++; -+ len++; -+ } -+ -+ *uniname = 0x0; -+ return len; -+ -+} -+ -+static void exfat_get_uniname_from_ext_entry(struct super_block *sb, -+ struct exfat_chain *p_dir, int entry, unsigned short *uniname) -+{ -+ int i; -+ struct exfat_dentry *ep; -+ struct exfat_entry_set_cache *es; -+ -+ es = exfat_get_dentry_set(sb, p_dir, entry, ES_ALL_ENTRIES, &ep); -+ if (!es) -+ return; -+ -+ if (es->num_entries < 3) -+ goto free_es; -+ -+ ep += 2; -+ -+ /* -+ * First entry : file entry -+ * Second entry : stream-extension entry -+ * Third entry : first file-name entry -+ * So, the index of first file-name dentry should start from 2. -+ */ -+ for (i = 2; i < es->num_entries; i++, ep++) { -+ /* end of name entry */ -+ if (exfat_get_entry_type(ep) != TYPE_EXTEND) -+ goto free_es; -+ -+ exfat_extract_uni_name(ep, uniname); -+ uniname += EXFAT_FILE_NAME_LEN; -+ } -+ -+free_es: -+ kfree(es); -+} -+ -+/* read a directory entry from the opened directory */ -+static int exfat_readdir(struct inode *inode, struct exfat_dir_entry *dir_entry) -+{ -+ int i, dentries_per_clu, dentries_per_clu_bits = 0; -+ unsigned int type, clu_offset; -+ sector_t sector; -+ struct exfat_chain dir, clu; -+ struct exfat_uni_name uni_name; -+ struct exfat_dentry *ep; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ unsigned int dentry = ei->rwoffset & 0xFFFFFFFF; -+ struct buffer_head *bh; -+ -+ /* check if the given file ID is opened */ -+ if (ei->type != TYPE_DIR) -+ return -EPERM; -+ -+ if (ei->entry == -1) -+ exfat_chain_set(&dir, sbi->root_dir, 0, ALLOC_FAT_CHAIN); -+ else -+ exfat_chain_set(&dir, ei->start_clu, -+ EXFAT_B_TO_CLU(i_size_read(inode), sbi), ei->flags); -+ -+ dentries_per_clu = sbi->dentries_per_clu; -+ dentries_per_clu_bits = ilog2(dentries_per_clu); -+ -+ clu_offset = dentry >> dentries_per_clu_bits; -+ exfat_chain_dup(&clu, &dir); -+ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ clu.dir += clu_offset; -+ clu.size -= clu_offset; -+ } else { -+ /* hint_information */ -+ if (clu_offset > 0 && ei->hint_bmap.off != EXFAT_EOF_CLUSTER && -+ ei->hint_bmap.off > 0 && clu_offset >= ei->hint_bmap.off) { -+ clu_offset -= ei->hint_bmap.off; -+ clu.dir = ei->hint_bmap.clu; -+ } -+ -+ while (clu_offset > 0) { -+ if (exfat_get_next_cluster(sb, &(clu.dir))) -+ return -EIO; -+ -+ clu_offset--; -+ } -+ } -+ -+ while (clu.dir != EXFAT_EOF_CLUSTER) { -+ i = dentry & (dentries_per_clu - 1); -+ -+ for ( ; i < dentries_per_clu; i++, dentry++) { -+ ep = exfat_get_dentry(sb, &clu, i, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ type = exfat_get_entry_type(ep); -+ if (type == TYPE_UNUSED) { -+ brelse(bh); -+ break; -+ } -+ -+ if (type != TYPE_FILE && type != TYPE_DIR) { -+ brelse(bh); -+ continue; -+ } -+ -+ dir_entry->attr = le16_to_cpu(ep->dentry.file.attr); -+ exfat_get_entry_time(sbi, &dir_entry->crtime, -+ ep->dentry.file.create_tz, -+ ep->dentry.file.create_time, -+ ep->dentry.file.create_date, -+ ep->dentry.file.create_time_ms); -+ exfat_get_entry_time(sbi, &dir_entry->mtime, -+ ep->dentry.file.modify_tz, -+ ep->dentry.file.modify_time, -+ ep->dentry.file.modify_date, -+ ep->dentry.file.modify_time_ms); -+ exfat_get_entry_time(sbi, &dir_entry->atime, -+ ep->dentry.file.access_tz, -+ ep->dentry.file.access_time, -+ ep->dentry.file.access_date, -+ 0); -+ -+ *uni_name.name = 0x0; -+ exfat_get_uniname_from_ext_entry(sb, &dir, dentry, -+ uni_name.name); -+ exfat_utf16_to_nls(sb, &uni_name, -+ dir_entry->namebuf.lfn, -+ dir_entry->namebuf.lfnbuf_len); -+ brelse(bh); -+ -+ ep = exfat_get_dentry(sb, &clu, i + 1, &bh, NULL); -+ if (!ep) -+ return -EIO; -+ dir_entry->size = -+ le64_to_cpu(ep->dentry.stream.valid_size); -+ brelse(bh); -+ -+ ei->hint_bmap.off = dentry >> dentries_per_clu_bits; -+ ei->hint_bmap.clu = clu.dir; -+ -+ ei->rwoffset = ++dentry; -+ return 0; -+ } -+ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ if (--clu.size > 0) -+ clu.dir++; -+ else -+ clu.dir = EXFAT_EOF_CLUSTER; -+ } else { -+ if (exfat_get_next_cluster(sb, &(clu.dir))) -+ return -EIO; -+ } -+ } -+ -+ dir_entry->namebuf.lfn[0] = '\0'; -+ ei->rwoffset = dentry; -+ return 0; -+} -+ -+static void exfat_init_namebuf(struct exfat_dentry_namebuf *nb) -+{ -+ nb->lfn = NULL; -+ nb->lfnbuf_len = 0; -+} -+ -+static int exfat_alloc_namebuf(struct exfat_dentry_namebuf *nb) -+{ -+ nb->lfn = __getname(); -+ if (!nb->lfn) -+ return -ENOMEM; -+ nb->lfnbuf_len = MAX_VFSNAME_BUF_SIZE; -+ return 0; -+} -+ -+static void exfat_free_namebuf(struct exfat_dentry_namebuf *nb) -+{ -+ if (!nb->lfn) -+ return; -+ -+ __putname(nb->lfn); -+ exfat_init_namebuf(nb); -+} -+ -+/* skip iterating emit_dots when dir is empty */ -+#define ITER_POS_FILLED_DOTS (2) -+static int exfat_iterate(struct file *filp, struct dir_context *ctx) -+{ -+ struct inode *inode = filp->f_path.dentry->d_inode; -+ struct super_block *sb = inode->i_sb; -+ struct inode *tmp; -+ struct exfat_dir_entry de; -+ struct exfat_dentry_namebuf *nb = &(de.namebuf); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ unsigned long inum; -+ loff_t cpos, i_pos; -+ int err = 0, fake_offset = 0; -+ -+ exfat_init_namebuf(nb); -+ mutex_lock(&EXFAT_SB(sb)->s_lock); -+ -+ cpos = ctx->pos; -+ if (!dir_emit_dots(filp, ctx)) -+ goto unlock; -+ -+ if (ctx->pos == ITER_POS_FILLED_DOTS) { -+ cpos = 0; -+ fake_offset = 1; -+ } -+ -+ if (cpos & (DENTRY_SIZE - 1)) { -+ err = -ENOENT; -+ goto unlock; -+ } -+ -+ /* name buffer should be allocated before use */ -+ err = exfat_alloc_namebuf(nb); -+ if (err) -+ goto unlock; -+get_new: -+ ei->rwoffset = EXFAT_B_TO_DEN(cpos); -+ -+ if (cpos >= i_size_read(inode)) -+ goto end_of_dir; -+ -+ err = exfat_readdir(inode, &de); -+ if (err) { -+ /* -+ * At least we tried to read a sector. Move cpos to next sector -+ * position (should be aligned). -+ */ -+ if (err == -EIO) { -+ cpos += 1 << (sb->s_blocksize_bits); -+ cpos &= ~(sb->s_blocksize - 1); -+ } -+ -+ err = -EIO; -+ goto end_of_dir; -+ } -+ -+ cpos = EXFAT_DEN_TO_B(ei->rwoffset); -+ -+ if (!nb->lfn[0]) -+ goto end_of_dir; -+ -+ i_pos = ((loff_t)ei->start_clu << 32) | -+ ((ei->rwoffset - 1) & 0xffffffff); -+ tmp = exfat_iget(sb, i_pos); -+ if (tmp) { -+ inum = tmp->i_ino; -+ iput(tmp); -+ } else { -+ inum = iunique(sb, EXFAT_ROOT_INO); -+ } -+ -+ /* -+ * Before calling dir_emit(), sb_lock should be released. -+ * Because page fault can occur in dir_emit() when the size -+ * of buffer given from user is larger than one page size. -+ */ -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ if (!dir_emit(ctx, nb->lfn, strlen(nb->lfn), inum, -+ (de.attr & ATTR_SUBDIR) ? DT_DIR : DT_REG)) -+ goto out_unlocked; -+ mutex_lock(&EXFAT_SB(sb)->s_lock); -+ ctx->pos = cpos; -+ goto get_new; -+ -+end_of_dir: -+ if (!cpos && fake_offset) -+ cpos = ITER_POS_FILLED_DOTS; -+ ctx->pos = cpos; -+unlock: -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+out_unlocked: -+ /* -+ * To improve performance, free namebuf after unlock sb_lock. -+ * If namebuf is not allocated, this function do nothing -+ */ -+ exfat_free_namebuf(nb); -+ return err; -+} -+ -+const struct file_operations exfat_dir_operations = { -+ .llseek = generic_file_llseek, -+ .read = generic_read_dir, -+ .iterate = exfat_iterate, -+ .fsync = generic_file_fsync, -+}; -+ -+int exfat_alloc_new_dir(struct inode *inode, struct exfat_chain *clu) -+{ -+ int ret; -+ -+ exfat_chain_set(clu, EXFAT_EOF_CLUSTER, 0, ALLOC_NO_FAT_CHAIN); -+ -+ ret = exfat_alloc_cluster(inode, 1, clu); -+ if (ret) -+ return ret; -+ -+ return exfat_zeroed_cluster(inode, clu->dir); -+} -+ -+int exfat_calc_num_entries(struct exfat_uni_name *p_uniname) -+{ -+ int len; -+ -+ len = p_uniname->name_len; -+ if (len == 0) -+ return -EINVAL; -+ -+ /* 1 file entry + 1 stream entry + name entries */ -+ return ((len - 1) / EXFAT_FILE_NAME_LEN + 3); -+} -+ -+unsigned int exfat_get_entry_type(struct exfat_dentry *ep) -+{ -+ if (ep->type == EXFAT_UNUSED) -+ return TYPE_UNUSED; -+ if (IS_EXFAT_DELETED(ep->type)) -+ return TYPE_DELETED; -+ if (ep->type == EXFAT_INVAL) -+ return TYPE_INVALID; -+ if (IS_EXFAT_CRITICAL_PRI(ep->type)) { -+ if (ep->type == EXFAT_BITMAP) -+ return TYPE_BITMAP; -+ if (ep->type == EXFAT_UPCASE) -+ return TYPE_UPCASE; -+ if (ep->type == EXFAT_VOLUME) -+ return TYPE_VOLUME; -+ if (ep->type == EXFAT_FILE) { -+ if (le16_to_cpu(ep->dentry.file.attr) & ATTR_SUBDIR) -+ return TYPE_DIR; -+ return TYPE_FILE; -+ } -+ return TYPE_CRITICAL_PRI; -+ } -+ if (IS_EXFAT_BENIGN_PRI(ep->type)) { -+ if (ep->type == EXFAT_GUID) -+ return TYPE_GUID; -+ if (ep->type == EXFAT_PADDING) -+ return TYPE_PADDING; -+ if (ep->type == EXFAT_ACLTAB) -+ return TYPE_ACLTAB; -+ return TYPE_BENIGN_PRI; -+ } -+ if (IS_EXFAT_CRITICAL_SEC(ep->type)) { -+ if (ep->type == EXFAT_STREAM) -+ return TYPE_STREAM; -+ if (ep->type == EXFAT_NAME) -+ return TYPE_EXTEND; -+ if (ep->type == EXFAT_ACL) -+ return TYPE_ACL; -+ return TYPE_CRITICAL_SEC; -+ } -+ return TYPE_BENIGN_SEC; -+} -+ -+static void exfat_set_entry_type(struct exfat_dentry *ep, unsigned int type) -+{ -+ if (type == TYPE_UNUSED) { -+ ep->type = EXFAT_UNUSED; -+ } else if (type == TYPE_DELETED) { -+ ep->type &= EXFAT_DELETE; -+ } else if (type == TYPE_STREAM) { -+ ep->type = EXFAT_STREAM; -+ } else if (type == TYPE_EXTEND) { -+ ep->type = EXFAT_NAME; -+ } else if (type == TYPE_BITMAP) { -+ ep->type = EXFAT_BITMAP; -+ } else if (type == TYPE_UPCASE) { -+ ep->type = EXFAT_UPCASE; -+ } else if (type == TYPE_VOLUME) { -+ ep->type = EXFAT_VOLUME; -+ } else if (type == TYPE_DIR) { -+ ep->type = EXFAT_FILE; -+ ep->dentry.file.attr = cpu_to_le16(ATTR_SUBDIR); -+ } else if (type == TYPE_FILE) { -+ ep->type = EXFAT_FILE; -+ ep->dentry.file.attr = cpu_to_le16(ATTR_ARCHIVE); -+ } -+} -+ -+static void exfat_init_stream_entry(struct exfat_dentry *ep, -+ unsigned char flags, unsigned int start_clu, -+ unsigned long long size) -+{ -+ exfat_set_entry_type(ep, TYPE_STREAM); -+ ep->dentry.stream.flags = flags; -+ ep->dentry.stream.start_clu = cpu_to_le32(start_clu); -+ ep->dentry.stream.valid_size = cpu_to_le64(size); -+ ep->dentry.stream.size = cpu_to_le64(size); -+} -+ -+static void exfat_init_name_entry(struct exfat_dentry *ep, -+ unsigned short *uniname) -+{ -+ int i; -+ -+ exfat_set_entry_type(ep, TYPE_EXTEND); -+ ep->dentry.name.flags = 0x0; -+ -+ for (i = 0; i < EXFAT_FILE_NAME_LEN; i++) { -+ ep->dentry.name.unicode_0_14[i] = cpu_to_le16(*uniname); -+ if (*uniname == 0x0) -+ break; -+ uniname++; -+ } -+} -+ -+int exfat_init_dir_entry(struct inode *inode, struct exfat_chain *p_dir, -+ int entry, unsigned int type, unsigned int start_clu, -+ unsigned long long size) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct timespec64 ts = current_time(inode); -+ sector_t sector; -+ struct exfat_dentry *ep; -+ struct buffer_head *bh; -+ -+ /* -+ * We cannot use exfat_get_dentry_set here because file ep is not -+ * initialized yet. -+ */ -+ ep = exfat_get_dentry(sb, p_dir, entry, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ exfat_set_entry_type(ep, type); -+ exfat_set_entry_time(sbi, &ts, -+ &ep->dentry.file.create_tz, -+ &ep->dentry.file.create_time, -+ &ep->dentry.file.create_date, -+ &ep->dentry.file.create_time_ms); -+ exfat_set_entry_time(sbi, &ts, -+ &ep->dentry.file.modify_tz, -+ &ep->dentry.file.modify_time, -+ &ep->dentry.file.modify_date, -+ &ep->dentry.file.modify_time_ms); -+ exfat_set_entry_time(sbi, &ts, -+ &ep->dentry.file.access_tz, -+ &ep->dentry.file.access_time, -+ &ep->dentry.file.access_date, -+ NULL); -+ -+ exfat_update_bh(sb, bh, IS_DIRSYNC(inode)); -+ brelse(bh); -+ -+ ep = exfat_get_dentry(sb, p_dir, entry + 1, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ exfat_init_stream_entry(ep, -+ (type == TYPE_FILE) ? ALLOC_FAT_CHAIN : ALLOC_NO_FAT_CHAIN, -+ start_clu, size); -+ exfat_update_bh(sb, bh, IS_DIRSYNC(inode)); -+ brelse(bh); -+ -+ return 0; -+} -+ -+int exfat_update_dir_chksum(struct inode *inode, struct exfat_chain *p_dir, -+ int entry) -+{ -+ struct super_block *sb = inode->i_sb; -+ int ret = 0; -+ int i, num_entries; -+ sector_t sector; -+ unsigned short chksum; -+ struct exfat_dentry *ep, *fep; -+ struct buffer_head *fbh, *bh; -+ -+ fep = exfat_get_dentry(sb, p_dir, entry, &fbh, §or); -+ if (!fep) -+ return -EIO; -+ -+ num_entries = fep->dentry.file.num_ext + 1; -+ chksum = exfat_calc_chksum_2byte(fep, DENTRY_SIZE, 0, CS_DIR_ENTRY); -+ -+ for (i = 1; i < num_entries; i++) { -+ ep = exfat_get_dentry(sb, p_dir, entry + i, &bh, NULL); -+ if (!ep) { -+ ret = -EIO; -+ goto release_fbh; -+ } -+ chksum = exfat_calc_chksum_2byte(ep, DENTRY_SIZE, chksum, -+ CS_DEFAULT); -+ brelse(bh); -+ } -+ -+ fep->dentry.file.checksum = cpu_to_le16(chksum); -+ exfat_update_bh(sb, fbh, IS_DIRSYNC(inode)); -+release_fbh: -+ brelse(fbh); -+ return ret; -+} -+ -+int exfat_init_ext_entry(struct inode *inode, struct exfat_chain *p_dir, -+ int entry, int num_entries, struct exfat_uni_name *p_uniname) -+{ -+ struct super_block *sb = inode->i_sb; -+ int i; -+ sector_t sector; -+ unsigned short *uniname = p_uniname->name; -+ struct exfat_dentry *ep; -+ struct buffer_head *bh; -+ int sync = IS_DIRSYNC(inode); -+ -+ ep = exfat_get_dentry(sb, p_dir, entry, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ ep->dentry.file.num_ext = (unsigned char)(num_entries - 1); -+ exfat_update_bh(sb, bh, sync); -+ brelse(bh); -+ -+ ep = exfat_get_dentry(sb, p_dir, entry + 1, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ ep->dentry.stream.name_len = p_uniname->name_len; -+ ep->dentry.stream.name_hash = cpu_to_le16(p_uniname->name_hash); -+ exfat_update_bh(sb, bh, sync); -+ brelse(bh); -+ -+ for (i = EXFAT_FIRST_CLUSTER; i < num_entries; i++) { -+ ep = exfat_get_dentry(sb, p_dir, entry + i, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ exfat_init_name_entry(ep, uniname); -+ exfat_update_bh(sb, bh, sync); -+ brelse(bh); -+ uniname += EXFAT_FILE_NAME_LEN; -+ } -+ -+ exfat_update_dir_chksum(inode, p_dir, entry); -+ return 0; -+} -+ -+int exfat_remove_entries(struct inode *inode, struct exfat_chain *p_dir, -+ int entry, int order, int num_entries) -+{ -+ struct super_block *sb = inode->i_sb; -+ int i; -+ sector_t sector; -+ struct exfat_dentry *ep; -+ struct buffer_head *bh; -+ -+ for (i = order; i < num_entries; i++) { -+ ep = exfat_get_dentry(sb, p_dir, entry + i, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ exfat_set_entry_type(ep, TYPE_DELETED); -+ exfat_update_bh(sb, bh, IS_DIRSYNC(inode)); -+ brelse(bh); -+ } -+ -+ return 0; -+} -+ -+int exfat_update_dir_chksum_with_entry_set(struct super_block *sb, -+ struct exfat_entry_set_cache *es, int sync) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct buffer_head *bh; -+ sector_t sec = es->sector; -+ unsigned int off = es->offset; -+ int chksum_type = CS_DIR_ENTRY, i, num_entries = es->num_entries; -+ unsigned int buf_off = (off - es->offset); -+ unsigned int remaining_byte_in_sector, copy_entries, clu; -+ unsigned short chksum = 0; -+ -+ for (i = 0; i < num_entries; i++) { -+ chksum = exfat_calc_chksum_2byte(&es->entries[i], DENTRY_SIZE, -+ chksum, chksum_type); -+ chksum_type = CS_DEFAULT; -+ } -+ -+ es->entries[0].dentry.file.checksum = cpu_to_le16(chksum); -+ -+ while (num_entries) { -+ /* write per sector base */ -+ remaining_byte_in_sector = (1 << sb->s_blocksize_bits) - off; -+ copy_entries = min_t(int, -+ EXFAT_B_TO_DEN(remaining_byte_in_sector), -+ num_entries); -+ bh = sb_bread(sb, sec); -+ if (!bh) -+ goto err_out; -+ memcpy(bh->b_data + off, -+ (unsigned char *)&es->entries[0] + buf_off, -+ EXFAT_DEN_TO_B(copy_entries)); -+ exfat_update_bh(sb, bh, sync); -+ brelse(bh); -+ num_entries -= copy_entries; -+ -+ if (num_entries) { -+ /* get next sector */ -+ if (exfat_is_last_sector_in_cluster(sbi, sec)) { -+ clu = exfat_sector_to_cluster(sbi, sec); -+ if (es->alloc_flag == ALLOC_NO_FAT_CHAIN) -+ clu++; -+ else if (exfat_get_next_cluster(sb, &clu)) -+ goto err_out; -+ sec = exfat_cluster_to_sector(sbi, clu); -+ } else { -+ sec++; -+ } -+ off = 0; -+ buf_off += EXFAT_DEN_TO_B(copy_entries); -+ } -+ } -+ -+ return 0; -+err_out: -+ return -EIO; -+} -+ -+static int exfat_walk_fat_chain(struct super_block *sb, -+ struct exfat_chain *p_dir, unsigned int byte_offset, -+ unsigned int *clu) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned int clu_offset; -+ unsigned int cur_clu; -+ -+ clu_offset = EXFAT_B_TO_CLU(byte_offset, sbi); -+ cur_clu = p_dir->dir; -+ -+ if (p_dir->flags == ALLOC_NO_FAT_CHAIN) { -+ cur_clu += clu_offset; -+ } else { -+ while (clu_offset > 0) { -+ if (exfat_get_next_cluster(sb, &cur_clu)) -+ return -EIO; -+ if (cur_clu == EXFAT_EOF_CLUSTER) { -+ exfat_fs_error(sb, -+ "invalid dentry access beyond EOF (clu : %u, eidx : %d)", -+ p_dir->dir, -+ EXFAT_B_TO_DEN(byte_offset)); -+ return -EIO; -+ } -+ clu_offset--; -+ } -+ } -+ -+ *clu = cur_clu; -+ return 0; -+} -+ -+int exfat_find_location(struct super_block *sb, struct exfat_chain *p_dir, -+ int entry, sector_t *sector, int *offset) -+{ -+ int ret; -+ unsigned int off, clu = 0; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ off = EXFAT_DEN_TO_B(entry); -+ -+ ret = exfat_walk_fat_chain(sb, p_dir, off, &clu); -+ if (ret) -+ return ret; -+ -+ /* byte offset in cluster */ -+ off = EXFAT_CLU_OFFSET(off, sbi); -+ -+ /* byte offset in sector */ -+ *offset = EXFAT_BLK_OFFSET(off, sb); -+ -+ /* sector offset in cluster */ -+ *sector = EXFAT_B_TO_BLK(off, sb); -+ *sector += exfat_cluster_to_sector(sbi, clu); -+ return 0; -+} -+ -+#define EXFAT_MAX_RA_SIZE (128*1024) -+static int exfat_dir_readahead(struct super_block *sb, sector_t sec) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct buffer_head *bh; -+ unsigned int max_ra_count = EXFAT_MAX_RA_SIZE >> sb->s_blocksize_bits; -+ unsigned int page_ra_count = PAGE_SIZE >> sb->s_blocksize_bits; -+ unsigned int adj_ra_count = max(sbi->sect_per_clus, page_ra_count); -+ unsigned int ra_count = min(adj_ra_count, max_ra_count); -+ -+ /* Read-ahead is not required */ -+ if (sbi->sect_per_clus == 1) -+ return 0; -+ -+ if (sec < sbi->data_start_sector) { -+ exfat_msg(sb, KERN_ERR, -+ "requested sector is invalid(sect:%llu, root:%llu)", -+ (unsigned long long)sec, sbi->data_start_sector); -+ return -EIO; -+ } -+ -+ /* Not sector aligned with ra_count, resize ra_count to page size */ -+ if ((sec - sbi->data_start_sector) & (ra_count - 1)) -+ ra_count = page_ra_count; -+ -+ bh = sb_find_get_block(sb, sec); -+ if (!bh || !buffer_uptodate(bh)) { -+ unsigned int i; -+ -+ for (i = 0; i < ra_count; i++) -+ sb_breadahead(sb, (sector_t)(sec + i)); -+ } -+ brelse(bh); -+ return 0; -+} -+ -+struct exfat_dentry *exfat_get_dentry(struct super_block *sb, -+ struct exfat_chain *p_dir, int entry, struct buffer_head **bh, -+ sector_t *sector) -+{ -+ unsigned int dentries_per_page = EXFAT_B_TO_DEN(PAGE_SIZE); -+ int off; -+ sector_t sec; -+ -+ if (p_dir->dir == DIR_DELETED) { -+ exfat_msg(sb, KERN_ERR, "abnormal access to deleted dentry\n"); -+ return NULL; -+ } -+ -+ if (exfat_find_location(sb, p_dir, entry, &sec, &off)) -+ return NULL; -+ -+ if (p_dir->dir != EXFAT_FREE_CLUSTER && -+ !(entry & (dentries_per_page - 1))) -+ exfat_dir_readahead(sb, sec); -+ -+ *bh = sb_bread(sb, sec); -+ if (!*bh) -+ return NULL; -+ -+ if (sector) -+ *sector = sec; -+ return (struct exfat_dentry *)((*bh)->b_data + off); -+} -+ -+enum exfat_validate_dentry_mode { -+ ES_MODE_STARTED, -+ ES_MODE_GET_FILE_ENTRY, -+ ES_MODE_GET_STRM_ENTRY, -+ ES_MODE_GET_NAME_ENTRY, -+ ES_MODE_GET_CRITICAL_SEC_ENTRY, -+}; -+ -+static bool exfat_validate_entry(unsigned int type, -+ enum exfat_validate_dentry_mode *mode) -+{ -+ if (type == TYPE_UNUSED || type == TYPE_DELETED) -+ return false; -+ -+ switch (*mode) { -+ case ES_MODE_STARTED: -+ if (type != TYPE_FILE && type != TYPE_DIR) -+ return false; -+ *mode = ES_MODE_GET_FILE_ENTRY; -+ return true; -+ case ES_MODE_GET_FILE_ENTRY: -+ if (type != TYPE_STREAM) -+ return false; -+ *mode = ES_MODE_GET_STRM_ENTRY; -+ return true; -+ case ES_MODE_GET_STRM_ENTRY: -+ if (type != TYPE_EXTEND) -+ return false; -+ *mode = ES_MODE_GET_NAME_ENTRY; -+ return true; -+ case ES_MODE_GET_NAME_ENTRY: -+ if (type == TYPE_STREAM) -+ return false; -+ if (type != TYPE_EXTEND) { -+ if (!(type & TYPE_CRITICAL_SEC)) -+ return false; -+ *mode = ES_MODE_GET_CRITICAL_SEC_ENTRY; -+ } -+ return true; -+ case ES_MODE_GET_CRITICAL_SEC_ENTRY: -+ if (type == TYPE_EXTEND || type == TYPE_STREAM) -+ return false; -+ if ((type & TYPE_CRITICAL_SEC) != TYPE_CRITICAL_SEC) -+ return false; -+ return true; -+ default: -+ WARN_ON_ONCE(1); -+ return false; -+ } -+} -+ -+/* -+ * Returns a set of dentries for a file or dir. -+ * -+ * Note that this is a copy (dump) of dentries so that user should -+ * call write_entry_set() to apply changes made in this entry set -+ * to the real device. -+ * -+ * in: -+ * sb+p_dir+entry: indicates a file/dir -+ * type: specifies how many dentries should be included. -+ * out: -+ * file_ep: will point the first dentry(= file dentry) on success -+ * return: -+ * pointer of entry set on success, -+ * NULL on failure. -+ */ -+struct exfat_entry_set_cache *exfat_get_dentry_set(struct super_block *sb, -+ struct exfat_chain *p_dir, int entry, unsigned int type, -+ struct exfat_dentry **file_ep) -+{ -+ int ret; -+ unsigned int off, byte_offset, clu = 0; -+ unsigned int entry_type; -+ sector_t sec; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_entry_set_cache *es; -+ struct exfat_dentry *ep, *pos; -+ unsigned char num_entries; -+ enum exfat_validate_dentry_mode mode = ES_MODE_STARTED; -+ struct buffer_head *bh; -+ -+ if (p_dir->dir == DIR_DELETED) { -+ exfat_msg(sb, KERN_ERR, "access to deleted dentry\n"); -+ return NULL; -+ } -+ -+ byte_offset = EXFAT_DEN_TO_B(entry); -+ ret = exfat_walk_fat_chain(sb, p_dir, byte_offset, &clu); -+ if (ret) -+ return NULL; -+ -+ /* byte offset in cluster */ -+ byte_offset = EXFAT_CLU_OFFSET(byte_offset, sbi); -+ -+ /* byte offset in sector */ -+ off = EXFAT_BLK_OFFSET(byte_offset, sb); -+ -+ /* sector offset in cluster */ -+ sec = EXFAT_B_TO_BLK(byte_offset, sb); -+ sec += exfat_cluster_to_sector(sbi, clu); -+ -+ bh = sb_bread(sb, sec); -+ if (!bh) -+ return NULL; -+ -+ ep = (struct exfat_dentry *)(bh->b_data + off); -+ entry_type = exfat_get_entry_type(ep); -+ -+ if (entry_type != TYPE_FILE && entry_type != TYPE_DIR) -+ goto release_bh; -+ -+ num_entries = type == ES_ALL_ENTRIES ? -+ ep->dentry.file.num_ext + 1 : type; -+ es = kmalloc(struct_size(es, entries, num_entries), GFP_KERNEL); -+ if (!es) -+ goto release_bh; -+ -+ es->num_entries = num_entries; -+ es->sector = sec; -+ es->offset = off; -+ es->alloc_flag = p_dir->flags; -+ -+ pos = &es->entries[0]; -+ -+ while (num_entries) { -+ if (!exfat_validate_entry(exfat_get_entry_type(ep), &mode)) -+ goto free_es; -+ -+ /* copy dentry */ -+ memcpy(pos, ep, sizeof(struct exfat_dentry)); -+ -+ if (--num_entries == 0) -+ break; -+ -+ if (((off + DENTRY_SIZE) & (sb->s_blocksize - 1)) < -+ (off & (sb->s_blocksize - 1))) { -+ /* get the next sector */ -+ if (exfat_is_last_sector_in_cluster(sbi, sec)) { -+ if (es->alloc_flag == ALLOC_NO_FAT_CHAIN) -+ clu++; -+ else if (exfat_get_next_cluster(sb, &clu)) -+ goto free_es; -+ sec = exfat_cluster_to_sector(sbi, clu); -+ } else { -+ sec++; -+ } -+ -+ brelse(bh); -+ bh = sb_bread(sb, sec); -+ if (!bh) -+ goto free_es; -+ off = 0; -+ ep = (struct exfat_dentry *)bh->b_data; -+ } else { -+ ep++; -+ off += DENTRY_SIZE; -+ } -+ pos++; -+ } -+ -+ if (file_ep) -+ *file_ep = &es->entries[0]; -+ brelse(bh); -+ return es; -+ -+free_es: -+ kfree(es); -+release_bh: -+ brelse(bh); -+ return NULL; -+} -+ -+enum { -+ DIRENT_STEP_FILE, -+ DIRENT_STEP_STRM, -+ DIRENT_STEP_NAME, -+ DIRENT_STEP_SECD, -+}; -+ -+/* -+ * return values: -+ * >= 0 : return dir entiry position with the name in dir -+ * -EEXIST : (root dir, ".") it is the root dir itself -+ * -ENOENT : entry with the name does not exist -+ * -EIO : I/O error -+ */ -+int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei, -+ struct exfat_chain *p_dir, struct exfat_uni_name *p_uniname, -+ int num_entries, unsigned int type) -+{ -+ int i, rewind = 0, dentry = 0, end_eidx = 0, num_ext = 0, len; -+ int order, step, name_len = 0; -+ int dentries_per_clu, num_empty = 0; -+ unsigned int entry_type; -+ unsigned short *uniname = NULL; -+ struct exfat_chain clu; -+ struct exfat_hint *hint_stat = &ei->hint_stat; -+ struct exfat_hint_femp candi_empty; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ dentries_per_clu = sbi->dentries_per_clu; -+ -+ exfat_chain_dup(&clu, p_dir); -+ -+ if (hint_stat->eidx) { -+ clu.dir = hint_stat->clu; -+ dentry = hint_stat->eidx; -+ end_eidx = dentry; -+ } -+ -+ candi_empty.eidx = EXFAT_HINT_NONE; -+rewind: -+ order = 0; -+ step = DIRENT_STEP_FILE; -+ while (clu.dir != EXFAT_EOF_CLUSTER) { -+ i = dentry & (dentries_per_clu - 1); -+ for (; i < dentries_per_clu; i++, dentry++) { -+ struct exfat_dentry *ep; -+ struct buffer_head *bh; -+ -+ if (rewind && dentry == end_eidx) -+ goto not_found; -+ -+ ep = exfat_get_dentry(sb, &clu, i, &bh, NULL); -+ if (!ep) -+ return -EIO; -+ -+ entry_type = exfat_get_entry_type(ep); -+ -+ if (entry_type == TYPE_UNUSED || -+ entry_type == TYPE_DELETED) { -+ step = DIRENT_STEP_FILE; -+ -+ num_empty++; -+ if (candi_empty.eidx == EXFAT_HINT_NONE && -+ num_empty == 1) { -+ exfat_chain_set(&candi_empty.cur, -+ clu.dir, clu.size, clu.flags); -+ } -+ -+ if (candi_empty.eidx == EXFAT_HINT_NONE && -+ num_empty >= num_entries) { -+ candi_empty.eidx = -+ dentry - (num_empty - 1); -+ WARN_ON(candi_empty.eidx < 0); -+ candi_empty.count = num_empty; -+ -+ if (ei->hint_femp.eidx == -+ EXFAT_HINT_NONE || -+ candi_empty.eidx <= -+ ei->hint_femp.eidx) { -+ memcpy(&ei->hint_femp, -+ &candi_empty, -+ sizeof(candi_empty)); -+ } -+ } -+ -+ brelse(bh); -+ if (entry_type == TYPE_UNUSED) -+ goto not_found; -+ continue; -+ } -+ -+ num_empty = 0; -+ candi_empty.eidx = EXFAT_HINT_NONE; -+ -+ if (entry_type == TYPE_FILE || entry_type == TYPE_DIR) { -+ step = DIRENT_STEP_FILE; -+ if (type == TYPE_ALL || type == entry_type) { -+ num_ext = ep->dentry.file.num_ext; -+ step = DIRENT_STEP_STRM; -+ } -+ brelse(bh); -+ continue; -+ } -+ -+ if (entry_type == TYPE_STREAM) { -+ unsigned short name_hash; -+ -+ if (step != DIRENT_STEP_STRM) { -+ step = DIRENT_STEP_FILE; -+ brelse(bh); -+ continue; -+ } -+ step = DIRENT_STEP_FILE; -+ name_hash = le16_to_cpu( -+ ep->dentry.stream.name_hash); -+ if (p_uniname->name_hash == name_hash && -+ p_uniname->name_len == -+ ep->dentry.stream.name_len) { -+ step = DIRENT_STEP_NAME; -+ order = 1; -+ name_len = 0; -+ } -+ brelse(bh); -+ continue; -+ } -+ -+ brelse(bh); -+ if (entry_type == TYPE_EXTEND) { -+ unsigned short entry_uniname[16], unichar; -+ -+ if (step != DIRENT_STEP_NAME) { -+ step = DIRENT_STEP_FILE; -+ continue; -+ } -+ -+ if (++order == 2) -+ uniname = p_uniname->name; -+ else -+ uniname += EXFAT_FILE_NAME_LEN; -+ -+ len = exfat_extract_uni_name(ep, entry_uniname); -+ name_len += len; -+ -+ unichar = *(uniname+len); -+ *(uniname+len) = 0x0; -+ -+ if (exfat_uniname_ncmp(sb, uniname, -+ entry_uniname, len)) { -+ step = DIRENT_STEP_FILE; -+ } else if (p_uniname->name_len == name_len) { -+ if (order == num_ext) -+ goto found; -+ step = DIRENT_STEP_SECD; -+ } -+ -+ *(uniname+len) = unichar; -+ continue; -+ } -+ -+ if (entry_type & -+ (TYPE_CRITICAL_SEC | TYPE_BENIGN_SEC)) { -+ if (step == DIRENT_STEP_SECD) { -+ if (++order == num_ext) -+ goto found; -+ continue; -+ } -+ } -+ step = DIRENT_STEP_FILE; -+ } -+ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ if (--clu.size > 0) -+ clu.dir++; -+ else -+ clu.dir = EXFAT_EOF_CLUSTER; -+ } else { -+ if (exfat_get_next_cluster(sb, &clu.dir)) -+ return -EIO; -+ } -+ } -+ -+not_found: -+ /* -+ * We started at not 0 index,so we should try to find target -+ * from 0 index to the index we started at. -+ */ -+ if (!rewind && end_eidx) { -+ rewind = 1; -+ dentry = 0; -+ clu.dir = p_dir->dir; -+ /* reset empty hint */ -+ num_empty = 0; -+ candi_empty.eidx = EXFAT_HINT_NONE; -+ goto rewind; -+ } -+ -+ /* initialized hint_stat */ -+ hint_stat->clu = p_dir->dir; -+ hint_stat->eidx = 0; -+ return -ENOENT; -+ -+found: -+ /* next dentry we'll find is out of this cluster */ -+ if (!((dentry + 1) & (dentries_per_clu - 1))) { -+ int ret = 0; -+ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ if (--clu.size > 0) -+ clu.dir++; -+ else -+ clu.dir = EXFAT_EOF_CLUSTER; -+ } else { -+ ret = exfat_get_next_cluster(sb, &clu.dir); -+ } -+ -+ if (ret || clu.dir != EXFAT_EOF_CLUSTER) { -+ /* just initialized hint_stat */ -+ hint_stat->clu = p_dir->dir; -+ hint_stat->eidx = 0; -+ return (dentry - num_ext); -+ } -+ } -+ -+ hint_stat->clu = clu.dir; -+ hint_stat->eidx = dentry + 1; -+ return dentry - num_ext; -+} -+ -+int exfat_count_ext_entries(struct super_block *sb, struct exfat_chain *p_dir, -+ int entry, struct exfat_dentry *ep) -+{ -+ int i, count = 0; -+ unsigned int type; -+ struct exfat_dentry *ext_ep; -+ struct buffer_head *bh; -+ -+ for (i = 0, entry++; i < ep->dentry.file.num_ext; i++, entry++) { -+ ext_ep = exfat_get_dentry(sb, p_dir, entry, &bh, NULL); -+ if (!ext_ep) -+ return -EIO; -+ -+ type = exfat_get_entry_type(ext_ep); -+ brelse(bh); -+ if (type == TYPE_EXTEND || type == TYPE_STREAM) -+ count++; -+ else -+ break; -+ } -+ return count; -+} -+ -+int exfat_count_dir_entries(struct super_block *sb, struct exfat_chain *p_dir) -+{ -+ int i, count = 0; -+ int dentries_per_clu; -+ unsigned int entry_type; -+ struct exfat_chain clu; -+ struct exfat_dentry *ep; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct buffer_head *bh; -+ -+ dentries_per_clu = sbi->dentries_per_clu; -+ -+ exfat_chain_dup(&clu, p_dir); -+ -+ while (clu.dir != EXFAT_EOF_CLUSTER) { -+ for (i = 0; i < dentries_per_clu; i++) { -+ ep = exfat_get_dentry(sb, &clu, i, &bh, NULL); -+ if (!ep) -+ return -EIO; -+ entry_type = exfat_get_entry_type(ep); -+ brelse(bh); -+ -+ if (entry_type == TYPE_UNUSED) -+ return count; -+ if (entry_type != TYPE_DIR) -+ continue; -+ count++; -+ } -+ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ if (--clu.size > 0) -+ clu.dir++; -+ else -+ clu.dir = EXFAT_EOF_CLUSTER; -+ } else { -+ if (exfat_get_next_cluster(sb, &(clu.dir))) -+ return -EIO; -+ } -+ } -+ -+ return count; -+} --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-exfat-cache.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-exfat-cache.patch deleted file mode 100644 index 179a1226..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-exfat-cache.patch +++ /dev/null @@ -1,354 +0,0 @@ -From c35b6810c4952ae5776607e2c1d6a587425d5834 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:39 +0900 -Subject: [PATCH 08/14] exfat: add exfat cache -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of exfat cache. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/cache.c | 325 +++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 325 insertions(+) - create mode 100644 fs/exfat/cache.c - -diff --git a/fs/exfat/cache.c b/fs/exfat/cache.c -new file mode 100644 -index 000000000000..03d0824fc368 ---- /dev/null -+++ b/fs/exfat/cache.c -@@ -0,0 +1,325 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * linux/fs/fat/cache.c -+ * -+ * Written 1992,1993 by Werner Almesberger -+ * -+ * Mar 1999. AV. Changed cache, so that it uses the starting cluster instead -+ * of inode number. -+ * May 1999. AV. Fixed the bogosity with FAT32 (read "FAT28"). Fscking lusers. -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+#define EXFAT_CACHE_VALID 0 -+#define EXFAT_MAX_CACHE 16 -+ -+struct exfat_cache { -+ struct list_head cache_list; -+ unsigned int nr_contig; /* number of contiguous clusters */ -+ unsigned int fcluster; /* cluster number in the file. */ -+ unsigned int dcluster; /* cluster number on disk. */ -+}; -+ -+struct exfat_cache_id { -+ unsigned int id; -+ unsigned int nr_contig; -+ unsigned int fcluster; -+ unsigned int dcluster; -+}; -+ -+static struct kmem_cache *exfat_cachep; -+ -+static void exfat_cache_init_once(void *c) -+{ -+ struct exfat_cache *cache = (struct exfat_cache *)c; -+ -+ INIT_LIST_HEAD(&cache->cache_list); -+} -+ -+int exfat_cache_init(void) -+{ -+ exfat_cachep = kmem_cache_create("exfat_cache", -+ sizeof(struct exfat_cache), -+ 0, SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD, -+ exfat_cache_init_once); -+ if (!exfat_cachep) -+ return -ENOMEM; -+ return 0; -+} -+ -+void exfat_cache_shutdown(void) -+{ -+ if (!exfat_cachep) -+ return; -+ kmem_cache_destroy(exfat_cachep); -+} -+ -+void exfat_cache_init_inode(struct inode *inode) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ -+ spin_lock_init(&ei->cache_lru_lock); -+ ei->nr_caches = 0; -+ ei->cache_valid_id = EXFAT_CACHE_VALID + 1; -+ INIT_LIST_HEAD(&ei->cache_lru); -+} -+ -+static inline struct exfat_cache *exfat_cache_alloc(void) -+{ -+ return kmem_cache_alloc(exfat_cachep, GFP_NOFS); -+} -+ -+static inline void exfat_cache_free(struct exfat_cache *cache) -+{ -+ WARN_ON(!list_empty(&cache->cache_list)); -+ kmem_cache_free(exfat_cachep, cache); -+} -+ -+static inline void exfat_cache_update_lru(struct inode *inode, -+ struct exfat_cache *cache) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ -+ if (ei->cache_lru.next != &cache->cache_list) -+ list_move(&cache->cache_list, &ei->cache_lru); -+} -+ -+static unsigned int exfat_cache_lookup(struct inode *inode, -+ unsigned int fclus, struct exfat_cache_id *cid, -+ unsigned int *cached_fclus, unsigned int *cached_dclus) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ static struct exfat_cache nohit = { .fcluster = 0, }; -+ struct exfat_cache *hit = &nohit, *p; -+ unsigned int offset = EXFAT_EOF_CLUSTER; -+ -+ spin_lock(&ei->cache_lru_lock); -+ list_for_each_entry(p, &ei->cache_lru, cache_list) { -+ /* Find the cache of "fclus" or nearest cache. */ -+ if (p->fcluster <= fclus && hit->fcluster < p->fcluster) { -+ hit = p; -+ if (hit->fcluster + hit->nr_contig < fclus) { -+ offset = hit->nr_contig; -+ } else { -+ offset = fclus - hit->fcluster; -+ break; -+ } -+ } -+ } -+ if (hit != &nohit) { -+ exfat_cache_update_lru(inode, hit); -+ -+ cid->id = ei->cache_valid_id; -+ cid->nr_contig = hit->nr_contig; -+ cid->fcluster = hit->fcluster; -+ cid->dcluster = hit->dcluster; -+ *cached_fclus = cid->fcluster + offset; -+ *cached_dclus = cid->dcluster + offset; -+ } -+ spin_unlock(&ei->cache_lru_lock); -+ -+ return offset; -+} -+ -+static struct exfat_cache *exfat_cache_merge(struct inode *inode, -+ struct exfat_cache_id *new) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct exfat_cache *p; -+ -+ list_for_each_entry(p, &ei->cache_lru, cache_list) { -+ /* Find the same part as "new" in cluster-chain. */ -+ if (p->fcluster == new->fcluster) { -+ if (new->nr_contig > p->nr_contig) -+ p->nr_contig = new->nr_contig; -+ return p; -+ } -+ } -+ return NULL; -+} -+ -+static void exfat_cache_add(struct inode *inode, -+ struct exfat_cache_id *new) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct exfat_cache *cache, *tmp; -+ -+ if (new->fcluster == EXFAT_EOF_CLUSTER) /* dummy cache */ -+ return; -+ -+ spin_lock(&ei->cache_lru_lock); -+ if (new->id != EXFAT_CACHE_VALID && -+ new->id != ei->cache_valid_id) -+ goto unlock; /* this cache was invalidated */ -+ -+ cache = exfat_cache_merge(inode, new); -+ if (cache == NULL) { -+ if (ei->nr_caches < EXFAT_MAX_CACHE) { -+ ei->nr_caches++; -+ spin_unlock(&ei->cache_lru_lock); -+ -+ tmp = exfat_cache_alloc(); -+ if (!tmp) { -+ spin_lock(&ei->cache_lru_lock); -+ ei->nr_caches--; -+ spin_unlock(&ei->cache_lru_lock); -+ return; -+ } -+ -+ spin_lock(&ei->cache_lru_lock); -+ cache = exfat_cache_merge(inode, new); -+ if (cache != NULL) { -+ ei->nr_caches--; -+ exfat_cache_free(tmp); -+ goto out_update_lru; -+ } -+ cache = tmp; -+ } else { -+ struct list_head *p = ei->cache_lru.prev; -+ -+ cache = list_entry(p, -+ struct exfat_cache, cache_list); -+ } -+ cache->fcluster = new->fcluster; -+ cache->dcluster = new->dcluster; -+ cache->nr_contig = new->nr_contig; -+ } -+out_update_lru: -+ exfat_cache_update_lru(inode, cache); -+unlock: -+ spin_unlock(&ei->cache_lru_lock); -+} -+ -+/* -+ * Cache invalidation occurs rarely, thus the LRU chain is not updated. It -+ * fixes itself after a while. -+ */ -+static void __exfat_cache_inval_inode(struct inode *inode) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct exfat_cache *cache; -+ -+ while (!list_empty(&ei->cache_lru)) { -+ cache = list_entry(ei->cache_lru.next, -+ struct exfat_cache, cache_list); -+ list_del_init(&cache->cache_list); -+ ei->nr_caches--; -+ exfat_cache_free(cache); -+ } -+ /* Update. The copy of caches before this id is discarded. */ -+ ei->cache_valid_id++; -+ if (ei->cache_valid_id == EXFAT_CACHE_VALID) -+ ei->cache_valid_id++; -+} -+ -+void exfat_cache_inval_inode(struct inode *inode) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ -+ spin_lock(&ei->cache_lru_lock); -+ __exfat_cache_inval_inode(inode); -+ spin_unlock(&ei->cache_lru_lock); -+} -+ -+static inline int cache_contiguous(struct exfat_cache_id *cid, -+ unsigned int dclus) -+{ -+ cid->nr_contig++; -+ return cid->dcluster + cid->nr_contig == dclus; -+} -+ -+static inline void cache_init(struct exfat_cache_id *cid, -+ unsigned int fclus, unsigned int dclus) -+{ -+ cid->id = EXFAT_CACHE_VALID; -+ cid->fcluster = fclus; -+ cid->dcluster = dclus; -+ cid->nr_contig = 0; -+} -+ -+int exfat_get_cluster(struct inode *inode, unsigned int cluster, -+ unsigned int *fclus, unsigned int *dclus, -+ unsigned int *last_dclus, int allow_eof) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned int limit = sbi->num_clusters; -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct exfat_cache_id cid; -+ unsigned int content; -+ -+ if (ei->start_clu == EXFAT_FREE_CLUSTER) { -+ exfat_fs_error(sb, -+ "invalid access to exfat cache (entry 0x%08x)", -+ ei->start_clu); -+ return -EIO; -+ } -+ -+ *fclus = 0; -+ *dclus = ei->start_clu; -+ *last_dclus = *dclus; -+ -+ /* -+ * Don`t use exfat_cache if zero offset or non-cluster allocation -+ */ -+ if (cluster == 0 || *dclus == EXFAT_EOF_CLUSTER) -+ return 0; -+ -+ cache_init(&cid, EXFAT_EOF_CLUSTER, EXFAT_EOF_CLUSTER); -+ -+ if (exfat_cache_lookup(inode, cluster, &cid, fclus, dclus) == -+ EXFAT_EOF_CLUSTER) { -+ /* -+ * dummy, always not contiguous -+ * This is reinitialized by cache_init(), later. -+ */ -+ WARN_ON(cid.id != EXFAT_CACHE_VALID || -+ cid.fcluster != EXFAT_EOF_CLUSTER || -+ cid.dcluster != EXFAT_EOF_CLUSTER || -+ cid.nr_contig != 0); -+ } -+ -+ if (*fclus == cluster) -+ return 0; -+ -+ while (*fclus < cluster) { -+ /* prevent the infinite loop of cluster chain */ -+ if (*fclus > limit) { -+ exfat_fs_error(sb, -+ "detected the cluster chain loop (i_pos %u)", -+ (*fclus)); -+ return -EIO; -+ } -+ -+ if (exfat_ent_get(sb, *dclus, &content)) -+ return -EIO; -+ -+ *last_dclus = *dclus; -+ *dclus = content; -+ (*fclus)++; -+ -+ if (content == EXFAT_EOF_CLUSTER) { -+ if (!allow_eof) { -+ exfat_fs_error(sb, -+ "invalid cluster chain (i_pos %u, last_clus 0x%08x is EOF)", -+ *fclus, (*last_dclus)); -+ return -EIO; -+ } -+ -+ break; -+ } -+ -+ if (!cache_contiguous(&cid, *dclus)) -+ cache_init(&cid, *fclus, *dclus); -+ } -+ -+ exfat_cache_add(inode, &cid); -+ return 0; -+} --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-fat-entry-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-fat-entry-operations.patch deleted file mode 100644 index 5d0f4f35..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-fat-entry-operations.patch +++ /dev/null @@ -1,492 +0,0 @@ -From 31023864e67a5f390cefbe92f72343027dc3aa33 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:37 +0900 -Subject: [PATCH 06/14] exfat: add fat entry operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of fat entry operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/fatent.c | 463 ++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 463 insertions(+) - create mode 100644 fs/exfat/fatent.c - -diff --git a/fs/exfat/fatent.c b/fs/exfat/fatent.c -new file mode 100644 -index 000000000000..a855b1769a96 ---- /dev/null -+++ b/fs/exfat/fatent.c -@@ -0,0 +1,463 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+static int exfat_mirror_bh(struct super_block *sb, sector_t sec, -+ struct buffer_head *bh) -+{ -+ struct buffer_head *c_bh; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ sector_t sec2; -+ int err = 0; -+ -+ if (sbi->FAT2_start_sector != sbi->FAT1_start_sector) { -+ sec2 = sec - sbi->FAT1_start_sector + sbi->FAT2_start_sector; -+ c_bh = sb_getblk(sb, sec2); -+ if (!c_bh) -+ return -ENOMEM; -+ memcpy(c_bh->b_data, bh->b_data, sb->s_blocksize); -+ set_buffer_uptodate(c_bh); -+ mark_buffer_dirty(c_bh); -+ if (sb->s_flags & SB_SYNCHRONOUS) -+ err = sync_dirty_buffer(c_bh); -+ brelse(c_bh); -+ } -+ -+ return err; -+} -+ -+static int __exfat_ent_get(struct super_block *sb, unsigned int loc, -+ unsigned int *content) -+{ -+ unsigned int off; -+ sector_t sec; -+ struct buffer_head *bh; -+ -+ sec = FAT_ENT_OFFSET_SECTOR(sb, loc); -+ off = FAT_ENT_OFFSET_BYTE_IN_SECTOR(sb, loc); -+ -+ bh = sb_bread(sb, sec); -+ if (!bh) -+ return -EIO; -+ -+ *content = le32_to_cpu(*(__le32 *)(&bh->b_data[off])); -+ -+ /* remap reserved clusters to simplify code */ -+ if (*content > EXFAT_BAD_CLUSTER) -+ *content = EXFAT_EOF_CLUSTER; -+ -+ brelse(bh); -+ return 0; -+} -+ -+int exfat_ent_set(struct super_block *sb, unsigned int loc, -+ unsigned int content) -+{ -+ unsigned int off; -+ sector_t sec; -+ __le32 *fat_entry; -+ struct buffer_head *bh; -+ -+ sec = FAT_ENT_OFFSET_SECTOR(sb, loc); -+ off = FAT_ENT_OFFSET_BYTE_IN_SECTOR(sb, loc); -+ -+ bh = sb_bread(sb, sec); -+ if (!bh) -+ return -EIO; -+ -+ fat_entry = (__le32 *)&(bh->b_data[off]); -+ *fat_entry = cpu_to_le32(content); -+ exfat_update_bh(sb, bh, sb->s_flags & SB_SYNCHRONOUS); -+ exfat_mirror_bh(sb, sec, bh); -+ brelse(bh); -+ return 0; -+} -+ -+static inline bool is_valid_cluster(struct exfat_sb_info *sbi, -+ unsigned int clus) -+{ -+ if (clus < EXFAT_FIRST_CLUSTER || sbi->num_clusters <= clus) -+ return false; -+ return true; -+} -+ -+int exfat_ent_get(struct super_block *sb, unsigned int loc, -+ unsigned int *content) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ int err; -+ -+ if (!is_valid_cluster(sbi, loc)) { -+ exfat_fs_error(sb, "invalid access to FAT (entry 0x%08x)", -+ loc); -+ return -EIO; -+ } -+ -+ err = __exfat_ent_get(sb, loc, content); -+ if (err) { -+ exfat_fs_error(sb, -+ "failed to access to FAT (entry 0x%08x, err:%d)", -+ loc, err); -+ return err; -+ } -+ -+ if (*content == EXFAT_FREE_CLUSTER) { -+ exfat_fs_error(sb, -+ "invalid access to FAT free cluster (entry 0x%08x)", -+ loc); -+ return -EIO; -+ } -+ -+ if (*content == EXFAT_BAD_CLUSTER) { -+ exfat_fs_error(sb, -+ "invalid access to FAT bad cluster (entry 0x%08x)", -+ loc); -+ return -EIO; -+ } -+ -+ if (*content != EXFAT_EOF_CLUSTER && !is_valid_cluster(sbi, *content)) { -+ exfat_fs_error(sb, -+ "invalid access to FAT (entry 0x%08x) bogus content (0x%08x)", -+ loc, *content); -+ return -EIO; -+ } -+ -+ return 0; -+} -+ -+int exfat_chain_cont_cluster(struct super_block *sb, unsigned int chain, -+ unsigned int len) -+{ -+ if (!len) -+ return 0; -+ -+ while (len > 1) { -+ if (exfat_ent_set(sb, chain, chain + 1)) -+ return -EIO; -+ chain++; -+ len--; -+ } -+ -+ if (exfat_ent_set(sb, chain, EXFAT_EOF_CLUSTER)) -+ return -EIO; -+ return 0; -+} -+ -+int exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain) -+{ -+ unsigned int num_clusters = 0; -+ unsigned int clu; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ /* invalid cluster number */ -+ if (p_chain->dir == EXFAT_FREE_CLUSTER || -+ p_chain->dir == EXFAT_EOF_CLUSTER || -+ p_chain->dir < EXFAT_FIRST_CLUSTER) -+ return 0; -+ -+ /* no cluster to truncate */ -+ if (p_chain->size == 0) -+ return 0; -+ -+ /* check cluster validation */ -+ if (p_chain->dir < 2 && p_chain->dir >= sbi->num_clusters) { -+ exfat_msg(sb, KERN_ERR, "invalid start cluster (%u)", -+ p_chain->dir); -+ return -EIO; -+ } -+ -+ set_bit(EXFAT_SB_DIRTY, &sbi->s_state); -+ clu = p_chain->dir; -+ -+ if (p_chain->flags == ALLOC_NO_FAT_CHAIN) { -+ do { -+ exfat_clear_bitmap(inode, clu); -+ clu++; -+ -+ num_clusters++; -+ } while (num_clusters < p_chain->size); -+ } else { -+ do { -+ exfat_clear_bitmap(inode, clu); -+ -+ if (exfat_get_next_cluster(sb, &clu)) -+ goto dec_used_clus; -+ -+ num_clusters++; -+ } while (clu != EXFAT_EOF_CLUSTER); -+ } -+ -+dec_used_clus: -+ sbi->used_clusters -= num_clusters; -+ return 0; -+} -+ -+int exfat_find_last_cluster(struct super_block *sb, struct exfat_chain *p_chain, -+ unsigned int *ret_clu) -+{ -+ unsigned int clu, next; -+ unsigned int count = 0; -+ -+ next = p_chain->dir; -+ if (p_chain->flags == ALLOC_NO_FAT_CHAIN) { -+ *ret_clu = next + p_chain->size - 1; -+ return 0; -+ } -+ -+ do { -+ count++; -+ clu = next; -+ if (exfat_ent_get(sb, clu, &next)) -+ return -EIO; -+ } while (next != EXFAT_EOF_CLUSTER); -+ -+ if (p_chain->size != count) { -+ exfat_fs_error(sb, -+ "bogus directory size (clus : ondisk(%d) != counted(%d))", -+ p_chain->size, count); -+ return -EIO; -+ } -+ -+ *ret_clu = clu; -+ return 0; -+} -+ -+static inline int exfat_sync_bhs(struct buffer_head **bhs, int nr_bhs) -+{ -+ int i, err = 0; -+ -+ for (i = 0; i < nr_bhs; i++) -+ write_dirty_buffer(bhs[i], 0); -+ -+ for (i = 0; i < nr_bhs; i++) { -+ wait_on_buffer(bhs[i]); -+ if (!err && !buffer_uptodate(bhs[i])) -+ err = -EIO; -+ } -+ return err; -+} -+ -+int exfat_zeroed_cluster(struct inode *dir, unsigned int clu) -+{ -+ struct super_block *sb = dir->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct buffer_head *bhs[MAX_BUF_PER_PAGE]; -+ int nr_bhs = MAX_BUF_PER_PAGE; -+ sector_t blknr, last_blknr; -+ int err, i, n; -+ -+ blknr = exfat_cluster_to_sector(sbi, clu); -+ last_blknr = blknr + sbi->sect_per_clus; -+ -+ if (last_blknr > sbi->num_sectors && sbi->num_sectors > 0) { -+ exfat_fs_error_ratelimit(sb, -+ "%s: out of range(sect:%llu len:%u)", -+ __func__, (unsigned long long)blknr, -+ sbi->sect_per_clus); -+ return -EIO; -+ } -+ -+ /* Zeroing the unused blocks on this cluster */ -+ n = 0; -+ while (blknr < last_blknr) { -+ bhs[n] = sb_getblk(sb, blknr); -+ if (!bhs[n]) { -+ err = -ENOMEM; -+ goto release_bhs; -+ } -+ memset(bhs[n]->b_data, 0, sb->s_blocksize); -+ exfat_update_bh(sb, bhs[n], 0); -+ -+ n++; -+ blknr++; -+ -+ if (n == nr_bhs) { -+ if (IS_DIRSYNC(dir)) { -+ err = exfat_sync_bhs(bhs, n); -+ if (err) -+ goto release_bhs; -+ } -+ -+ for (i = 0; i < n; i++) -+ brelse(bhs[i]); -+ n = 0; -+ } -+ } -+ -+ if (IS_DIRSYNC(dir)) { -+ err = exfat_sync_bhs(bhs, n); -+ if (err) -+ goto release_bhs; -+ } -+ -+ for (i = 0; i < n; i++) -+ brelse(bhs[i]); -+ -+ return 0; -+ -+release_bhs: -+ exfat_msg(sb, KERN_ERR, "failed zeroed sect %llu\n", -+ (unsigned long long)blknr); -+ for (i = 0; i < n; i++) -+ bforget(bhs[i]); -+ return err; -+} -+ -+int exfat_alloc_cluster(struct inode *inode, unsigned int num_alloc, -+ struct exfat_chain *p_chain) -+{ -+ int ret = -ENOSPC; -+ unsigned int num_clusters = 0, total_cnt; -+ unsigned int hint_clu, new_clu, last_clu = EXFAT_EOF_CLUSTER; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ total_cnt = EXFAT_DATA_CLUSTER_COUNT(sbi); -+ -+ if (unlikely(total_cnt < sbi->used_clusters)) { -+ exfat_fs_error_ratelimit(sb, -+ "%s: invalid used clusters(t:%u,u:%u)\n", -+ __func__, total_cnt, sbi->used_clusters); -+ return -EIO; -+ } -+ -+ if (num_alloc > total_cnt - sbi->used_clusters) -+ return -ENOSPC; -+ -+ hint_clu = p_chain->dir; -+ /* find new cluster */ -+ if (hint_clu == EXFAT_EOF_CLUSTER) { -+ if (sbi->clu_srch_ptr < EXFAT_FIRST_CLUSTER) { -+ exfat_msg(sb, KERN_ERR, -+ "sbi->clu_srch_ptr is invalid (%u)\n", -+ sbi->clu_srch_ptr); -+ sbi->clu_srch_ptr = EXFAT_FIRST_CLUSTER; -+ } -+ -+ hint_clu = exfat_find_free_bitmap(sb, sbi->clu_srch_ptr); -+ if (hint_clu == EXFAT_EOF_CLUSTER) -+ return -ENOSPC; -+ } -+ -+ /* check cluster validation */ -+ if (hint_clu < EXFAT_FIRST_CLUSTER && hint_clu >= sbi->num_clusters) { -+ exfat_msg(sb, KERN_ERR, "hint_cluster is invalid (%u)\n", -+ hint_clu); -+ hint_clu = EXFAT_FIRST_CLUSTER; -+ if (p_chain->flags == ALLOC_NO_FAT_CHAIN) { -+ if (exfat_chain_cont_cluster(sb, p_chain->dir, -+ num_clusters)) -+ return -EIO; -+ p_chain->flags = ALLOC_FAT_CHAIN; -+ } -+ } -+ -+ set_bit(EXFAT_SB_DIRTY, &sbi->s_state); -+ -+ p_chain->dir = EXFAT_EOF_CLUSTER; -+ -+ while ((new_clu = exfat_find_free_bitmap(sb, hint_clu)) != -+ EXFAT_EOF_CLUSTER) { -+ if (new_clu != hint_clu && -+ p_chain->flags == ALLOC_NO_FAT_CHAIN) { -+ if (exfat_chain_cont_cluster(sb, p_chain->dir, -+ num_clusters)) { -+ ret = -EIO; -+ goto free_cluster; -+ } -+ p_chain->flags = ALLOC_FAT_CHAIN; -+ } -+ -+ /* update allocation bitmap */ -+ if (exfat_set_bitmap(inode, new_clu)) { -+ ret = -EIO; -+ goto free_cluster; -+ } -+ -+ num_clusters++; -+ -+ /* update FAT table */ -+ if (p_chain->flags == ALLOC_FAT_CHAIN) { -+ if (exfat_ent_set(sb, new_clu, EXFAT_EOF_CLUSTER)) { -+ ret = -EIO; -+ goto free_cluster; -+ } -+ } -+ -+ if (p_chain->dir == EXFAT_EOF_CLUSTER) { -+ p_chain->dir = new_clu; -+ } else if (p_chain->flags == ALLOC_FAT_CHAIN) { -+ if (exfat_ent_set(sb, last_clu, new_clu)) { -+ ret = -EIO; -+ goto free_cluster; -+ } -+ } -+ last_clu = new_clu; -+ -+ if (--num_alloc == 0) { -+ sbi->clu_srch_ptr = hint_clu; -+ sbi->used_clusters += num_clusters; -+ -+ p_chain->size += num_clusters; -+ return 0; -+ } -+ -+ hint_clu = new_clu + 1; -+ if (hint_clu >= sbi->num_clusters) { -+ hint_clu = EXFAT_FIRST_CLUSTER; -+ -+ if (p_chain->flags == ALLOC_NO_FAT_CHAIN) { -+ if (exfat_chain_cont_cluster(sb, p_chain->dir, -+ num_clusters)) { -+ ret = -EIO; -+ goto free_cluster; -+ } -+ p_chain->flags = ALLOC_FAT_CHAIN; -+ } -+ } -+ } -+free_cluster: -+ if (num_clusters) -+ exfat_free_cluster(inode, p_chain); -+ return ret; -+} -+ -+int exfat_count_num_clusters(struct super_block *sb, -+ struct exfat_chain *p_chain, unsigned int *ret_count) -+{ -+ unsigned int i, count; -+ unsigned int clu; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ if (!p_chain->dir || p_chain->dir == EXFAT_EOF_CLUSTER) { -+ *ret_count = 0; -+ return 0; -+ } -+ -+ if (p_chain->flags == ALLOC_NO_FAT_CHAIN) { -+ *ret_count = p_chain->size; -+ return 0; -+ } -+ -+ clu = p_chain->dir; -+ count = 0; -+ for (i = EXFAT_FIRST_CLUSTER; i < sbi->num_clusters; i++) { -+ count++; -+ if (exfat_ent_get(sb, clu, &clu)) -+ return -EIO; -+ if (clu == EXFAT_EOF_CLUSTER) -+ break; -+ } -+ -+ *ret_count = count; -+ return 0; -+} --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-file-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-file-operations.patch deleted file mode 100644 index 49fd0d83..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-file-operations.patch +++ /dev/null @@ -1,390 +0,0 @@ -From 98d917047e8b7f4bb2ff61d81b0ccd94a00444f9 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:36 +0900 -Subject: [PATCH 05/14] exfat: add file operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of file operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Reviewed-by: Arnd Bergmann -Signed-off-by: Al Viro ---- - fs/exfat/file.c | 360 ++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 360 insertions(+) - create mode 100644 fs/exfat/file.c - -diff --git a/fs/exfat/file.c b/fs/exfat/file.c -new file mode 100644 -index 000000000000..483f683757aa ---- /dev/null -+++ b/fs/exfat/file.c -@@ -0,0 +1,360 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+static int exfat_cont_expand(struct inode *inode, loff_t size) -+{ -+ struct address_space *mapping = inode->i_mapping; -+ loff_t start = i_size_read(inode), count = size - i_size_read(inode); -+ int err, err2; -+ -+ err = generic_cont_expand_simple(inode, size); -+ if (err) -+ return err; -+ -+ inode->i_ctime = inode->i_mtime = current_time(inode); -+ mark_inode_dirty(inode); -+ -+ if (!IS_SYNC(inode)) -+ return 0; -+ -+ err = filemap_fdatawrite_range(mapping, start, start + count - 1); -+ err2 = sync_mapping_buffers(mapping); -+ if (!err) -+ err = err2; -+ err2 = write_inode_now(inode, 1); -+ if (!err) -+ err = err2; -+ if (err) -+ return err; -+ -+ return filemap_fdatawait_range(mapping, start, start + count - 1); -+} -+ -+static bool exfat_allow_set_time(struct exfat_sb_info *sbi, struct inode *inode) -+{ -+ mode_t allow_utime = sbi->options.allow_utime; -+ -+ if (!uid_eq(current_fsuid(), inode->i_uid)) { -+ if (in_group_p(inode->i_gid)) -+ allow_utime >>= 3; -+ if (allow_utime & MAY_WRITE) -+ return true; -+ } -+ -+ /* use a default check */ -+ return false; -+} -+ -+static int exfat_sanitize_mode(const struct exfat_sb_info *sbi, -+ struct inode *inode, umode_t *mode_ptr) -+{ -+ mode_t i_mode, mask, perm; -+ -+ i_mode = inode->i_mode; -+ -+ mask = (S_ISREG(i_mode) || S_ISLNK(i_mode)) ? -+ sbi->options.fs_fmask : sbi->options.fs_dmask; -+ perm = *mode_ptr & ~(S_IFMT | mask); -+ -+ /* Of the r and x bits, all (subject to umask) must be present.*/ -+ if ((perm & 0555) != (i_mode & 0555)) -+ return -EPERM; -+ -+ if (exfat_mode_can_hold_ro(inode)) { -+ /* -+ * Of the w bits, either all (subject to umask) or none must -+ * be present. -+ */ -+ if ((perm & 0222) && ((perm & 0222) != (0222 & ~mask))) -+ return -EPERM; -+ } else { -+ /* -+ * If exfat_mode_can_hold_ro(inode) is false, can't change -+ * w bits. -+ */ -+ if ((perm & 0222) != (0222 & ~mask)) -+ return -EPERM; -+ } -+ -+ *mode_ptr &= S_IFMT | perm; -+ -+ return 0; -+} -+ -+/* resize the file length */ -+int __exfat_truncate(struct inode *inode, loff_t new_size) -+{ -+ unsigned int num_clusters_new, num_clusters_phys; -+ unsigned int last_clu = EXFAT_FREE_CLUSTER; -+ struct exfat_chain clu; -+ struct exfat_dentry *ep, *ep2; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct exfat_entry_set_cache *es = NULL; -+ int evict = (ei->dir.dir == DIR_DELETED) ? 1 : 0; -+ -+ /* check if the given file ID is opened */ -+ if (ei->type != TYPE_FILE && ei->type != TYPE_DIR) -+ return -EPERM; -+ -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ -+ num_clusters_new = EXFAT_B_TO_CLU_ROUND_UP(i_size_read(inode), sbi); -+ num_clusters_phys = -+ EXFAT_B_TO_CLU_ROUND_UP(EXFAT_I(inode)->i_size_ondisk, sbi); -+ -+ exfat_chain_set(&clu, ei->start_clu, num_clusters_phys, ei->flags); -+ -+ if (new_size > 0) { -+ /* -+ * Truncate FAT chain num_clusters after the first cluster -+ * num_clusters = min(new, phys); -+ */ -+ unsigned int num_clusters = -+ min(num_clusters_new, num_clusters_phys); -+ -+ /* -+ * Follow FAT chain -+ * (defensive coding - works fine even with corrupted FAT table -+ */ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ clu.dir += num_clusters; -+ clu.size -= num_clusters; -+ } else { -+ while (num_clusters > 0) { -+ last_clu = clu.dir; -+ if (exfat_get_next_cluster(sb, &(clu.dir))) -+ return -EIO; -+ -+ num_clusters--; -+ clu.size--; -+ } -+ } -+ } else { -+ ei->flags = ALLOC_NO_FAT_CHAIN; -+ ei->start_clu = EXFAT_EOF_CLUSTER; -+ } -+ -+ i_size_write(inode, new_size); -+ -+ if (ei->type == TYPE_FILE) -+ ei->attr |= ATTR_ARCHIVE; -+ -+ /* update the directory entry */ -+ if (!evict) { -+ struct timespec64 ts; -+ -+ es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry, -+ ES_ALL_ENTRIES, &ep); -+ if (!es) -+ return -EIO; -+ ep2 = ep + 1; -+ -+ ts = current_time(inode); -+ exfat_set_entry_time(sbi, &ts, -+ &ep->dentry.file.modify_tz, -+ &ep->dentry.file.modify_time, -+ &ep->dentry.file.modify_date, -+ &ep->dentry.file.modify_time_ms); -+ ep->dentry.file.attr = cpu_to_le16(ei->attr); -+ -+ /* File size should be zero if there is no cluster allocated */ -+ if (ei->start_clu == EXFAT_EOF_CLUSTER) { -+ ep->dentry.stream.valid_size = 0; -+ ep->dentry.stream.size = 0; -+ } else { -+ ep->dentry.stream.valid_size = cpu_to_le64(new_size); -+ ep->dentry.stream.size = ep->dentry.stream.valid_size; -+ } -+ -+ if (new_size == 0) { -+ /* Any directory can not be truncated to zero */ -+ WARN_ON(ei->type != TYPE_FILE); -+ -+ ep2->dentry.stream.flags = ALLOC_FAT_CHAIN; -+ ep2->dentry.stream.start_clu = EXFAT_FREE_CLUSTER; -+ } -+ -+ if (exfat_update_dir_chksum_with_entry_set(sb, es, -+ inode_needs_sync(inode))) -+ return -EIO; -+ kfree(es); -+ } -+ -+ /* cut off from the FAT chain */ -+ if (ei->flags == ALLOC_FAT_CHAIN && last_clu != EXFAT_FREE_CLUSTER && -+ last_clu != EXFAT_EOF_CLUSTER) { -+ if (exfat_ent_set(sb, last_clu, EXFAT_EOF_CLUSTER)) -+ return -EIO; -+ } -+ -+ /* invalidate cache and free the clusters */ -+ /* clear exfat cache */ -+ exfat_cache_inval_inode(inode); -+ -+ /* hint information */ -+ ei->hint_bmap.off = EXFAT_EOF_CLUSTER; -+ ei->hint_bmap.clu = EXFAT_EOF_CLUSTER; -+ if (ei->rwoffset > new_size) -+ ei->rwoffset = new_size; -+ -+ /* hint_stat will be used if this is directory. */ -+ ei->hint_stat.eidx = 0; -+ ei->hint_stat.clu = ei->start_clu; -+ ei->hint_femp.eidx = EXFAT_HINT_NONE; -+ -+ /* free the clusters */ -+ if (exfat_free_cluster(inode, &clu)) -+ return -EIO; -+ -+ exfat_set_vol_flags(sb, VOL_CLEAN); -+ -+ return 0; -+} -+ -+void exfat_truncate(struct inode *inode, loff_t size) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned int blocksize = 1 << inode->i_blkbits; -+ loff_t aligned_size; -+ int err; -+ -+ mutex_lock(&sbi->s_lock); -+ if (EXFAT_I(inode)->start_clu == 0) { -+ /* -+ * Empty start_clu != ~0 (not allocated) -+ */ -+ exfat_fs_error(sb, "tried to truncate zeroed cluster."); -+ goto write_size; -+ } -+ -+ err = __exfat_truncate(inode, i_size_read(inode)); -+ if (err) -+ goto write_size; -+ -+ inode->i_ctime = inode->i_mtime = current_time(inode); -+ if (IS_DIRSYNC(inode)) -+ exfat_sync_inode(inode); -+ else -+ mark_inode_dirty(inode); -+ -+ inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) & -+ ~(sbi->cluster_size - 1)) >> inode->i_blkbits; -+write_size: -+ aligned_size = i_size_read(inode); -+ if (aligned_size & (blocksize - 1)) { -+ aligned_size |= (blocksize - 1); -+ aligned_size++; -+ } -+ -+ if (EXFAT_I(inode)->i_size_ondisk > i_size_read(inode)) -+ EXFAT_I(inode)->i_size_ondisk = aligned_size; -+ -+ if (EXFAT_I(inode)->i_size_aligned > i_size_read(inode)) -+ EXFAT_I(inode)->i_size_aligned = aligned_size; -+ mutex_unlock(&sbi->s_lock); -+} -+ -+int exfat_getattr(const struct path *path, struct kstat *stat, -+ unsigned int request_mask, unsigned int query_flags) -+{ -+ struct inode *inode = d_backing_inode(path->dentry); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ -+ generic_fillattr(inode, stat); -+ stat->result_mask |= STATX_BTIME; -+ stat->btime.tv_sec = ei->i_crtime.tv_sec; -+ stat->btime.tv_nsec = ei->i_crtime.tv_nsec; -+ stat->blksize = EXFAT_SB(inode->i_sb)->cluster_size; -+ return 0; -+} -+ -+int exfat_setattr(struct dentry *dentry, struct iattr *attr) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(dentry->d_sb); -+ struct inode *inode = dentry->d_inode; -+ unsigned int ia_valid; -+ int error; -+ -+ if ((attr->ia_valid & ATTR_SIZE) && -+ attr->ia_size > i_size_read(inode)) { -+ error = exfat_cont_expand(inode, attr->ia_size); -+ if (error || attr->ia_valid == ATTR_SIZE) -+ return error; -+ attr->ia_valid &= ~ATTR_SIZE; -+ } -+ -+ /* Check for setting the inode time. */ -+ ia_valid = attr->ia_valid; -+ if ((ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) && -+ exfat_allow_set_time(sbi, inode)) { -+ attr->ia_valid &= ~(ATTR_MTIME_SET | ATTR_ATIME_SET | -+ ATTR_TIMES_SET); -+ } -+ -+ error = setattr_prepare(dentry, attr); -+ attr->ia_valid = ia_valid; -+ if (error) -+ goto out; -+ -+ if (((attr->ia_valid & ATTR_UID) && -+ !uid_eq(attr->ia_uid, sbi->options.fs_uid)) || -+ ((attr->ia_valid & ATTR_GID) && -+ !gid_eq(attr->ia_gid, sbi->options.fs_gid)) || -+ ((attr->ia_valid & ATTR_MODE) && -+ (attr->ia_mode & ~(S_IFREG | S_IFLNK | S_IFDIR | 0777)))) { -+ error = -EPERM; -+ goto out; -+ } -+ -+ /* -+ * We don't return -EPERM here. Yes, strange, but this is too -+ * old behavior. -+ */ -+ if (attr->ia_valid & ATTR_MODE) { -+ if (exfat_sanitize_mode(sbi, inode, &attr->ia_mode) < 0) -+ attr->ia_valid &= ~ATTR_MODE; -+ } -+ -+ if (attr->ia_valid & ATTR_SIZE) { -+ error = exfat_block_truncate_page(inode, attr->ia_size); -+ if (error) -+ goto out; -+ -+ down_write(&EXFAT_I(inode)->truncate_lock); -+ truncate_setsize(inode, attr->ia_size); -+ exfat_truncate(inode, attr->ia_size); -+ up_write(&EXFAT_I(inode)->truncate_lock); -+ } -+ -+ setattr_copy(inode, attr); -+ mark_inode_dirty(inode); -+ -+out: -+ return error; -+} -+ -+const struct file_operations exfat_file_operations = { -+ .llseek = generic_file_llseek, -+ .read_iter = generic_file_read_iter, -+ .write_iter = generic_file_write_iter, -+ .mmap = generic_file_mmap, -+ .fsync = generic_file_fsync, -+ .splice_read = generic_file_splice_read, -+}; -+ -+const struct inode_operations exfat_file_inode_operations = { -+ .setattr = exfat_setattr, -+ .getattr = exfat_getattr, -+}; --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch deleted file mode 100644 index e347a9ee..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch +++ /dev/null @@ -1,740 +0,0 @@ -From 1acf1a564b6034b5af1e7fb23cb98cb3bb4f6003 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:32 +0900 -Subject: [PATCH 01/14] exfat: add in-memory and on-disk structures and headers -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds in-memory and on-disk structures and headers. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/exfat_fs.h | 519 +++++++++++++++++++++++++++++++++++++++++++ - fs/exfat/exfat_raw.h | 184 +++++++++++++++ - 2 files changed, 703 insertions(+) - create mode 100644 fs/exfat/exfat_fs.h - create mode 100644 fs/exfat/exfat_raw.h - -diff --git a/fs/exfat/exfat_fs.h b/fs/exfat/exfat_fs.h -new file mode 100644 -index 000000000000..67d4e46fb810 ---- /dev/null -+++ b/fs/exfat/exfat_fs.h -@@ -0,0 +1,519 @@ -+/* SPDX-License-Identifier: GPL-2.0-or-later */ -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#ifndef _EXFAT_FS_H -+#define _EXFAT_FS_H -+ -+#include -+#include -+#include -+ -+#define EXFAT_SUPER_MAGIC 0x2011BAB0UL -+#define EXFAT_ROOT_INO 1 -+ -+#define EXFAT_SB_DIRTY 0 -+ -+#define EXFAT_CLUSTERS_UNTRACKED (~0u) -+ -+/* -+ * exfat error flags -+ */ -+enum exfat_error_mode { -+ EXFAT_ERRORS_CONT, /* ignore error and continue */ -+ EXFAT_ERRORS_PANIC, /* panic on error */ -+ EXFAT_ERRORS_RO, /* remount r/o on error */ -+}; -+ -+/* -+ * exfat nls lossy flag -+ */ -+enum { -+ NLS_NAME_NO_LOSSY, /* no lossy */ -+ NLS_NAME_LOSSY, /* just detected incorrect filename(s) */ -+ NLS_NAME_OVERLEN, /* the length is over than its limit */ -+}; -+ -+#define EXFAT_HASH_BITS 8 -+#define EXFAT_HASH_SIZE (1UL << EXFAT_HASH_BITS) -+ -+/* -+ * Type Definitions -+ */ -+#define ES_2_ENTRIES 2 -+#define ES_ALL_ENTRIES 0 -+ -+#define DIR_DELETED 0xFFFF0321 -+ -+/* type values */ -+#define TYPE_UNUSED 0x0000 -+#define TYPE_DELETED 0x0001 -+#define TYPE_INVALID 0x0002 -+#define TYPE_CRITICAL_PRI 0x0100 -+#define TYPE_BITMAP 0x0101 -+#define TYPE_UPCASE 0x0102 -+#define TYPE_VOLUME 0x0103 -+#define TYPE_DIR 0x0104 -+#define TYPE_FILE 0x011F -+#define TYPE_CRITICAL_SEC 0x0200 -+#define TYPE_STREAM 0x0201 -+#define TYPE_EXTEND 0x0202 -+#define TYPE_ACL 0x0203 -+#define TYPE_BENIGN_PRI 0x0400 -+#define TYPE_GUID 0x0401 -+#define TYPE_PADDING 0x0402 -+#define TYPE_ACLTAB 0x0403 -+#define TYPE_BENIGN_SEC 0x0800 -+#define TYPE_ALL 0x0FFF -+ -+#define MAX_CHARSET_SIZE 6 /* max size of multi-byte character */ -+#define MAX_NAME_LENGTH 255 /* max len of file name excluding NULL */ -+#define MAX_VFSNAME_BUF_SIZE ((MAX_NAME_LENGTH + 1) * MAX_CHARSET_SIZE) -+ -+#define FAT_CACHE_SIZE 128 -+#define FAT_CACHE_HASH_SIZE 64 -+#define BUF_CACHE_SIZE 256 -+#define BUF_CACHE_HASH_SIZE 64 -+ -+#define EXFAT_HINT_NONE -1 -+#define EXFAT_MIN_SUBDIR 2 -+ -+/* -+ * helpers for cluster size to byte conversion. -+ */ -+#define EXFAT_CLU_TO_B(b, sbi) ((b) << (sbi)->cluster_size_bits) -+#define EXFAT_B_TO_CLU(b, sbi) ((b) >> (sbi)->cluster_size_bits) -+#define EXFAT_B_TO_CLU_ROUND_UP(b, sbi) \ -+ (((b - 1) >> (sbi)->cluster_size_bits) + 1) -+#define EXFAT_CLU_OFFSET(off, sbi) ((off) & ((sbi)->cluster_size - 1)) -+ -+/* -+ * helpers for block size to byte conversion. -+ */ -+#define EXFAT_BLK_TO_B(b, sb) ((b) << (sb)->s_blocksize_bits) -+#define EXFAT_B_TO_BLK(b, sb) ((b) >> (sb)->s_blocksize_bits) -+#define EXFAT_B_TO_BLK_ROUND_UP(b, sb) \ -+ (((b - 1) >> (sb)->s_blocksize_bits) + 1) -+#define EXFAT_BLK_OFFSET(off, sb) ((off) & ((sb)->s_blocksize - 1)) -+ -+/* -+ * helpers for block size to dentry size conversion. -+ */ -+#define EXFAT_B_TO_DEN_IDX(b, sbi) \ -+ ((b) << ((sbi)->cluster_size_bits - DENTRY_SIZE_BITS)) -+#define EXFAT_B_TO_DEN(b) ((b) >> DENTRY_SIZE_BITS) -+#define EXFAT_DEN_TO_B(b) ((b) << DENTRY_SIZE_BITS) -+ -+/* -+ * helpers for fat entry. -+ */ -+#define FAT_ENT_SIZE (4) -+#define FAT_ENT_SIZE_BITS (2) -+#define FAT_ENT_OFFSET_SECTOR(sb, loc) (EXFAT_SB(sb)->FAT1_start_sector + \ -+ (((u64)loc << FAT_ENT_SIZE_BITS) >> sb->s_blocksize_bits)) -+#define FAT_ENT_OFFSET_BYTE_IN_SECTOR(sb, loc) \ -+ ((loc << FAT_ENT_SIZE_BITS) & (sb->s_blocksize - 1)) -+ -+/* -+ * helpers for bitmap. -+ */ -+#define CLUSTER_TO_BITMAP_ENT(clu) ((clu) - EXFAT_RESERVED_CLUSTERS) -+#define BITMAP_ENT_TO_CLUSTER(ent) ((ent) + EXFAT_RESERVED_CLUSTERS) -+#define BITS_PER_SECTOR(sb) ((sb)->s_blocksize * BITS_PER_BYTE) -+#define BITS_PER_SECTOR_MASK(sb) (BITS_PER_SECTOR(sb) - 1) -+#define BITMAP_OFFSET_SECTOR_INDEX(sb, ent) \ -+ ((ent / BITS_PER_BYTE) >> (sb)->s_blocksize_bits) -+#define BITMAP_OFFSET_BIT_IN_SECTOR(sb, ent) (ent & BITS_PER_SECTOR_MASK(sb)) -+#define BITMAP_OFFSET_BYTE_IN_SECTOR(sb, ent) \ -+ ((ent / BITS_PER_BYTE) & ((sb)->s_blocksize - 1)) -+#define BITS_PER_BYTE_MASK 0x7 -+#define IGNORED_BITS_REMAINED(clu, clu_base) ((1 << ((clu) - (clu_base))) - 1) -+ -+struct exfat_dentry_namebuf { -+ char *lfn; -+ int lfnbuf_len; /* usally MAX_UNINAME_BUF_SIZE */ -+}; -+ -+/* unicode name structure */ -+struct exfat_uni_name { -+ /* +3 for null and for converting */ -+ unsigned short name[MAX_NAME_LENGTH + 3]; -+ unsigned short name_hash; -+ unsigned char name_len; -+}; -+ -+/* directory structure */ -+struct exfat_chain { -+ unsigned int dir; -+ unsigned int size; -+ unsigned char flags; -+}; -+ -+/* first empty entry hint information */ -+struct exfat_hint_femp { -+ /* entry index of a directory */ -+ int eidx; -+ /* count of continuous empty entry */ -+ int count; -+ /* the cluster that first empty slot exists in */ -+ struct exfat_chain cur; -+}; -+ -+/* hint structure */ -+struct exfat_hint { -+ unsigned int clu; -+ union { -+ unsigned int off; /* cluster offset */ -+ int eidx; /* entry index */ -+ }; -+}; -+ -+struct exfat_entry_set_cache { -+ /* sector number that contains file_entry */ -+ sector_t sector; -+ /* byte offset in the sector */ -+ unsigned int offset; -+ /* flag in stream entry. 01 for cluster chain, 03 for contig. */ -+ int alloc_flag; -+ unsigned int num_entries; -+ struct exfat_dentry entries[]; -+}; -+ -+struct exfat_dir_entry { -+ struct exfat_chain dir; -+ int entry; -+ unsigned int type; -+ unsigned int start_clu; -+ unsigned char flags; -+ unsigned short attr; -+ loff_t size; -+ unsigned int num_subdirs; -+ struct timespec64 atime; -+ struct timespec64 mtime; -+ struct timespec64 crtime; -+ struct exfat_dentry_namebuf namebuf; -+}; -+ -+/* -+ * exfat mount in-memory data -+ */ -+struct exfat_mount_options { -+ kuid_t fs_uid; -+ kgid_t fs_gid; -+ unsigned short fs_fmask; -+ unsigned short fs_dmask; -+ /* permission for setting the [am]time */ -+ unsigned short allow_utime; -+ /* charset for filename input/display */ -+ char *iocharset; -+ /* on error: continue, panic, remount-ro */ -+ enum exfat_error_mode errors; -+ unsigned utf8:1, /* Use of UTF-8 character set */ -+ discard:1; /* Issue discard requests on deletions */ -+ int time_offset; /* Offset of timestamps from UTC (in minutes) */ -+}; -+ -+/* -+ * EXFAT file system superblock in-memory data -+ */ -+struct exfat_sb_info { -+ unsigned long long num_sectors; /* num of sectors in volume */ -+ unsigned int num_clusters; /* num of clusters in volume */ -+ unsigned int cluster_size; /* cluster size in bytes */ -+ unsigned int cluster_size_bits; -+ unsigned int sect_per_clus; /* cluster size in sectors */ -+ unsigned int sect_per_clus_bits; -+ unsigned long long FAT1_start_sector; /* FAT1 start sector */ -+ unsigned long long FAT2_start_sector; /* FAT2 start sector */ -+ unsigned long long data_start_sector; /* data area start sector */ -+ unsigned int num_FAT_sectors; /* num of FAT sectors */ -+ unsigned int root_dir; /* root dir cluster */ -+ unsigned int dentries_per_clu; /* num of dentries per cluster */ -+ unsigned int vol_flag; /* volume dirty flag */ -+ struct buffer_head *pbr_bh; /* buffer_head of PBR sector */ -+ -+ unsigned int map_clu; /* allocation bitmap start cluster */ -+ unsigned int map_sectors; /* num of allocation bitmap sectors */ -+ struct buffer_head **vol_amap; /* allocation bitmap */ -+ -+ unsigned short *vol_utbl; /* upcase table */ -+ -+ unsigned int clu_srch_ptr; /* cluster search pointer */ -+ unsigned int used_clusters; /* number of used clusters */ -+ -+ unsigned long s_state; -+ struct mutex s_lock; /* superblock lock */ -+ struct exfat_mount_options options; -+ struct nls_table *nls_io; /* Charset used for input and display */ -+ struct ratelimit_state ratelimit; -+ -+ spinlock_t inode_hash_lock; -+ struct hlist_head inode_hashtable[EXFAT_HASH_SIZE]; -+ -+ struct rcu_head rcu; -+}; -+ -+/* -+ * EXFAT file system inode in-memory data -+ */ -+struct exfat_inode_info { -+ struct exfat_chain dir; -+ int entry; -+ unsigned int type; -+ unsigned short attr; -+ unsigned int start_clu; -+ unsigned char flags; -+ /* -+ * the copy of low 32bit of i_version to check -+ * the validation of hint_stat. -+ */ -+ unsigned int version; -+ /* file offset or dentry index for readdir */ -+ loff_t rwoffset; -+ -+ /* hint for cluster last accessed */ -+ struct exfat_hint hint_bmap; -+ /* hint for entry index we try to lookup next time */ -+ struct exfat_hint hint_stat; -+ /* hint for first empty entry */ -+ struct exfat_hint_femp hint_femp; -+ -+ spinlock_t cache_lru_lock; -+ struct list_head cache_lru; -+ int nr_caches; -+ /* for avoiding the race between alloc and free */ -+ unsigned int cache_valid_id; -+ -+ /* -+ * NOTE: i_size_ondisk is 64bits, so must hold ->inode_lock to access. -+ * physically allocated size. -+ */ -+ loff_t i_size_ondisk; -+ /* block-aligned i_size (used in cont_write_begin) */ -+ loff_t i_size_aligned; -+ /* on-disk position of directory entry or 0 */ -+ loff_t i_pos; -+ /* hash by i_location */ -+ struct hlist_node i_hash_fat; -+ /* protect bmap against truncate */ -+ struct rw_semaphore truncate_lock; -+ struct inode vfs_inode; -+ /* File creation time */ -+ struct timespec64 i_crtime; -+}; -+ -+static inline struct exfat_sb_info *EXFAT_SB(struct super_block *sb) -+{ -+ return sb->s_fs_info; -+} -+ -+static inline struct exfat_inode_info *EXFAT_I(struct inode *inode) -+{ -+ return container_of(inode, struct exfat_inode_info, vfs_inode); -+} -+ -+/* -+ * If ->i_mode can't hold 0222 (i.e. ATTR_RO), we use ->i_attrs to -+ * save ATTR_RO instead of ->i_mode. -+ * -+ * If it's directory and !sbi->options.rodir, ATTR_RO isn't read-only -+ * bit, it's just used as flag for app. -+ */ -+static inline int exfat_mode_can_hold_ro(struct inode *inode) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -+ -+ if (S_ISDIR(inode->i_mode)) -+ return 0; -+ -+ if ((~sbi->options.fs_fmask) & 0222) -+ return 1; -+ return 0; -+} -+ -+/* Convert attribute bits and a mask to the UNIX mode. */ -+static inline mode_t exfat_make_mode(struct exfat_sb_info *sbi, -+ unsigned short attr, mode_t mode) -+{ -+ if ((attr & ATTR_READONLY) && !(attr & ATTR_SUBDIR)) -+ mode &= ~0222; -+ -+ if (attr & ATTR_SUBDIR) -+ return (mode & ~sbi->options.fs_dmask) | S_IFDIR; -+ -+ return (mode & ~sbi->options.fs_fmask) | S_IFREG; -+} -+ -+/* Return the FAT attribute byte for this inode */ -+static inline unsigned short exfat_make_attr(struct inode *inode) -+{ -+ unsigned short attr = EXFAT_I(inode)->attr; -+ -+ if (S_ISDIR(inode->i_mode)) -+ attr |= ATTR_SUBDIR; -+ if (exfat_mode_can_hold_ro(inode) && !(inode->i_mode & 0222)) -+ attr |= ATTR_READONLY; -+ return attr; -+} -+ -+static inline void exfat_save_attr(struct inode *inode, unsigned short attr) -+{ -+ if (exfat_mode_can_hold_ro(inode)) -+ EXFAT_I(inode)->attr = attr & (ATTR_RWMASK | ATTR_READONLY); -+ else -+ EXFAT_I(inode)->attr = attr & ATTR_RWMASK; -+} -+ -+static inline bool exfat_is_last_sector_in_cluster(struct exfat_sb_info *sbi, -+ sector_t sec) -+{ -+ return ((sec - sbi->data_start_sector + 1) & -+ ((1 << sbi->sect_per_clus_bits) - 1)) == 0; -+} -+ -+static inline sector_t exfat_cluster_to_sector(struct exfat_sb_info *sbi, -+ unsigned int clus) -+{ -+ return ((clus - EXFAT_RESERVED_CLUSTERS) << sbi->sect_per_clus_bits) + -+ sbi->data_start_sector; -+} -+ -+static inline int exfat_sector_to_cluster(struct exfat_sb_info *sbi, -+ sector_t sec) -+{ -+ return ((sec - sbi->data_start_sector) >> sbi->sect_per_clus_bits) + -+ EXFAT_RESERVED_CLUSTERS; -+} -+ -+/* super.c */ -+int exfat_set_vol_flags(struct super_block *sb, unsigned short new_flag); -+ -+/* fatent.c */ -+#define exfat_get_next_cluster(sb, pclu) exfat_ent_get(sb, *(pclu), pclu) -+ -+int exfat_alloc_cluster(struct inode *inode, unsigned int num_alloc, -+ struct exfat_chain *p_chain); -+int exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain); -+int exfat_ent_get(struct super_block *sb, unsigned int loc, -+ unsigned int *content); -+int exfat_ent_set(struct super_block *sb, unsigned int loc, -+ unsigned int content); -+int exfat_count_ext_entries(struct super_block *sb, struct exfat_chain *p_dir, -+ int entry, struct exfat_dentry *p_entry); -+int exfat_chain_cont_cluster(struct super_block *sb, unsigned int chain, -+ unsigned int len); -+int exfat_zeroed_cluster(struct inode *dir, unsigned int clu); -+int exfat_find_last_cluster(struct super_block *sb, struct exfat_chain *p_chain, -+ unsigned int *ret_clu); -+int exfat_count_num_clusters(struct super_block *sb, -+ struct exfat_chain *p_chain, unsigned int *ret_count); -+ -+/* balloc.c */ -+int exfat_load_bitmap(struct super_block *sb); -+void exfat_free_bitmap(struct exfat_sb_info *sbi); -+int exfat_set_bitmap(struct inode *inode, unsigned int clu); -+void exfat_clear_bitmap(struct inode *inode, unsigned int clu); -+unsigned int exfat_find_free_bitmap(struct super_block *sb, unsigned int clu); -+int exfat_count_used_clusters(struct super_block *sb, unsigned int *ret_count); -+ -+/* file.c */ -+extern const struct file_operations exfat_file_operations; -+int __exfat_truncate(struct inode *inode, loff_t new_size); -+void exfat_truncate(struct inode *inode, loff_t size); -+int exfat_setattr(struct dentry *dentry, struct iattr *attr); -+int exfat_getattr(const struct path *path, struct kstat *stat, -+ unsigned int request_mask, unsigned int query_flags); -+ -+/* namei.c */ -+extern const struct dentry_operations exfat_dentry_ops; -+extern const struct dentry_operations exfat_utf8_dentry_ops; -+ -+/* cache.c */ -+int exfat_cache_init(void); -+void exfat_cache_shutdown(void); -+void exfat_cache_init_inode(struct inode *inode); -+void exfat_cache_inval_inode(struct inode *inode); -+int exfat_get_cluster(struct inode *inode, unsigned int cluster, -+ unsigned int *fclus, unsigned int *dclus, -+ unsigned int *last_dclus, int allow_eof); -+ -+/* dir.c */ -+extern const struct inode_operations exfat_dir_inode_operations; -+extern const struct file_operations exfat_dir_operations; -+unsigned int exfat_get_entry_type(struct exfat_dentry *p_entry); -+int exfat_init_dir_entry(struct inode *inode, struct exfat_chain *p_dir, -+ int entry, unsigned int type, unsigned int start_clu, -+ unsigned long long size); -+int exfat_init_ext_entry(struct inode *inode, struct exfat_chain *p_dir, -+ int entry, int num_entries, struct exfat_uni_name *p_uniname); -+int exfat_remove_entries(struct inode *inode, struct exfat_chain *p_dir, -+ int entry, int order, int num_entries); -+int exfat_update_dir_chksum(struct inode *inode, struct exfat_chain *p_dir, -+ int entry); -+int exfat_update_dir_chksum_with_entry_set(struct super_block *sb, -+ struct exfat_entry_set_cache *es, int sync); -+int exfat_calc_num_entries(struct exfat_uni_name *p_uniname); -+int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei, -+ struct exfat_chain *p_dir, struct exfat_uni_name *p_uniname, -+ int num_entries, unsigned int type); -+int exfat_alloc_new_dir(struct inode *inode, struct exfat_chain *clu); -+int exfat_find_location(struct super_block *sb, struct exfat_chain *p_dir, -+ int entry, sector_t *sector, int *offset); -+struct exfat_dentry *exfat_get_dentry(struct super_block *sb, -+ struct exfat_chain *p_dir, int entry, struct buffer_head **bh, -+ sector_t *sector); -+struct exfat_entry_set_cache *exfat_get_dentry_set(struct super_block *sb, -+ struct exfat_chain *p_dir, int entry, unsigned int type, -+ struct exfat_dentry **file_ep); -+int exfat_count_dir_entries(struct super_block *sb, struct exfat_chain *p_dir); -+ -+/* inode.c */ -+extern const struct inode_operations exfat_file_inode_operations; -+void exfat_sync_inode(struct inode *inode); -+struct inode *exfat_build_inode(struct super_block *sb, -+ struct exfat_dir_entry *info, loff_t i_pos); -+void exfat_hash_inode(struct inode *inode, loff_t i_pos); -+void exfat_unhash_inode(struct inode *inode); -+struct inode *exfat_iget(struct super_block *sb, loff_t i_pos); -+int exfat_write_inode(struct inode *inode, struct writeback_control *wbc); -+void exfat_evict_inode(struct inode *inode); -+int exfat_block_truncate_page(struct inode *inode, loff_t from); -+ -+/* exfat/nls.c */ -+unsigned short exfat_toupper(struct super_block *sb, unsigned short a); -+int exfat_uniname_ncmp(struct super_block *sb, unsigned short *a, -+ unsigned short *b, unsigned int len); -+int exfat_utf16_to_nls(struct super_block *sb, -+ struct exfat_uni_name *uniname, unsigned char *p_cstring, -+ int len); -+int exfat_nls_to_utf16(struct super_block *sb, -+ const unsigned char *p_cstring, const int len, -+ struct exfat_uni_name *uniname, int *p_lossy); -+int exfat_create_upcase_table(struct super_block *sb); -+void exfat_free_upcase_table(struct exfat_sb_info *sbi); -+unsigned short exfat_high_surrogate(unicode_t u); -+unsigned short exfat_low_surrogate(unicode_t u); -+ -+/* exfat/misc.c */ -+void __exfat_fs_error(struct super_block *sb, int report, const char *fmt, ...) -+ __printf(3, 4) __cold; -+#define exfat_fs_error(sb, fmt, args...) \ -+ __exfat_fs_error(sb, 1, fmt, ## args) -+#define exfat_fs_error_ratelimit(sb, fmt, args...) \ -+ __exfat_fs_error(sb, __ratelimit(&EXFAT_SB(sb)->ratelimit), \ -+ fmt, ## args) -+void exfat_msg(struct super_block *sb, const char *lv, const char *fmt, ...) -+ __printf(3, 4) __cold; -+void exfat_get_entry_time(struct exfat_sb_info *sbi, struct timespec64 *ts, -+ u8 tz, __le16 time, __le16 date, u8 time_ms); -+void exfat_set_entry_time(struct exfat_sb_info *sbi, struct timespec64 *ts, -+ u8 *tz, __le16 *time, __le16 *date, u8 *time_ms); -+unsigned short exfat_calc_chksum_2byte(void *data, int len, -+ unsigned short chksum, int type); -+void exfat_update_bh(struct super_block *sb, struct buffer_head *bh, int sync); -+void exfat_chain_set(struct exfat_chain *ec, unsigned int dir, -+ unsigned int size, unsigned char flags); -+void exfat_chain_dup(struct exfat_chain *dup, struct exfat_chain *ec); -+ -+#endif /* !_EXFAT_FS_H */ -diff --git a/fs/exfat/exfat_raw.h b/fs/exfat/exfat_raw.h -new file mode 100644 -index 000000000000..2a841010e649 ---- /dev/null -+++ b/fs/exfat/exfat_raw.h -@@ -0,0 +1,184 @@ -+/* SPDX-License-Identifier: GPL-2.0-or-later */ -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#ifndef _EXFAT_RAW_H -+#define _EXFAT_RAW_H -+ -+#include -+ -+#define PBR_SIGNATURE 0xAA55 -+ -+#define EXFAT_MAX_FILE_LEN 255 -+ -+#define VOL_CLEAN 0x0000 -+#define VOL_DIRTY 0x0002 -+ -+#define EXFAT_EOF_CLUSTER 0xFFFFFFFFu -+#define EXFAT_BAD_CLUSTER 0xFFFFFFF7u -+#define EXFAT_FREE_CLUSTER 0 -+/* Cluster 0, 1 are reserved, the first cluster is 2 in the cluster heap. */ -+#define EXFAT_RESERVED_CLUSTERS 2 -+#define EXFAT_FIRST_CLUSTER 2 -+#define EXFAT_DATA_CLUSTER_COUNT(sbi) \ -+ ((sbi)->num_clusters - EXFAT_RESERVED_CLUSTERS) -+ -+/* AllocationPossible and NoFatChain field in GeneralSecondaryFlags Field */ -+#define ALLOC_FAT_CHAIN 0x01 -+#define ALLOC_NO_FAT_CHAIN 0x03 -+ -+#define DENTRY_SIZE 32 /* directory entry size */ -+#define DENTRY_SIZE_BITS 5 -+/* exFAT allows 8388608(256MB) directory entries */ -+#define MAX_EXFAT_DENTRIES 8388608 -+ -+/* dentry types */ -+#define EXFAT_UNUSED 0x00 /* end of directory */ -+#define EXFAT_DELETE (~0x80) -+#define IS_EXFAT_DELETED(x) ((x) < 0x80) /* deleted file (0x01~0x7F) */ -+#define EXFAT_INVAL 0x80 /* invalid value */ -+#define EXFAT_BITMAP 0x81 /* allocation bitmap */ -+#define EXFAT_UPCASE 0x82 /* upcase table */ -+#define EXFAT_VOLUME 0x83 /* volume label */ -+#define EXFAT_FILE 0x85 /* file or dir */ -+#define EXFAT_GUID 0xA0 -+#define EXFAT_PADDING 0xA1 -+#define EXFAT_ACLTAB 0xA2 -+#define EXFAT_STREAM 0xC0 /* stream entry */ -+#define EXFAT_NAME 0xC1 /* file name entry */ -+#define EXFAT_ACL 0xC2 /* stream entry */ -+ -+#define IS_EXFAT_CRITICAL_PRI(x) (x < 0xA0) -+#define IS_EXFAT_BENIGN_PRI(x) (x < 0xC0) -+#define IS_EXFAT_CRITICAL_SEC(x) (x < 0xE0) -+ -+/* checksum types */ -+#define CS_DIR_ENTRY 0 -+#define CS_PBR_SECTOR 1 -+#define CS_DEFAULT 2 -+ -+/* file attributes */ -+#define ATTR_READONLY 0x0001 -+#define ATTR_HIDDEN 0x0002 -+#define ATTR_SYSTEM 0x0004 -+#define ATTR_VOLUME 0x0008 -+#define ATTR_SUBDIR 0x0010 -+#define ATTR_ARCHIVE 0x0020 -+ -+#define ATTR_RWMASK (ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME | \ -+ ATTR_SUBDIR | ATTR_ARCHIVE) -+ -+#define PBR64_JUMP_BOOT_LEN 3 -+#define PBR64_OEM_NAME_LEN 8 -+#define PBR64_RESERVED_LEN 53 -+ -+#define EXFAT_FILE_NAME_LEN 15 -+ -+/* EXFAT BIOS parameter block (64 bytes) */ -+struct bpb64 { -+ __u8 jmp_boot[PBR64_JUMP_BOOT_LEN]; -+ __u8 oem_name[PBR64_OEM_NAME_LEN]; -+ __u8 res_zero[PBR64_RESERVED_LEN]; -+} __packed; -+ -+/* EXFAT EXTEND BIOS parameter block (56 bytes) */ -+struct bsx64 { -+ __le64 vol_offset; -+ __le64 vol_length; -+ __le32 fat_offset; -+ __le32 fat_length; -+ __le32 clu_offset; -+ __le32 clu_count; -+ __le32 root_cluster; -+ __le32 vol_serial; -+ __u8 fs_version[2]; -+ __le16 vol_flags; -+ __u8 sect_size_bits; -+ __u8 sect_per_clus_bits; -+ __u8 num_fats; -+ __u8 phy_drv_no; -+ __u8 perc_in_use; -+ __u8 reserved2[7]; -+} __packed; -+ -+/* EXFAT PBR[BPB+BSX] (120 bytes) */ -+struct pbr64 { -+ struct bpb64 bpb; -+ struct bsx64 bsx; -+} __packed; -+ -+/* Common PBR[Partition Boot Record] (512 bytes) */ -+struct pbr { -+ union { -+ __u8 raw[64]; -+ struct bpb64 f64; -+ } bpb; -+ union { -+ __u8 raw[56]; -+ struct bsx64 f64; -+ } bsx; -+ __u8 boot_code[390]; -+ __le16 signature; -+} __packed; -+ -+struct exfat_dentry { -+ __u8 type; -+ union { -+ struct { -+ __u8 num_ext; -+ __le16 checksum; -+ __le16 attr; -+ __le16 reserved1; -+ __le16 create_time; -+ __le16 create_date; -+ __le16 modify_time; -+ __le16 modify_date; -+ __le16 access_time; -+ __le16 access_date; -+ __u8 create_time_ms; -+ __u8 modify_time_ms; -+ __u8 create_tz; -+ __u8 modify_tz; -+ __u8 access_tz; -+ __u8 reserved2[7]; -+ } __packed file; /* file directory entry */ -+ struct { -+ __u8 flags; -+ __u8 reserved1; -+ __u8 name_len; -+ __le16 name_hash; -+ __le16 reserved2; -+ __le64 valid_size; -+ __le32 reserved3; -+ __le32 start_clu; -+ __le64 size; -+ } __packed stream; /* stream extension directory entry */ -+ struct { -+ __u8 flags; -+ __le16 unicode_0_14[EXFAT_FILE_NAME_LEN]; -+ } __packed name; /* file name directory entry */ -+ struct { -+ __u8 flags; -+ __u8 reserved[18]; -+ __le32 start_clu; -+ __le64 size; -+ } __packed bitmap; /* allocation bitmap directory entry */ -+ struct { -+ __u8 reserved1[3]; -+ __le32 checksum; -+ __u8 reserved2[12]; -+ __le32 start_clu; -+ __le64 size; -+ } __packed upcase; /* up-case table directory entry */ -+ } __packed dentry; -+} __packed; -+ -+#define EXFAT_TZ_VALID (1 << 7) -+ -+/* Jan 1 GMT 00:00:00 1980 */ -+#define EXFAT_MIN_TIMESTAMP_SECS 315532800LL -+/* Dec 31 GMT 23:59:59 2107 */ -+#define EXFAT_MAX_TIMESTAMP_SECS 4354819199LL -+ -+#endif /* !_EXFAT_RAW_H */ --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-inode-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-inode-operations.patch deleted file mode 100644 index 0b47e8a9..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-inode-operations.patch +++ /dev/null @@ -1,2156 +0,0 @@ -From 5f2aa075070cf5b2e6aae011d5a3390408d7d913 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:34 +0900 -Subject: [PATCH 03/14] exfat: add inode operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of inode operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/inode.c | 671 +++++++++++++++++++++ - fs/exfat/namei.c | 1448 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 2119 insertions(+) - create mode 100644 fs/exfat/inode.c - create mode 100644 fs/exfat/namei.c - -diff --git a/fs/exfat/inode.c b/fs/exfat/inode.c -new file mode 100644 -index 000000000000..06887492f54b ---- /dev/null -+++ b/fs/exfat/inode.c -@@ -0,0 +1,671 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+static int __exfat_write_inode(struct inode *inode, int sync) -+{ -+ int ret = -EIO; -+ unsigned long long on_disk_size; -+ struct exfat_dentry *ep, *ep2; -+ struct exfat_entry_set_cache *es = NULL; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ bool is_dir = (ei->type == TYPE_DIR) ? true : false; -+ -+ if (inode->i_ino == EXFAT_ROOT_INO) -+ return 0; -+ -+ /* -+ * If the indode is already unlinked, there is no need for updating it. -+ */ -+ if (ei->dir.dir == DIR_DELETED) -+ return 0; -+ -+ if (is_dir && ei->dir.dir == sbi->root_dir && ei->entry == -1) -+ return 0; -+ -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ -+ /* get the directory entry of given file or directory */ -+ es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry, ES_ALL_ENTRIES, -+ &ep); -+ if (!es) -+ return -EIO; -+ ep2 = ep + 1; -+ -+ ep->dentry.file.attr = cpu_to_le16(exfat_make_attr(inode)); -+ -+ /* set FILE_INFO structure using the acquired struct exfat_dentry */ -+ exfat_set_entry_time(sbi, &ei->i_crtime, -+ &ep->dentry.file.create_tz, -+ &ep->dentry.file.create_time, -+ &ep->dentry.file.create_date, -+ &ep->dentry.file.create_time_ms); -+ exfat_set_entry_time(sbi, &inode->i_mtime, -+ &ep->dentry.file.modify_tz, -+ &ep->dentry.file.modify_time, -+ &ep->dentry.file.modify_date, -+ &ep->dentry.file.modify_time_ms); -+ exfat_set_entry_time(sbi, &inode->i_atime, -+ &ep->dentry.file.access_tz, -+ &ep->dentry.file.access_time, -+ &ep->dentry.file.access_date, -+ NULL); -+ -+ /* File size should be zero if there is no cluster allocated */ -+ on_disk_size = i_size_read(inode); -+ -+ if (ei->start_clu == EXFAT_EOF_CLUSTER) -+ on_disk_size = 0; -+ -+ ep2->dentry.stream.valid_size = cpu_to_le64(on_disk_size); -+ ep2->dentry.stream.size = ep2->dentry.stream.valid_size; -+ -+ ret = exfat_update_dir_chksum_with_entry_set(sb, es, sync); -+ kfree(es); -+ return ret; -+} -+ -+int exfat_write_inode(struct inode *inode, struct writeback_control *wbc) -+{ -+ int ret; -+ -+ mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock); -+ ret = __exfat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); -+ mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock); -+ -+ return ret; -+} -+ -+void exfat_sync_inode(struct inode *inode) -+{ -+ lockdep_assert_held(&EXFAT_SB(inode->i_sb)->s_lock); -+ __exfat_write_inode(inode, 1); -+} -+ -+/* -+ * Input: inode, (logical) clu_offset, target allocation area -+ * Output: errcode, cluster number -+ * *clu = (~0), if it's unable to allocate a new cluster -+ */ -+static int exfat_map_cluster(struct inode *inode, unsigned int clu_offset, -+ unsigned int *clu, int create) -+{ -+ int ret, modified = false; -+ unsigned int last_clu; -+ struct exfat_chain new_clu; -+ struct exfat_dentry *ep; -+ struct exfat_entry_set_cache *es = NULL; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ unsigned int local_clu_offset = clu_offset; -+ unsigned int num_to_be_allocated = 0, num_clusters = 0; -+ -+ ei->rwoffset = EXFAT_CLU_TO_B(clu_offset, sbi); -+ -+ if (EXFAT_I(inode)->i_size_ondisk > 0) -+ num_clusters = -+ EXFAT_B_TO_CLU_ROUND_UP(EXFAT_I(inode)->i_size_ondisk, -+ sbi); -+ -+ if (clu_offset >= num_clusters) -+ num_to_be_allocated = clu_offset - num_clusters + 1; -+ -+ if (!create && (num_to_be_allocated > 0)) { -+ *clu = EXFAT_EOF_CLUSTER; -+ return 0; -+ } -+ -+ *clu = last_clu = ei->start_clu; -+ -+ if (ei->flags == ALLOC_NO_FAT_CHAIN) { -+ if (clu_offset > 0 && *clu != EXFAT_EOF_CLUSTER) { -+ last_clu += clu_offset - 1; -+ -+ if (clu_offset == num_clusters) -+ *clu = EXFAT_EOF_CLUSTER; -+ else -+ *clu += clu_offset; -+ } -+ } else if (ei->type == TYPE_FILE) { -+ unsigned int fclus = 0; -+ int err = exfat_get_cluster(inode, clu_offset, -+ &fclus, clu, &last_clu, 1); -+ if (err) -+ return -EIO; -+ -+ clu_offset -= fclus; -+ } else { -+ /* hint information */ -+ if (clu_offset > 0 && ei->hint_bmap.off != EXFAT_EOF_CLUSTER && -+ ei->hint_bmap.off > 0 && clu_offset >= ei->hint_bmap.off) { -+ clu_offset -= ei->hint_bmap.off; -+ /* hint_bmap.clu should be valid */ -+ WARN_ON(ei->hint_bmap.clu < 2); -+ *clu = ei->hint_bmap.clu; -+ } -+ -+ while (clu_offset > 0 && *clu != EXFAT_EOF_CLUSTER) { -+ last_clu = *clu; -+ if (exfat_get_next_cluster(sb, clu)) -+ return -EIO; -+ clu_offset--; -+ } -+ } -+ -+ if (*clu == EXFAT_EOF_CLUSTER) { -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ -+ new_clu.dir = (last_clu == EXFAT_EOF_CLUSTER) ? -+ EXFAT_EOF_CLUSTER : last_clu + 1; -+ new_clu.size = 0; -+ new_clu.flags = ei->flags; -+ -+ /* allocate a cluster */ -+ if (num_to_be_allocated < 1) { -+ /* Broken FAT (i_sze > allocated FAT) */ -+ exfat_fs_error(sb, "broken FAT chain."); -+ return -EIO; -+ } -+ -+ ret = exfat_alloc_cluster(inode, num_to_be_allocated, &new_clu); -+ if (ret) -+ return ret; -+ -+ if (new_clu.dir == EXFAT_EOF_CLUSTER || -+ new_clu.dir == EXFAT_FREE_CLUSTER) { -+ exfat_fs_error(sb, -+ "bogus cluster new allocated (last_clu : %u, new_clu : %u)", -+ last_clu, new_clu.dir); -+ return -EIO; -+ } -+ -+ /* append to the FAT chain */ -+ if (last_clu == EXFAT_EOF_CLUSTER) { -+ if (new_clu.flags == ALLOC_FAT_CHAIN) -+ ei->flags = ALLOC_FAT_CHAIN; -+ ei->start_clu = new_clu.dir; -+ modified = true; -+ } else { -+ if (new_clu.flags != ei->flags) { -+ /* no-fat-chain bit is disabled, -+ * so fat-chain should be synced with -+ * alloc-bitmap -+ */ -+ exfat_chain_cont_cluster(sb, ei->start_clu, -+ num_clusters); -+ ei->flags = ALLOC_FAT_CHAIN; -+ modified = true; -+ } -+ if (new_clu.flags == ALLOC_FAT_CHAIN) -+ if (exfat_ent_set(sb, last_clu, new_clu.dir)) -+ return -EIO; -+ } -+ -+ num_clusters += num_to_be_allocated; -+ *clu = new_clu.dir; -+ -+ if (ei->dir.dir != DIR_DELETED) { -+ es = exfat_get_dentry_set(sb, &(ei->dir), ei->entry, -+ ES_ALL_ENTRIES, &ep); -+ if (!es) -+ return -EIO; -+ /* get stream entry */ -+ ep++; -+ -+ /* update directory entry */ -+ if (modified) { -+ if (ep->dentry.stream.flags != ei->flags) -+ ep->dentry.stream.flags = ei->flags; -+ -+ if (le32_to_cpu(ep->dentry.stream.start_clu) != -+ ei->start_clu) -+ ep->dentry.stream.start_clu = -+ cpu_to_le32(ei->start_clu); -+ -+ ep->dentry.stream.valid_size = -+ cpu_to_le64(i_size_read(inode)); -+ ep->dentry.stream.size = -+ ep->dentry.stream.valid_size; -+ } -+ -+ if (exfat_update_dir_chksum_with_entry_set(sb, es, -+ inode_needs_sync(inode))) -+ return -EIO; -+ kfree(es); -+ -+ } /* end of if != DIR_DELETED */ -+ -+ inode->i_blocks += -+ num_to_be_allocated << sbi->sect_per_clus_bits; -+ -+ /* -+ * Move *clu pointer along FAT chains (hole care) because the -+ * caller of this function expect *clu to be the last cluster. -+ * This only works when num_to_be_allocated >= 2, -+ * *clu = (the first cluster of the allocated chain) => -+ * (the last cluster of ...) -+ */ -+ if (ei->flags == ALLOC_NO_FAT_CHAIN) { -+ *clu += num_to_be_allocated - 1; -+ } else { -+ while (num_to_be_allocated > 1) { -+ if (exfat_get_next_cluster(sb, clu)) -+ return -EIO; -+ num_to_be_allocated--; -+ } -+ } -+ -+ } -+ -+ /* hint information */ -+ ei->hint_bmap.off = local_clu_offset; -+ ei->hint_bmap.clu = *clu; -+ -+ return 0; -+} -+ -+static int exfat_map_new_buffer(struct exfat_inode_info *ei, -+ struct buffer_head *bh, loff_t pos) -+{ -+ if (buffer_delay(bh) && pos > ei->i_size_aligned) -+ return -EIO; -+ set_buffer_new(bh); -+ -+ /* -+ * Adjust i_size_aligned if i_size_ondisk is bigger than it. -+ */ -+ if (ei->i_size_ondisk > ei->i_size_aligned) -+ ei->i_size_aligned = ei->i_size_ondisk; -+ return 0; -+} -+ -+static int exfat_get_block(struct inode *inode, sector_t iblock, -+ struct buffer_head *bh_result, int create) -+{ -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits; -+ int err = 0; -+ unsigned long mapped_blocks = 0; -+ unsigned int cluster, sec_offset; -+ sector_t last_block; -+ sector_t phys = 0; -+ loff_t pos; -+ -+ mutex_lock(&sbi->s_lock); -+ last_block = EXFAT_B_TO_BLK_ROUND_UP(i_size_read(inode), sb); -+ if (iblock >= last_block && !create) -+ goto done; -+ -+ /* Is this block already allocated? */ -+ err = exfat_map_cluster(inode, iblock >> sbi->sect_per_clus_bits, -+ &cluster, create); -+ if (err) { -+ if (err != -ENOSPC) -+ exfat_fs_error_ratelimit(sb, -+ "failed to bmap (inode : %p iblock : %llu, err : %d)", -+ inode, (unsigned long long)iblock, err); -+ goto unlock_ret; -+ } -+ -+ if (cluster == EXFAT_EOF_CLUSTER) -+ goto done; -+ -+ /* sector offset in cluster */ -+ sec_offset = iblock & (sbi->sect_per_clus - 1); -+ -+ phys = exfat_cluster_to_sector(sbi, cluster) + sec_offset; -+ mapped_blocks = sbi->sect_per_clus - sec_offset; -+ max_blocks = min(mapped_blocks, max_blocks); -+ -+ /* Treat newly added block / cluster */ -+ if (iblock < last_block) -+ create = 0; -+ -+ if (create || buffer_delay(bh_result)) { -+ pos = EXFAT_BLK_TO_B((iblock + 1), sb); -+ if (ei->i_size_ondisk < pos) -+ ei->i_size_ondisk = pos; -+ } -+ -+ if (create) { -+ err = exfat_map_new_buffer(ei, bh_result, pos); -+ if (err) { -+ exfat_fs_error(sb, -+ "requested for bmap out of range(pos : (%llu) > i_size_aligned(%llu)\n", -+ pos, ei->i_size_aligned); -+ goto unlock_ret; -+ } -+ } -+ -+ if (buffer_delay(bh_result)) -+ clear_buffer_delay(bh_result); -+ map_bh(bh_result, sb, phys); -+done: -+ bh_result->b_size = EXFAT_BLK_TO_B(max_blocks, sb); -+unlock_ret: -+ mutex_unlock(&sbi->s_lock); -+ return err; -+} -+ -+static int exfat_readpage(struct file *file, struct page *page) -+{ -+ return mpage_readpage(page, exfat_get_block); -+} -+ -+static int exfat_readpages(struct file *file, struct address_space *mapping, -+ struct list_head *pages, unsigned int nr_pages) -+{ -+ return mpage_readpages(mapping, pages, nr_pages, exfat_get_block); -+} -+ -+static int exfat_writepage(struct page *page, struct writeback_control *wbc) -+{ -+ return block_write_full_page(page, exfat_get_block, wbc); -+} -+ -+static int exfat_writepages(struct address_space *mapping, -+ struct writeback_control *wbc) -+{ -+ return mpage_writepages(mapping, wbc, exfat_get_block); -+} -+ -+static void exfat_write_failed(struct address_space *mapping, loff_t to) -+{ -+ struct inode *inode = mapping->host; -+ -+ if (to > i_size_read(inode)) { -+ truncate_pagecache(inode, i_size_read(inode)); -+ exfat_truncate(inode, EXFAT_I(inode)->i_size_aligned); -+ } -+} -+ -+static int exfat_write_begin(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned int len, unsigned int flags, -+ struct page **pagep, void **fsdata) -+{ -+ int ret; -+ -+ *pagep = NULL; -+ ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, -+ exfat_get_block, -+ &EXFAT_I(mapping->host)->i_size_ondisk); -+ -+ if (ret < 0) -+ exfat_write_failed(mapping, pos+len); -+ -+ return ret; -+} -+ -+static int exfat_write_end(struct file *file, struct address_space *mapping, -+ loff_t pos, unsigned int len, unsigned int copied, -+ struct page *pagep, void *fsdata) -+{ -+ struct inode *inode = mapping->host; -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ int err; -+ -+ err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata); -+ -+ if (EXFAT_I(inode)->i_size_aligned < i_size_read(inode)) { -+ exfat_fs_error(inode->i_sb, -+ "invalid size(size(%llu) > aligned(%llu)\n", -+ i_size_read(inode), EXFAT_I(inode)->i_size_aligned); -+ return -EIO; -+ } -+ -+ if (err < len) -+ exfat_write_failed(mapping, pos+len); -+ -+ if (!(err < 0) && !(ei->attr & ATTR_ARCHIVE)) { -+ inode->i_mtime = inode->i_ctime = current_time(inode); -+ ei->attr |= ATTR_ARCHIVE; -+ mark_inode_dirty(inode); -+ } -+ -+ return err; -+} -+ -+static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter) -+{ -+ struct address_space *mapping = iocb->ki_filp->f_mapping; -+ struct inode *inode = mapping->host; -+ loff_t size = iocb->ki_pos + iov_iter_count(iter); -+ int rw = iov_iter_rw(iter); -+ ssize_t ret; -+ -+ if (rw == WRITE) { -+ /* -+ * FIXME: blockdev_direct_IO() doesn't use ->write_begin(), -+ * so we need to update the ->i_size_aligned to block boundary. -+ * -+ * But we must fill the remaining area or hole by nul for -+ * updating ->i_size_aligned -+ * -+ * Return 0, and fallback to normal buffered write. -+ */ -+ if (EXFAT_I(inode)->i_size_aligned < size) -+ return 0; -+ } -+ -+ /* -+ * Need to use the DIO_LOCKING for avoiding the race -+ * condition of exfat_get_block() and ->truncate(). -+ */ -+ ret = blockdev_direct_IO(iocb, inode, iter, exfat_get_block); -+ if (ret < 0 && (rw & WRITE)) -+ exfat_write_failed(mapping, size); -+ return ret; -+} -+ -+static sector_t exfat_aop_bmap(struct address_space *mapping, sector_t block) -+{ -+ sector_t blocknr; -+ -+ /* exfat_get_cluster() assumes the requested blocknr isn't truncated. */ -+ down_read(&EXFAT_I(mapping->host)->truncate_lock); -+ blocknr = generic_block_bmap(mapping, block, exfat_get_block); -+ up_read(&EXFAT_I(mapping->host)->truncate_lock); -+ return blocknr; -+} -+ -+/* -+ * exfat_block_truncate_page() zeroes out a mapping from file offset `from' -+ * up to the end of the block which corresponds to `from'. -+ * This is required during truncate to physically zeroout the tail end -+ * of that block so it doesn't yield old data if the file is later grown. -+ * Also, avoid causing failure from fsx for cases of "data past EOF" -+ */ -+int exfat_block_truncate_page(struct inode *inode, loff_t from) -+{ -+ return block_truncate_page(inode->i_mapping, from, exfat_get_block); -+} -+ -+static const struct address_space_operations exfat_aops = { -+ .readpage = exfat_readpage, -+ .readpages = exfat_readpages, -+ .writepage = exfat_writepage, -+ .writepages = exfat_writepages, -+ .write_begin = exfat_write_begin, -+ .write_end = exfat_write_end, -+ .direct_IO = exfat_direct_IO, -+ .bmap = exfat_aop_bmap -+}; -+ -+static inline unsigned long exfat_hash(loff_t i_pos) -+{ -+ return hash_32(i_pos, EXFAT_HASH_BITS); -+} -+ -+void exfat_hash_inode(struct inode *inode, loff_t i_pos) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -+ struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos); -+ -+ spin_lock(&sbi->inode_hash_lock); -+ EXFAT_I(inode)->i_pos = i_pos; -+ hlist_add_head(&EXFAT_I(inode)->i_hash_fat, head); -+ spin_unlock(&sbi->inode_hash_lock); -+} -+ -+void exfat_unhash_inode(struct inode *inode) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -+ -+ spin_lock(&sbi->inode_hash_lock); -+ hlist_del_init(&EXFAT_I(inode)->i_hash_fat); -+ EXFAT_I(inode)->i_pos = 0; -+ spin_unlock(&sbi->inode_hash_lock); -+} -+ -+struct inode *exfat_iget(struct super_block *sb, loff_t i_pos) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *info; -+ struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos); -+ struct inode *inode = NULL; -+ -+ spin_lock(&sbi->inode_hash_lock); -+ hlist_for_each_entry(info, head, i_hash_fat) { -+ WARN_ON(info->vfs_inode.i_sb != sb); -+ -+ if (i_pos != info->i_pos) -+ continue; -+ inode = igrab(&info->vfs_inode); -+ if (inode) -+ break; -+ } -+ spin_unlock(&sbi->inode_hash_lock); -+ return inode; -+} -+ -+/* doesn't deal with root inode */ -+static int exfat_fill_inode(struct inode *inode, struct exfat_dir_entry *info) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ loff_t size = info->size; -+ -+ memcpy(&ei->dir, &info->dir, sizeof(struct exfat_chain)); -+ ei->entry = info->entry; -+ ei->attr = info->attr; -+ ei->start_clu = info->start_clu; -+ ei->flags = info->flags; -+ ei->type = info->type; -+ -+ ei->version = 0; -+ ei->hint_stat.eidx = 0; -+ ei->hint_stat.clu = info->start_clu; -+ ei->hint_femp.eidx = EXFAT_HINT_NONE; -+ ei->rwoffset = 0; -+ ei->hint_bmap.off = EXFAT_EOF_CLUSTER; -+ ei->i_pos = 0; -+ -+ inode->i_uid = sbi->options.fs_uid; -+ inode->i_gid = sbi->options.fs_gid; -+ inode_inc_iversion(inode); -+ inode->i_generation = prandom_u32(); -+ -+ if (info->attr & ATTR_SUBDIR) { /* directory */ -+ inode->i_generation &= ~1; -+ inode->i_mode = exfat_make_mode(sbi, info->attr, 0777); -+ inode->i_op = &exfat_dir_inode_operations; -+ inode->i_fop = &exfat_dir_operations; -+ set_nlink(inode, info->num_subdirs); -+ } else { /* regular file */ -+ inode->i_generation |= 1; -+ inode->i_mode = exfat_make_mode(sbi, info->attr, 0777); -+ inode->i_op = &exfat_file_inode_operations; -+ inode->i_fop = &exfat_file_operations; -+ inode->i_mapping->a_ops = &exfat_aops; -+ inode->i_mapping->nrpages = 0; -+ } -+ -+ i_size_write(inode, size); -+ -+ /* ondisk and aligned size should be aligned with block size */ -+ if (size & (inode->i_sb->s_blocksize - 1)) { -+ size |= (inode->i_sb->s_blocksize - 1); -+ size++; -+ } -+ -+ ei->i_size_aligned = size; -+ ei->i_size_ondisk = size; -+ -+ exfat_save_attr(inode, info->attr); -+ -+ inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) & -+ ~(sbi->cluster_size - 1)) >> inode->i_blkbits; -+ inode->i_mtime = info->mtime; -+ inode->i_ctime = info->mtime; -+ ei->i_crtime = info->crtime; -+ inode->i_atime = info->atime; -+ -+ exfat_cache_init_inode(inode); -+ -+ return 0; -+} -+ -+struct inode *exfat_build_inode(struct super_block *sb, -+ struct exfat_dir_entry *info, loff_t i_pos) -+{ -+ struct inode *inode; -+ int err; -+ -+ inode = exfat_iget(sb, i_pos); -+ if (inode) -+ goto out; -+ inode = new_inode(sb); -+ if (!inode) { -+ inode = ERR_PTR(-ENOMEM); -+ goto out; -+ } -+ inode->i_ino = iunique(sb, EXFAT_ROOT_INO); -+ inode_set_iversion(inode, 1); -+ err = exfat_fill_inode(inode, info); -+ if (err) { -+ iput(inode); -+ inode = ERR_PTR(err); -+ goto out; -+ } -+ exfat_hash_inode(inode, i_pos); -+ insert_inode_hash(inode); -+out: -+ return inode; -+} -+ -+void exfat_evict_inode(struct inode *inode) -+{ -+ truncate_inode_pages(&inode->i_data, 0); -+ -+ if (!inode->i_nlink) { -+ i_size_write(inode, 0); -+ mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock); -+ __exfat_truncate(inode, 0); -+ mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock); -+ } -+ -+ invalidate_inode_buffers(inode); -+ clear_inode(inode); -+ exfat_cache_inval_inode(inode); -+ exfat_unhash_inode(inode); -+} -diff --git a/fs/exfat/namei.c b/fs/exfat/namei.c -new file mode 100644 -index 000000000000..a8681d91f569 ---- /dev/null -+++ b/fs/exfat/namei.c -@@ -0,0 +1,1448 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+static inline unsigned long exfat_d_version(struct dentry *dentry) -+{ -+ return (unsigned long) dentry->d_fsdata; -+} -+ -+static inline void exfat_d_version_set(struct dentry *dentry, -+ unsigned long version) -+{ -+ dentry->d_fsdata = (void *) version; -+} -+ -+/* -+ * If new entry was created in the parent, it could create the 8.3 alias (the -+ * shortname of logname). So, the parent may have the negative-dentry which -+ * matches the created 8.3 alias. -+ * -+ * If it happened, the negative dentry isn't actually negative anymore. So, -+ * drop it. -+ */ -+static int exfat_d_revalidate(struct dentry *dentry, unsigned int flags) -+{ -+ int ret; -+ -+ if (flags & LOOKUP_RCU) -+ return -ECHILD; -+ -+ /* -+ * This is not negative dentry. Always valid. -+ * -+ * Note, rename() to existing directory entry will have ->d_inode, and -+ * will use existing name which isn't specified name by user. -+ * -+ * We may be able to drop this positive dentry here. But dropping -+ * positive dentry isn't good idea. So it's unsupported like -+ * rename("filename", "FILENAME") for now. -+ */ -+ if (d_really_is_positive(dentry)) -+ return 1; -+ -+ /* -+ * Drop the negative dentry, in order to make sure to use the case -+ * sensitive name which is specified by user if this is for creation. -+ */ -+ if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET)) -+ return 0; -+ -+ spin_lock(&dentry->d_lock); -+ ret = inode_eq_iversion(d_inode(dentry->d_parent), -+ exfat_d_version(dentry)); -+ spin_unlock(&dentry->d_lock); -+ return ret; -+} -+ -+/* returns the length of a struct qstr, ignoring trailing dots */ -+static unsigned int exfat_striptail_len(unsigned int len, const char *name) -+{ -+ while (len && name[len - 1] == '.') -+ len--; -+ return len; -+} -+ -+/* -+ * Compute the hash for the exfat name corresponding to the dentry. If the name -+ * is invalid, we leave the hash code unchanged so that the existing dentry can -+ * be used. The exfat fs routines will return ENOENT or EINVAL as appropriate. -+ */ -+static int exfat_d_hash(const struct dentry *dentry, struct qstr *qstr) -+{ -+ struct super_block *sb = dentry->d_sb; -+ struct nls_table *t = EXFAT_SB(sb)->nls_io; -+ const unsigned char *name = qstr->name; -+ unsigned int len = exfat_striptail_len(qstr->len, qstr->name); -+ unsigned long hash = init_name_hash(dentry); -+ int i, charlen; -+ wchar_t c; -+ -+ for (i = 0; i < len; i += charlen) { -+ charlen = t->char2uni(&name[i], len - i, &c); -+ if (charlen < 0) -+ return charlen; -+ hash = partial_name_hash(exfat_toupper(sb, c), hash); -+ } -+ -+ qstr->hash = end_name_hash(hash); -+ return 0; -+} -+ -+static int exfat_d_cmp(const struct dentry *dentry, unsigned int len, -+ const char *str, const struct qstr *name) -+{ -+ struct super_block *sb = dentry->d_sb; -+ struct nls_table *t = EXFAT_SB(sb)->nls_io; -+ unsigned int alen = exfat_striptail_len(name->len, name->name); -+ unsigned int blen = exfat_striptail_len(len, str); -+ wchar_t c1, c2; -+ int charlen, i; -+ -+ if (alen != blen) -+ return 1; -+ -+ for (i = 0; i < len; i += charlen) { -+ charlen = t->char2uni(&name->name[i], alen - i, &c1); -+ if (charlen < 0) -+ return 1; -+ if (charlen != t->char2uni(&str[i], blen - i, &c2)) -+ return 1; -+ -+ if (exfat_toupper(sb, c1) != exfat_toupper(sb, c2)) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+const struct dentry_operations exfat_dentry_ops = { -+ .d_revalidate = exfat_d_revalidate, -+ .d_hash = exfat_d_hash, -+ .d_compare = exfat_d_cmp, -+}; -+ -+static int exfat_utf8_d_hash(const struct dentry *dentry, struct qstr *qstr) -+{ -+ struct super_block *sb = dentry->d_sb; -+ const unsigned char *name = qstr->name; -+ unsigned int len = exfat_striptail_len(qstr->len, qstr->name); -+ unsigned long hash = init_name_hash(dentry); -+ int i, charlen; -+ unicode_t u; -+ -+ for (i = 0; i < len; i += charlen) { -+ charlen = utf8_to_utf32(&name[i], len - i, &u); -+ if (charlen < 0) -+ return charlen; -+ -+ /* -+ * Convert to UTF-16: code points above U+FFFF are encoded as -+ * surrogate pairs. -+ * exfat_toupper() works only for code points up to the U+FFFF. -+ */ -+ if (u > 0xFFFF) { -+ hash = partial_name_hash(exfat_high_surrogate(u), hash); -+ hash = partial_name_hash(exfat_low_surrogate(u), hash); -+ } else { -+ hash = partial_name_hash(exfat_toupper(sb, u), hash); -+ } -+ } -+ -+ qstr->hash = end_name_hash(hash); -+ return 0; -+} -+ -+static int exfat_utf8_d_cmp(const struct dentry *dentry, unsigned int len, -+ const char *str, const struct qstr *name) -+{ -+ struct super_block *sb = dentry->d_sb; -+ unsigned int alen = exfat_striptail_len(name->len, name->name); -+ unsigned int blen = exfat_striptail_len(len, str); -+ unicode_t u_a, u_b; -+ int charlen, i; -+ -+ if (alen != blen) -+ return 1; -+ -+ for (i = 0; i < alen; i += charlen) { -+ charlen = utf8_to_utf32(&name->name[i], alen - i, &u_a); -+ if (charlen < 0) -+ return 1; -+ if (charlen != utf8_to_utf32(&str[i], blen - i, &u_b)) -+ return 1; -+ -+ if (u_a <= 0xFFFF && u_b <= 0xFFFF) { -+ if (exfat_toupper(sb, u_a) != exfat_toupper(sb, u_b)) -+ return 1; -+ } else if (u_a > 0xFFFF && u_b > 0xFFFF) { -+ if (exfat_low_surrogate(u_a) != -+ exfat_low_surrogate(u_b) || -+ exfat_high_surrogate(u_a) != -+ exfat_high_surrogate(u_b)) -+ return 1; -+ } else { -+ return 1; -+ } -+ } -+ -+ return 0; -+} -+ -+const struct dentry_operations exfat_utf8_dentry_ops = { -+ .d_revalidate = exfat_d_revalidate, -+ .d_hash = exfat_utf8_d_hash, -+ .d_compare = exfat_utf8_d_cmp, -+}; -+ -+/* used only in search empty_slot() */ -+#define CNT_UNUSED_NOHIT (-1) -+#define CNT_UNUSED_HIT (-2) -+/* search EMPTY CONTINUOUS "num_entries" entries */ -+static int exfat_search_empty_slot(struct super_block *sb, -+ struct exfat_hint_femp *hint_femp, struct exfat_chain *p_dir, -+ int num_entries) -+{ -+ int i, dentry, num_empty = 0; -+ int dentries_per_clu; -+ unsigned int type; -+ struct exfat_chain clu; -+ struct exfat_dentry *ep; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct buffer_head *bh; -+ -+ dentries_per_clu = sbi->dentries_per_clu; -+ -+ if (hint_femp->eidx != EXFAT_HINT_NONE) { -+ dentry = hint_femp->eidx; -+ if (num_entries <= hint_femp->count) { -+ hint_femp->eidx = EXFAT_HINT_NONE; -+ return dentry; -+ } -+ -+ exfat_chain_dup(&clu, &hint_femp->cur); -+ } else { -+ exfat_chain_dup(&clu, p_dir); -+ dentry = 0; -+ } -+ -+ while (clu.dir != EXFAT_EOF_CLUSTER) { -+ i = dentry & (dentries_per_clu - 1); -+ -+ for (; i < dentries_per_clu; i++, dentry++) { -+ ep = exfat_get_dentry(sb, &clu, i, &bh, NULL); -+ if (!ep) -+ return -EIO; -+ type = exfat_get_entry_type(ep); -+ brelse(bh); -+ -+ if (type == TYPE_UNUSED || type == TYPE_DELETED) { -+ num_empty++; -+ if (hint_femp->eidx == EXFAT_HINT_NONE) { -+ hint_femp->eidx = dentry; -+ hint_femp->count = CNT_UNUSED_NOHIT; -+ exfat_chain_set(&hint_femp->cur, -+ clu.dir, clu.size, clu.flags); -+ } -+ -+ if (type == TYPE_UNUSED && -+ hint_femp->count != CNT_UNUSED_HIT) -+ hint_femp->count = CNT_UNUSED_HIT; -+ } else { -+ if (hint_femp->eidx != EXFAT_HINT_NONE && -+ hint_femp->count == CNT_UNUSED_HIT) { -+ /* unused empty group means -+ * an empty group which includes -+ * unused dentry -+ */ -+ exfat_fs_error(sb, -+ "found bogus dentry(%d) beyond unused empty group(%d) (start_clu : %u, cur_clu : %u)", -+ dentry, hint_femp->eidx, -+ p_dir->dir, clu.dir); -+ return -EIO; -+ } -+ -+ num_empty = 0; -+ hint_femp->eidx = EXFAT_HINT_NONE; -+ } -+ -+ if (num_empty >= num_entries) { -+ /* found and invalidate hint_femp */ -+ hint_femp->eidx = EXFAT_HINT_NONE; -+ return (dentry - (num_entries - 1)); -+ } -+ } -+ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ if (--clu.size > 0) -+ clu.dir++; -+ else -+ clu.dir = EXFAT_EOF_CLUSTER; -+ } else { -+ if (exfat_get_next_cluster(sb, &clu.dir)) -+ return -EIO; -+ } -+ } -+ -+ return -ENOSPC; -+} -+ -+static int exfat_check_max_dentries(struct inode *inode) -+{ -+ if (EXFAT_B_TO_DEN(i_size_read(inode)) >= MAX_EXFAT_DENTRIES) { -+ /* -+ * exFAT spec allows a dir to grow upto 8388608(256MB) -+ * dentries -+ */ -+ return -ENOSPC; -+ } -+ return 0; -+} -+ -+/* find empty directory entry. -+ * if there isn't any empty slot, expand cluster chain. -+ */ -+static int exfat_find_empty_entry(struct inode *inode, -+ struct exfat_chain *p_dir, int num_entries) -+{ -+ int dentry; -+ unsigned int ret, last_clu; -+ sector_t sector; -+ loff_t size = 0; -+ struct exfat_chain clu; -+ struct exfat_dentry *ep = NULL; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct exfat_hint_femp hint_femp; -+ -+ hint_femp.eidx = EXFAT_HINT_NONE; -+ -+ if (ei->hint_femp.eidx != EXFAT_HINT_NONE) { -+ memcpy(&hint_femp, &ei->hint_femp, -+ sizeof(struct exfat_hint_femp)); -+ ei->hint_femp.eidx = EXFAT_HINT_NONE; -+ } -+ -+ while ((dentry = exfat_search_empty_slot(sb, &hint_femp, p_dir, -+ num_entries)) < 0) { -+ if (dentry == -EIO) -+ break; -+ -+ if (exfat_check_max_dentries(inode)) -+ return -ENOSPC; -+ -+ /* we trust p_dir->size regardless of FAT type */ -+ if (exfat_find_last_cluster(sb, p_dir, &last_clu)) -+ return -EIO; -+ -+ /* -+ * Allocate new cluster to this directory -+ */ -+ exfat_chain_set(&clu, last_clu + 1, 0, p_dir->flags); -+ -+ /* allocate a cluster */ -+ ret = exfat_alloc_cluster(inode, 1, &clu); -+ if (ret) -+ return ret; -+ -+ if (exfat_zeroed_cluster(inode, clu.dir)) -+ return -EIO; -+ -+ /* append to the FAT chain */ -+ if (clu.flags != p_dir->flags) { -+ /* no-fat-chain bit is disabled, -+ * so fat-chain should be synced with alloc-bitmap -+ */ -+ exfat_chain_cont_cluster(sb, p_dir->dir, p_dir->size); -+ p_dir->flags = ALLOC_FAT_CHAIN; -+ hint_femp.cur.flags = ALLOC_FAT_CHAIN; -+ } -+ -+ if (clu.flags == ALLOC_FAT_CHAIN) -+ if (exfat_ent_set(sb, last_clu, clu.dir)) -+ return -EIO; -+ -+ if (hint_femp.eidx == EXFAT_HINT_NONE) { -+ /* the special case that new dentry -+ * should be allocated from the start of new cluster -+ */ -+ hint_femp.eidx = EXFAT_B_TO_DEN_IDX(p_dir->size, sbi); -+ hint_femp.count = sbi->dentries_per_clu; -+ -+ exfat_chain_set(&hint_femp.cur, clu.dir, 0, clu.flags); -+ } -+ hint_femp.cur.size++; -+ p_dir->size++; -+ size = EXFAT_CLU_TO_B(p_dir->size, sbi); -+ -+ /* update the directory entry */ -+ if (p_dir->dir != sbi->root_dir) { -+ struct buffer_head *bh; -+ -+ ep = exfat_get_dentry(sb, -+ &(ei->dir), ei->entry + 1, &bh, §or); -+ if (!ep) -+ return -EIO; -+ -+ ep->dentry.stream.valid_size = cpu_to_le64(size); -+ ep->dentry.stream.size = ep->dentry.stream.valid_size; -+ ep->dentry.stream.flags = p_dir->flags; -+ exfat_update_bh(sb, bh, IS_DIRSYNC(inode)); -+ brelse(bh); -+ if (exfat_update_dir_chksum(inode, &(ei->dir), -+ ei->entry)) -+ return -EIO; -+ } -+ -+ /* directory inode should be updated in here */ -+ i_size_write(inode, size); -+ EXFAT_I(inode)->i_size_ondisk += sbi->cluster_size; -+ EXFAT_I(inode)->i_size_aligned += sbi->cluster_size; -+ EXFAT_I(inode)->flags = p_dir->flags; -+ inode->i_blocks += 1 << sbi->sect_per_clus_bits; -+ } -+ -+ return dentry; -+} -+ -+/* -+ * Name Resolution Functions : -+ * Zero if it was successful; otherwise nonzero. -+ */ -+static int __exfat_resolve_path(struct inode *inode, const unsigned char *path, -+ struct exfat_chain *p_dir, struct exfat_uni_name *p_uniname, -+ int lookup) -+{ -+ int namelen; -+ int lossy = NLS_NAME_NO_LOSSY; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ -+ /* strip all trailing periods */ -+ namelen = exfat_striptail_len(strlen(path), path); -+ if (!namelen) -+ return -ENOENT; -+ -+ if (strlen(path) > (MAX_NAME_LENGTH * MAX_CHARSET_SIZE)) -+ return -ENAMETOOLONG; -+ -+ /* -+ * strip all leading spaces : -+ * "MS windows 7" supports leading spaces. -+ * So we should skip this preprocessing for compatibility. -+ */ -+ -+ /* file name conversion : -+ * If lookup case, we allow bad-name for compatibility. -+ */ -+ namelen = exfat_nls_to_utf16(sb, path, namelen, p_uniname, -+ &lossy); -+ if (namelen < 0) -+ return namelen; /* return error value */ -+ -+ if ((lossy && !lookup) || !namelen) -+ return -EINVAL; -+ -+ exfat_chain_set(p_dir, ei->start_clu, -+ EXFAT_B_TO_CLU(i_size_read(inode), sbi), ei->flags); -+ -+ return 0; -+} -+ -+static inline int exfat_resolve_path(struct inode *inode, -+ const unsigned char *path, struct exfat_chain *dir, -+ struct exfat_uni_name *uni) -+{ -+ return __exfat_resolve_path(inode, path, dir, uni, 0); -+} -+ -+static inline int exfat_resolve_path_for_lookup(struct inode *inode, -+ const unsigned char *path, struct exfat_chain *dir, -+ struct exfat_uni_name *uni) -+{ -+ return __exfat_resolve_path(inode, path, dir, uni, 1); -+} -+ -+static inline loff_t exfat_make_i_pos(struct exfat_dir_entry *info) -+{ -+ return ((loff_t) info->dir.dir << 32) | (info->entry & 0xffffffff); -+} -+ -+static int exfat_add_entry(struct inode *inode, const char *path, -+ struct exfat_chain *p_dir, unsigned int type, -+ struct exfat_dir_entry *info) -+{ -+ int ret, dentry, num_entries; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_uni_name uniname; -+ struct exfat_chain clu; -+ int clu_size = 0; -+ unsigned int start_clu = EXFAT_FREE_CLUSTER; -+ -+ ret = exfat_resolve_path(inode, path, p_dir, &uniname); -+ if (ret) -+ goto out; -+ -+ num_entries = exfat_calc_num_entries(&uniname); -+ if (num_entries < 0) { -+ ret = num_entries; -+ goto out; -+ } -+ -+ /* exfat_find_empty_entry must be called before alloc_cluster() */ -+ dentry = exfat_find_empty_entry(inode, p_dir, num_entries); -+ if (dentry < 0) { -+ ret = dentry; /* -EIO or -ENOSPC */ -+ goto out; -+ } -+ -+ if (type == TYPE_DIR) { -+ ret = exfat_alloc_new_dir(inode, &clu); -+ if (ret) -+ goto out; -+ start_clu = clu.dir; -+ clu_size = sbi->cluster_size; -+ } -+ -+ /* update the directory entry */ -+ /* fill the dos name directory entry information of the created file. -+ * the first cluster is not determined yet. (0) -+ */ -+ ret = exfat_init_dir_entry(inode, p_dir, dentry, type, -+ start_clu, clu_size); -+ if (ret) -+ goto out; -+ -+ ret = exfat_init_ext_entry(inode, p_dir, dentry, num_entries, &uniname); -+ if (ret) -+ goto out; -+ -+ memcpy(&info->dir, p_dir, sizeof(struct exfat_chain)); -+ info->entry = dentry; -+ info->flags = ALLOC_NO_FAT_CHAIN; -+ info->type = type; -+ -+ if (type == TYPE_FILE) { -+ info->attr = ATTR_ARCHIVE; -+ info->start_clu = EXFAT_EOF_CLUSTER; -+ info->size = 0; -+ info->num_subdirs = 0; -+ } else { -+ int count; -+ struct exfat_chain cdir; -+ -+ info->attr = ATTR_SUBDIR; -+ info->start_clu = start_clu; -+ info->size = clu_size; -+ -+ exfat_chain_set(&cdir, info->start_clu, -+ EXFAT_B_TO_CLU(info->size, sbi), info->flags); -+ count = exfat_count_dir_entries(sb, &cdir); -+ if (count < 0) -+ return -EIO; -+ info->num_subdirs = count + EXFAT_MIN_SUBDIR; -+ } -+ memset(&info->crtime, 0, sizeof(info->crtime)); -+ memset(&info->mtime, 0, sizeof(info->mtime)); -+ memset(&info->atime, 0, sizeof(info->atime)); -+out: -+ return ret; -+} -+ -+static int exfat_create(struct inode *dir, struct dentry *dentry, umode_t mode, -+ bool excl) -+{ -+ struct super_block *sb = dir->i_sb; -+ struct inode *inode; -+ struct exfat_chain cdir; -+ struct exfat_dir_entry info; -+ loff_t i_pos; -+ int err; -+ -+ mutex_lock(&EXFAT_SB(sb)->s_lock); -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ err = exfat_add_entry(dir, dentry->d_name.name, &cdir, TYPE_FILE, -+ &info); -+ exfat_set_vol_flags(sb, VOL_CLEAN); -+ if (err) -+ goto unlock; -+ -+ inode_inc_iversion(dir); -+ dir->i_ctime = dir->i_mtime = current_time(dir); -+ if (IS_DIRSYNC(dir)) -+ exfat_sync_inode(dir); -+ else -+ mark_inode_dirty(dir); -+ -+ i_pos = exfat_make_i_pos(&info); -+ inode = exfat_build_inode(sb, &info, i_pos); -+ if (IS_ERR(inode)) -+ goto unlock; -+ -+ inode_inc_iversion(inode); -+ inode->i_mtime = inode->i_atime = inode->i_ctime = -+ EXFAT_I(inode)->i_crtime = current_time(inode); -+ /* timestamp is already written, so mark_inode_dirty() is unneeded. */ -+ -+ d_instantiate(dentry, inode); -+unlock: -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ return err; -+} -+ -+/* lookup a file */ -+static int exfat_find(struct inode *dir, struct qstr *qname, -+ struct exfat_dir_entry *info) -+{ -+ int ret, dentry, num_entries, count; -+ struct exfat_chain cdir; -+ struct exfat_uni_name uni_name; -+ struct exfat_dentry *ep, *ep2; -+ struct exfat_entry_set_cache *es = NULL; -+ struct super_block *sb = dir->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(dir); -+ -+ if (qname->len == 0) -+ return -ENOENT; -+ -+ /* check the validity of directory name in the given pathname */ -+ ret = exfat_resolve_path_for_lookup(dir, qname->name, &cdir, &uni_name); -+ if (ret) -+ return ret; -+ -+ num_entries = exfat_calc_num_entries(&uni_name); -+ if (num_entries < 0) -+ return num_entries; -+ -+ /* check the validation of hint_stat and initialize it if required */ -+ if (ei->version != (inode_peek_iversion_raw(dir) & 0xffffffff)) { -+ ei->hint_stat.clu = cdir.dir; -+ ei->hint_stat.eidx = 0; -+ ei->version = (inode_peek_iversion_raw(dir) & 0xffffffff); -+ ei->hint_femp.eidx = EXFAT_HINT_NONE; -+ } -+ -+ /* search the file name for directories */ -+ dentry = exfat_find_dir_entry(sb, ei, &cdir, &uni_name, -+ num_entries, TYPE_ALL); -+ -+ if ((dentry < 0) && (dentry != -EEXIST)) -+ return dentry; /* -error value */ -+ -+ memcpy(&info->dir, &cdir.dir, sizeof(struct exfat_chain)); -+ info->entry = dentry; -+ info->num_subdirs = 0; -+ -+ /* root directory itself */ -+ if (unlikely(dentry == -EEXIST)) { -+ int num_clu = 0; -+ -+ info->type = TYPE_DIR; -+ info->attr = ATTR_SUBDIR; -+ info->flags = ALLOC_FAT_CHAIN; -+ info->start_clu = sbi->root_dir; -+ memset(&info->crtime, 0, sizeof(info->crtime)); -+ memset(&info->mtime, 0, sizeof(info->mtime)); -+ memset(&info->atime, 0, sizeof(info->atime)); -+ -+ exfat_chain_set(&cdir, sbi->root_dir, 0, ALLOC_FAT_CHAIN); -+ if (exfat_count_num_clusters(sb, &cdir, &num_clu)) -+ return -EIO; -+ info->size = num_clu << sbi->cluster_size_bits; -+ -+ count = exfat_count_dir_entries(sb, &cdir); -+ if (count < 0) -+ return -EIO; -+ -+ info->num_subdirs = count; -+ } else { -+ es = exfat_get_dentry_set(sb, &cdir, dentry, ES_2_ENTRIES, &ep); -+ if (!es) -+ return -EIO; -+ ep2 = ep + 1; -+ -+ info->type = exfat_get_entry_type(ep); -+ info->attr = le16_to_cpu(ep->dentry.file.attr); -+ info->size = le64_to_cpu(ep2->dentry.stream.valid_size); -+ if ((info->type == TYPE_FILE) && (info->size == 0)) { -+ info->flags = ALLOC_NO_FAT_CHAIN; -+ info->start_clu = EXFAT_EOF_CLUSTER; -+ } else { -+ info->flags = ep2->dentry.stream.flags; -+ info->start_clu = -+ le32_to_cpu(ep2->dentry.stream.start_clu); -+ } -+ -+ if (ei->start_clu == EXFAT_FREE_CLUSTER) { -+ exfat_fs_error(sb, -+ "non-zero size file starts with zero cluster (size : %llu, p_dir : %u, entry : 0x%08x)", -+ i_size_read(dir), ei->dir.dir, ei->entry); -+ return -EIO; -+ } -+ -+ exfat_get_entry_time(sbi, &info->crtime, -+ ep->dentry.file.create_tz, -+ ep->dentry.file.create_time, -+ ep->dentry.file.create_date, -+ ep->dentry.file.create_time_ms); -+ exfat_get_entry_time(sbi, &info->mtime, -+ ep->dentry.file.modify_tz, -+ ep->dentry.file.modify_time, -+ ep->dentry.file.modify_date, -+ ep->dentry.file.modify_time_ms); -+ exfat_get_entry_time(sbi, &info->atime, -+ ep->dentry.file.access_tz, -+ ep->dentry.file.access_time, -+ ep->dentry.file.access_date, -+ 0); -+ kfree(es); -+ -+ if (info->type == TYPE_DIR) { -+ exfat_chain_set(&cdir, info->start_clu, -+ EXFAT_B_TO_CLU(info->size, sbi), info->flags); -+ count = exfat_count_dir_entries(sb, &cdir); -+ if (count < 0) -+ return -EIO; -+ -+ info->num_subdirs = count + EXFAT_MIN_SUBDIR; -+ } -+ } -+ return 0; -+} -+ -+static int exfat_d_anon_disconn(struct dentry *dentry) -+{ -+ return IS_ROOT(dentry) && (dentry->d_flags & DCACHE_DISCONNECTED); -+} -+ -+static struct dentry *exfat_lookup(struct inode *dir, struct dentry *dentry, -+ unsigned int flags) -+{ -+ struct super_block *sb = dir->i_sb; -+ struct inode *inode; -+ struct dentry *alias; -+ struct exfat_dir_entry info; -+ int err; -+ loff_t i_pos; -+ mode_t i_mode; -+ -+ mutex_lock(&EXFAT_SB(sb)->s_lock); -+ err = exfat_find(dir, &dentry->d_name, &info); -+ if (err) { -+ if (err == -ENOENT) { -+ inode = NULL; -+ goto out; -+ } -+ goto unlock; -+ } -+ -+ i_pos = exfat_make_i_pos(&info); -+ inode = exfat_build_inode(sb, &info, i_pos); -+ if (IS_ERR(inode)) { -+ err = PTR_ERR(inode); -+ goto unlock; -+ } -+ -+ i_mode = inode->i_mode; -+ alias = d_find_alias(inode); -+ -+ /* -+ * Checking "alias->d_parent == dentry->d_parent" to make sure -+ * FS is not corrupted (especially double linked dir). -+ */ -+ if (alias && alias->d_parent == dentry->d_parent && -+ !exfat_d_anon_disconn(alias)) { -+ -+ /* -+ * Unhashed alias is able to exist because of revalidate() -+ * called by lookup_fast. You can easily make this status -+ * by calling create and lookup concurrently -+ * In such case, we reuse an alias instead of new dentry -+ */ -+ if (d_unhashed(alias)) { -+ WARN_ON(alias->d_name.hash_len != -+ dentry->d_name.hash_len); -+ exfat_msg(sb, KERN_INFO, -+ "rehashed a dentry(%p) in read lookup", alias); -+ d_drop(dentry); -+ d_rehash(alias); -+ } else if (!S_ISDIR(i_mode)) { -+ /* -+ * This inode has non anonymous-DCACHE_DISCONNECTED -+ * dentry. This means, the user did ->lookup() by an -+ * another name (longname vs 8.3 alias of it) in past. -+ * -+ * Switch to new one for reason of locality if possible. -+ */ -+ d_move(alias, dentry); -+ } -+ iput(inode); -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ return alias; -+ } -+ dput(alias); -+out: -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ if (!inode) -+ exfat_d_version_set(dentry, inode_query_iversion(dir)); -+ -+ return d_splice_alias(inode, dentry); -+unlock: -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ return ERR_PTR(err); -+} -+ -+/* remove an entry, BUT don't truncate */ -+static int exfat_unlink(struct inode *dir, struct dentry *dentry) -+{ -+ struct exfat_chain cdir; -+ struct exfat_dentry *ep; -+ struct super_block *sb = dir->i_sb; -+ struct inode *inode = dentry->d_inode; -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct buffer_head *bh; -+ sector_t sector; -+ int num_entries, entry, err = 0; -+ -+ mutex_lock(&EXFAT_SB(sb)->s_lock); -+ exfat_chain_dup(&cdir, &ei->dir); -+ entry = ei->entry; -+ if (ei->dir.dir == DIR_DELETED) { -+ exfat_msg(sb, KERN_ERR, "abnormal access to deleted dentry"); -+ err = -ENOENT; -+ goto unlock; -+ } -+ -+ ep = exfat_get_dentry(sb, &cdir, entry, &bh, §or); -+ if (!ep) { -+ err = -EIO; -+ goto unlock; -+ } -+ num_entries = exfat_count_ext_entries(sb, &cdir, entry, ep); -+ if (num_entries < 0) { -+ err = -EIO; -+ brelse(bh); -+ goto unlock; -+ } -+ num_entries++; -+ brelse(bh); -+ -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ /* update the directory entry */ -+ if (exfat_remove_entries(dir, &cdir, entry, 0, num_entries)) { -+ err = -EIO; -+ goto unlock; -+ } -+ -+ /* This doesn't modify ei */ -+ ei->dir.dir = DIR_DELETED; -+ exfat_set_vol_flags(sb, VOL_CLEAN); -+ -+ inode_inc_iversion(dir); -+ dir->i_mtime = dir->i_atime = current_time(dir); -+ if (IS_DIRSYNC(dir)) -+ exfat_sync_inode(dir); -+ else -+ mark_inode_dirty(dir); -+ -+ clear_nlink(inode); -+ inode->i_mtime = inode->i_atime = current_time(inode); -+ exfat_unhash_inode(inode); -+ exfat_d_version_set(dentry, inode_query_iversion(dir)); -+unlock: -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ return err; -+} -+ -+static int exfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) -+{ -+ struct super_block *sb = dir->i_sb; -+ struct inode *inode; -+ struct exfat_dir_entry info; -+ struct exfat_chain cdir; -+ loff_t i_pos; -+ int err; -+ -+ mutex_lock(&EXFAT_SB(sb)->s_lock); -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ err = exfat_add_entry(dir, dentry->d_name.name, &cdir, TYPE_DIR, -+ &info); -+ exfat_set_vol_flags(sb, VOL_CLEAN); -+ if (err) -+ goto unlock; -+ -+ inode_inc_iversion(dir); -+ dir->i_ctime = dir->i_mtime = current_time(dir); -+ if (IS_DIRSYNC(dir)) -+ exfat_sync_inode(dir); -+ else -+ mark_inode_dirty(dir); -+ inc_nlink(dir); -+ -+ i_pos = exfat_make_i_pos(&info); -+ inode = exfat_build_inode(sb, &info, i_pos); -+ if (IS_ERR(inode)) { -+ err = PTR_ERR(inode); -+ goto unlock; -+ } -+ -+ inode_inc_iversion(inode); -+ inode->i_mtime = inode->i_atime = inode->i_ctime = -+ EXFAT_I(inode)->i_crtime = current_time(inode); -+ /* timestamp is already written, so mark_inode_dirty() is unneeded. */ -+ -+ d_instantiate(dentry, inode); -+ -+unlock: -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ return err; -+} -+ -+static int exfat_check_dir_empty(struct super_block *sb, -+ struct exfat_chain *p_dir) -+{ -+ int i, dentries_per_clu; -+ unsigned int type; -+ struct exfat_chain clu; -+ struct exfat_dentry *ep; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct buffer_head *bh; -+ -+ dentries_per_clu = sbi->dentries_per_clu; -+ -+ exfat_chain_dup(&clu, p_dir); -+ -+ while (clu.dir != EXFAT_EOF_CLUSTER) { -+ for (i = 0; i < dentries_per_clu; i++) { -+ ep = exfat_get_dentry(sb, &clu, i, &bh, NULL); -+ if (!ep) -+ return -EIO; -+ type = exfat_get_entry_type(ep); -+ brelse(bh); -+ if (type == TYPE_UNUSED) -+ return 0; -+ -+ if (type != TYPE_FILE && type != TYPE_DIR) -+ continue; -+ -+ return -ENOTEMPTY; -+ } -+ -+ if (clu.flags == ALLOC_NO_FAT_CHAIN) { -+ if (--clu.size > 0) -+ clu.dir++; -+ else -+ clu.dir = EXFAT_EOF_CLUSTER; -+ } else { -+ if (exfat_get_next_cluster(sb, &(clu.dir))) -+ return -EIO; -+ } -+ } -+ -+ return 0; -+} -+ -+static int exfat_rmdir(struct inode *dir, struct dentry *dentry) -+{ -+ struct inode *inode = dentry->d_inode; -+ struct exfat_dentry *ep; -+ struct exfat_chain cdir, clu_to_free; -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct buffer_head *bh; -+ sector_t sector; -+ int num_entries, entry, err; -+ -+ mutex_lock(&EXFAT_SB(inode->i_sb)->s_lock); -+ -+ exfat_chain_dup(&cdir, &ei->dir); -+ entry = ei->entry; -+ -+ if (ei->dir.dir == DIR_DELETED) { -+ exfat_msg(sb, KERN_ERR, "abnormal access to deleted dentry"); -+ err = -ENOENT; -+ goto unlock; -+ } -+ -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ exfat_chain_set(&clu_to_free, ei->start_clu, -+ EXFAT_B_TO_CLU_ROUND_UP(i_size_read(inode), sbi), ei->flags); -+ -+ err = exfat_check_dir_empty(sb, &clu_to_free); -+ if (err) { -+ if (err == -EIO) -+ exfat_msg(sb, KERN_ERR, -+ "failed to exfat_check_dir_empty : err(%d)", -+ err); -+ goto unlock; -+ } -+ -+ ep = exfat_get_dentry(sb, &cdir, entry, &bh, §or); -+ if (!ep) { -+ err = -EIO; -+ goto unlock; -+ } -+ -+ num_entries = exfat_count_ext_entries(sb, &cdir, entry, ep); -+ if (num_entries < 0) { -+ err = -EIO; -+ brelse(bh); -+ goto unlock; -+ } -+ num_entries++; -+ brelse(bh); -+ -+ err = exfat_remove_entries(dir, &cdir, entry, 0, num_entries); -+ if (err) { -+ exfat_msg(sb, KERN_ERR, -+ "failed to exfat_remove_entries : err(%d)", -+ err); -+ goto unlock; -+ } -+ ei->dir.dir = DIR_DELETED; -+ exfat_set_vol_flags(sb, VOL_CLEAN); -+ -+ inode_inc_iversion(dir); -+ dir->i_mtime = dir->i_atime = current_time(dir); -+ if (IS_DIRSYNC(dir)) -+ exfat_sync_inode(dir); -+ else -+ mark_inode_dirty(dir); -+ drop_nlink(dir); -+ -+ clear_nlink(inode); -+ inode->i_mtime = inode->i_atime = current_time(inode); -+ exfat_unhash_inode(inode); -+ exfat_d_version_set(dentry, inode_query_iversion(dir)); -+unlock: -+ mutex_unlock(&EXFAT_SB(inode->i_sb)->s_lock); -+ return err; -+} -+ -+static int exfat_rename_file(struct inode *inode, struct exfat_chain *p_dir, -+ int oldentry, struct exfat_uni_name *p_uniname, -+ struct exfat_inode_info *ei) -+{ -+ int ret, num_old_entries, num_new_entries; -+ sector_t sector_old, sector_new; -+ struct exfat_dentry *epold, *epnew; -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh, *old_bh; -+ int sync = IS_DIRSYNC(inode); -+ -+ epold = exfat_get_dentry(sb, p_dir, oldentry, &old_bh, §or_old); -+ if (!epold) -+ return -EIO; -+ -+ num_old_entries = exfat_count_ext_entries(sb, p_dir, oldentry, epold); -+ if (num_old_entries < 0) -+ return -EIO; -+ num_old_entries++; -+ -+ num_new_entries = exfat_calc_num_entries(p_uniname); -+ if (num_new_entries < 0) -+ return num_new_entries; -+ -+ if (num_old_entries < num_new_entries) { -+ int newentry; -+ -+ newentry = -+ exfat_find_empty_entry(inode, p_dir, num_new_entries); -+ if (newentry < 0) -+ return newentry; /* -EIO or -ENOSPC */ -+ -+ epnew = exfat_get_dentry(sb, p_dir, newentry, &new_bh, -+ §or_new); -+ if (!epnew) -+ return -EIO; -+ -+ memcpy(epnew, epold, DENTRY_SIZE); -+ if (exfat_get_entry_type(epnew) == TYPE_FILE) { -+ epnew->dentry.file.attr |= cpu_to_le16(ATTR_ARCHIVE); -+ ei->attr |= ATTR_ARCHIVE; -+ } -+ exfat_update_bh(sb, new_bh, sync); -+ brelse(old_bh); -+ brelse(new_bh); -+ -+ epold = exfat_get_dentry(sb, p_dir, oldentry + 1, &old_bh, -+ §or_old); -+ epnew = exfat_get_dentry(sb, p_dir, newentry + 1, &new_bh, -+ §or_new); -+ if (!epold || !epnew) -+ return -EIO; -+ -+ memcpy(epnew, epold, DENTRY_SIZE); -+ exfat_update_bh(sb, new_bh, sync); -+ brelse(old_bh); -+ brelse(new_bh); -+ -+ ret = exfat_init_ext_entry(inode, p_dir, newentry, -+ num_new_entries, p_uniname); -+ if (ret) -+ return ret; -+ -+ exfat_remove_entries(inode, p_dir, oldentry, 0, -+ num_old_entries); -+ ei->entry = newentry; -+ } else { -+ if (exfat_get_entry_type(epold) == TYPE_FILE) { -+ epold->dentry.file.attr |= cpu_to_le16(ATTR_ARCHIVE); -+ ei->attr |= ATTR_ARCHIVE; -+ } -+ exfat_update_bh(sb, old_bh, sync); -+ brelse(old_bh); -+ ret = exfat_init_ext_entry(inode, p_dir, oldentry, -+ num_new_entries, p_uniname); -+ if (ret) -+ return ret; -+ -+ exfat_remove_entries(inode, p_dir, oldentry, num_new_entries, -+ num_old_entries); -+ } -+ return 0; -+} -+ -+static int exfat_move_file(struct inode *inode, struct exfat_chain *p_olddir, -+ int oldentry, struct exfat_chain *p_newdir, -+ struct exfat_uni_name *p_uniname, struct exfat_inode_info *ei) -+{ -+ int ret, newentry, num_new_entries, num_old_entries; -+ sector_t sector_mov, sector_new; -+ struct exfat_dentry *epmov, *epnew; -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *mov_bh, *new_bh; -+ -+ epmov = exfat_get_dentry(sb, p_olddir, oldentry, &mov_bh, §or_mov); -+ if (!epmov) -+ return -EIO; -+ -+ /* check if the source and target directory is the same */ -+ if (exfat_get_entry_type(epmov) == TYPE_DIR && -+ le32_to_cpu(epmov->dentry.stream.start_clu) == p_newdir->dir) -+ return -EINVAL; -+ -+ num_old_entries = exfat_count_ext_entries(sb, p_olddir, oldentry, -+ epmov); -+ if (num_old_entries < 0) -+ return -EIO; -+ num_old_entries++; -+ -+ num_new_entries = exfat_calc_num_entries(p_uniname); -+ if (num_new_entries < 0) -+ return num_new_entries; -+ -+ newentry = exfat_find_empty_entry(inode, p_newdir, num_new_entries); -+ if (newentry < 0) -+ return newentry; /* -EIO or -ENOSPC */ -+ -+ epnew = exfat_get_dentry(sb, p_newdir, newentry, &new_bh, §or_new); -+ if (!epnew) -+ return -EIO; -+ -+ memcpy(epnew, epmov, DENTRY_SIZE); -+ if (exfat_get_entry_type(epnew) == TYPE_FILE) { -+ epnew->dentry.file.attr |= cpu_to_le16(ATTR_ARCHIVE); -+ ei->attr |= ATTR_ARCHIVE; -+ } -+ exfat_update_bh(sb, new_bh, IS_DIRSYNC(inode)); -+ brelse(mov_bh); -+ brelse(new_bh); -+ -+ epmov = exfat_get_dentry(sb, p_olddir, oldentry + 1, &mov_bh, -+ §or_mov); -+ epnew = exfat_get_dentry(sb, p_newdir, newentry + 1, &new_bh, -+ §or_new); -+ if (!epmov || !epnew) -+ return -EIO; -+ -+ memcpy(epnew, epmov, DENTRY_SIZE); -+ exfat_update_bh(sb, new_bh, IS_DIRSYNC(inode)); -+ brelse(mov_bh); -+ brelse(new_bh); -+ -+ ret = exfat_init_ext_entry(inode, p_newdir, newentry, num_new_entries, -+ p_uniname); -+ if (ret) -+ return ret; -+ -+ exfat_remove_entries(inode, p_olddir, oldentry, 0, num_old_entries); -+ -+ exfat_chain_set(&ei->dir, p_newdir->dir, p_newdir->size, -+ p_newdir->flags); -+ -+ ei->entry = newentry; -+ return 0; -+} -+ -+static void exfat_update_parent_info(struct exfat_inode_info *ei, -+ struct inode *parent_inode) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(parent_inode->i_sb); -+ struct exfat_inode_info *parent_ei = EXFAT_I(parent_inode); -+ loff_t parent_isize = i_size_read(parent_inode); -+ -+ /* -+ * the problem that struct exfat_inode_info caches wrong parent info. -+ * -+ * because of flag-mismatch of ei->dir, -+ * there is abnormal traversing cluster chain. -+ */ -+ if (unlikely(parent_ei->flags != ei->dir.flags || -+ parent_isize != EXFAT_CLU_TO_B(ei->dir.size, sbi) || -+ parent_ei->start_clu != ei->dir.dir)) { -+ exfat_chain_set(&ei->dir, parent_ei->start_clu, -+ EXFAT_B_TO_CLU_ROUND_UP(parent_isize, sbi), -+ parent_ei->flags); -+ } -+} -+ -+/* rename or move a old file into a new file */ -+static int __exfat_rename(struct inode *old_parent_inode, -+ struct exfat_inode_info *ei, struct inode *new_parent_inode, -+ struct dentry *new_dentry) -+{ -+ int ret; -+ int dentry; -+ struct exfat_chain olddir, newdir; -+ struct exfat_chain *p_dir = NULL; -+ struct exfat_uni_name uni_name; -+ struct exfat_dentry *ep; -+ struct super_block *sb = old_parent_inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ const unsigned char *new_path = new_dentry->d_name.name; -+ struct inode *new_inode = new_dentry->d_inode; -+ int num_entries; -+ struct exfat_inode_info *new_ei = NULL; -+ unsigned int new_entry_type = TYPE_UNUSED; -+ int new_entry = 0; -+ struct buffer_head *old_bh, *new_bh = NULL; -+ -+ /* check the validity of pointer parameters */ -+ if (new_path == NULL || strlen(new_path) == 0) -+ return -EINVAL; -+ -+ if (ei->dir.dir == DIR_DELETED) { -+ exfat_msg(sb, KERN_ERR, -+ "abnormal access to deleted source dentry"); -+ return -ENOENT; -+ } -+ -+ exfat_update_parent_info(ei, old_parent_inode); -+ -+ exfat_chain_dup(&olddir, &ei->dir); -+ dentry = ei->entry; -+ -+ ep = exfat_get_dentry(sb, &olddir, dentry, &old_bh, NULL); -+ if (!ep) { -+ ret = -EIO; -+ goto out; -+ } -+ brelse(old_bh); -+ -+ /* check whether new dir is existing directory and empty */ -+ if (new_inode) { -+ ret = -EIO; -+ new_ei = EXFAT_I(new_inode); -+ -+ if (new_ei->dir.dir == DIR_DELETED) { -+ exfat_msg(sb, KERN_ERR, -+ "abnormal access to deleted target dentry"); -+ goto out; -+ } -+ -+ exfat_update_parent_info(new_ei, new_parent_inode); -+ -+ p_dir = &(new_ei->dir); -+ new_entry = new_ei->entry; -+ ep = exfat_get_dentry(sb, p_dir, new_entry, &new_bh, NULL); -+ if (!ep) -+ goto out; -+ -+ new_entry_type = exfat_get_entry_type(ep); -+ brelse(new_bh); -+ -+ /* if new_inode exists, update ei */ -+ if (new_entry_type == TYPE_DIR) { -+ struct exfat_chain new_clu; -+ -+ new_clu.dir = new_ei->start_clu; -+ new_clu.size = -+ EXFAT_B_TO_CLU_ROUND_UP(i_size_read(new_inode), -+ sbi); -+ new_clu.flags = new_ei->flags; -+ -+ ret = exfat_check_dir_empty(sb, &new_clu); -+ if (ret) -+ goto out; -+ } -+ } -+ -+ /* check the validity of directory name in the given new pathname */ -+ ret = exfat_resolve_path(new_parent_inode, new_path, &newdir, -+ &uni_name); -+ if (ret) -+ goto out; -+ -+ exfat_set_vol_flags(sb, VOL_DIRTY); -+ -+ if (olddir.dir == newdir.dir) -+ ret = exfat_rename_file(new_parent_inode, &olddir, dentry, -+ &uni_name, ei); -+ else -+ ret = exfat_move_file(new_parent_inode, &olddir, dentry, -+ &newdir, &uni_name, ei); -+ -+ if (!ret && new_inode) { -+ /* delete entries of new_dir */ -+ ep = exfat_get_dentry(sb, p_dir, new_entry, &new_bh, NULL); -+ if (!ep) { -+ ret = -EIO; -+ goto del_out; -+ } -+ -+ num_entries = exfat_count_ext_entries(sb, p_dir, new_entry, ep); -+ if (num_entries < 0) { -+ ret = -EIO; -+ goto del_out; -+ } -+ brelse(new_bh); -+ -+ if (exfat_remove_entries(new_inode, p_dir, new_entry, 0, -+ num_entries + 1)) { -+ ret = -EIO; -+ goto del_out; -+ } -+ -+ /* Free the clusters if new_inode is a dir(as if exfat_rmdir) */ -+ if (new_entry_type == TYPE_DIR) { -+ /* new_ei, new_clu_to_free */ -+ struct exfat_chain new_clu_to_free; -+ -+ exfat_chain_set(&new_clu_to_free, new_ei->start_clu, -+ EXFAT_B_TO_CLU_ROUND_UP(i_size_read(new_inode), -+ sbi), new_ei->flags); -+ -+ if (exfat_free_cluster(new_inode, &new_clu_to_free)) { -+ /* just set I/O error only */ -+ ret = -EIO; -+ } -+ -+ i_size_write(new_inode, 0); -+ new_ei->start_clu = EXFAT_EOF_CLUSTER; -+ new_ei->flags = ALLOC_NO_FAT_CHAIN; -+ } -+del_out: -+ /* Update new_inode ei -+ * Prevent syncing removed new_inode -+ * (new_ei is already initialized above code ("if (new_inode)") -+ */ -+ new_ei->dir.dir = DIR_DELETED; -+ } -+ exfat_set_vol_flags(sb, VOL_CLEAN); -+out: -+ return ret; -+} -+ -+static int exfat_rename(struct inode *old_dir, struct dentry *old_dentry, -+ struct inode *new_dir, struct dentry *new_dentry, -+ unsigned int flags) -+{ -+ struct inode *old_inode, *new_inode; -+ struct super_block *sb = old_dir->i_sb; -+ loff_t i_pos; -+ int err; -+ -+ /* -+ * The VFS already checks for existence, so for local filesystems -+ * the RENAME_NOREPLACE implementation is equivalent to plain rename. -+ * Don't support any other flags -+ */ -+ if (flags & ~RENAME_NOREPLACE) -+ return -EINVAL; -+ -+ mutex_lock(&EXFAT_SB(sb)->s_lock); -+ old_inode = old_dentry->d_inode; -+ new_inode = new_dentry->d_inode; -+ -+ err = __exfat_rename(old_dir, EXFAT_I(old_inode), new_dir, new_dentry); -+ if (err) -+ goto unlock; -+ -+ inode_inc_iversion(new_dir); -+ new_dir->i_ctime = new_dir->i_mtime = new_dir->i_atime = -+ EXFAT_I(new_dir)->i_crtime = current_time(new_dir); -+ if (IS_DIRSYNC(new_dir)) -+ exfat_sync_inode(new_dir); -+ else -+ mark_inode_dirty(new_dir); -+ -+ i_pos = ((loff_t)EXFAT_I(old_inode)->dir.dir << 32) | -+ (EXFAT_I(old_inode)->entry & 0xffffffff); -+ exfat_unhash_inode(old_inode); -+ exfat_hash_inode(old_inode, i_pos); -+ if (IS_DIRSYNC(new_dir)) -+ exfat_sync_inode(old_inode); -+ else -+ mark_inode_dirty(old_inode); -+ -+ if (S_ISDIR(old_inode->i_mode) && old_dir != new_dir) { -+ drop_nlink(old_dir); -+ if (!new_inode) -+ inc_nlink(new_dir); -+ } -+ -+ inode_inc_iversion(old_dir); -+ old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir); -+ if (IS_DIRSYNC(old_dir)) -+ exfat_sync_inode(old_dir); -+ else -+ mark_inode_dirty(old_dir); -+ -+ if (new_inode) { -+ exfat_unhash_inode(new_inode); -+ -+ /* skip drop_nlink if new_inode already has been dropped */ -+ if (new_inode->i_nlink) { -+ drop_nlink(new_inode); -+ if (S_ISDIR(new_inode->i_mode)) -+ drop_nlink(new_inode); -+ } else { -+ exfat_msg(sb, KERN_WARNING, -+ "abnormal access to an inode dropped"); -+ WARN_ON(new_inode->i_nlink == 0); -+ } -+ new_inode->i_ctime = EXFAT_I(new_inode)->i_crtime = -+ current_time(new_inode); -+ } -+ -+unlock: -+ mutex_unlock(&EXFAT_SB(sb)->s_lock); -+ return err; -+} -+ -+const struct inode_operations exfat_dir_inode_operations = { -+ .create = exfat_create, -+ .lookup = exfat_lookup, -+ .unlink = exfat_unlink, -+ .mkdir = exfat_mkdir, -+ .rmdir = exfat_rmdir, -+ .rename = exfat_rename, -+ .setattr = exfat_setattr, -+ .getattr = exfat_getattr, -+}; --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-misc-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-misc-operations.patch deleted file mode 100644 index 5d461d19..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-misc-operations.patch +++ /dev/null @@ -1,193 +0,0 @@ -From 772b29cca528fcb21374bb3e597d848779938d16 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:40 +0900 -Subject: [PATCH 09/14] exfat: add misc operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of misc operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Arnd Bergmann -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/misc.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 163 insertions(+) - create mode 100644 fs/exfat/misc.c - -diff --git a/fs/exfat/misc.c b/fs/exfat/misc.c -new file mode 100644 -index 000000000000..14a3300848f6 ---- /dev/null -+++ b/fs/exfat/misc.c -@@ -0,0 +1,163 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Written 1992,1993 by Werner Almesberger -+ * 22/11/2000 - Fixed fat_date_unix2dos for dates earlier than 01/01/1980 -+ * and date_dos2unix for date==0 by Igor Zhbanov(bsg@uniyar.ac.ru) -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+/* -+ * exfat_fs_error reports a file system problem that might indicate fa data -+ * corruption/inconsistency. Depending on 'errors' mount option the -+ * panic() is called, or error message is printed FAT and nothing is done, -+ * or filesystem is remounted read-only (default behavior). -+ * In case the file system is remounted read-only, it can be made writable -+ * again by remounting it. -+ */ -+void __exfat_fs_error(struct super_block *sb, int report, const char *fmt, ...) -+{ -+ struct exfat_mount_options *opts = &EXFAT_SB(sb)->options; -+ va_list args; -+ struct va_format vaf; -+ -+ if (report) { -+ va_start(args, fmt); -+ vaf.fmt = fmt; -+ vaf.va = &args; -+ exfat_msg(sb, KERN_ERR, "error, %pV\n", &vaf); -+ va_end(args); -+ } -+ -+ if (opts->errors == EXFAT_ERRORS_PANIC) { -+ panic("exFAT-fs (%s): fs panic from previous error\n", -+ sb->s_id); -+ } else if (opts->errors == EXFAT_ERRORS_RO && !sb_rdonly(sb)) { -+ sb->s_flags |= SB_RDONLY; -+ exfat_msg(sb, KERN_ERR, "Filesystem has been set read-only"); -+ } -+} -+ -+/* -+ * exfat_msg() - print preformated EXFAT specific messages. -+ * All logs except what uses exfat_fs_error() should be written by exfat_msg() -+ */ -+void exfat_msg(struct super_block *sb, const char *level, const char *fmt, ...) -+{ -+ struct va_format vaf; -+ va_list args; -+ -+ va_start(args, fmt); -+ vaf.fmt = fmt; -+ vaf.va = &args; -+ /* level means KERN_ pacility level */ -+ printk("%sexFAT-fs (%s): %pV\n", level, sb->s_id, &vaf); -+ va_end(args); -+} -+ -+#define SECS_PER_MIN (60) -+#define TIMEZONE_SEC(x) ((x) * 15 * SECS_PER_MIN) -+ -+static void exfat_adjust_tz(struct timespec64 *ts, u8 tz_off) -+{ -+ if (tz_off <= 0x3F) -+ ts->tv_sec -= TIMEZONE_SEC(tz_off); -+ else /* 0x40 <= (tz_off & 0x7F) <=0x7F */ -+ ts->tv_sec += TIMEZONE_SEC(0x80 - tz_off); -+} -+ -+/* Convert a EXFAT time/date pair to a UNIX date (seconds since 1 1 70). */ -+void exfat_get_entry_time(struct exfat_sb_info *sbi, struct timespec64 *ts, -+ u8 tz, __le16 time, __le16 date, u8 time_ms) -+{ -+ u16 t = le16_to_cpu(time); -+ u16 d = le16_to_cpu(date); -+ -+ ts->tv_sec = mktime64(1980 + (d >> 9), d >> 5 & 0x000F, d & 0x001F, -+ t >> 11, (t >> 5) & 0x003F, (t & 0x001F) << 1); -+ -+ -+ /* time_ms field represent 0 ~ 199(1990 ms) */ -+ if (time_ms) { -+ ts->tv_sec += time_ms / 100; -+ ts->tv_nsec = (time_ms % 100) * 10 * NSEC_PER_MSEC; -+ } -+ -+ if (tz & EXFAT_TZ_VALID) -+ /* Adjust timezone to UTC0. */ -+ exfat_adjust_tz(ts, tz & ~EXFAT_TZ_VALID); -+ else -+ /* Convert from local time to UTC using time_offset. */ -+ ts->tv_sec -= sbi->options.time_offset * SECS_PER_MIN; -+} -+ -+/* Convert linear UNIX date to a EXFAT time/date pair. */ -+void exfat_set_entry_time(struct exfat_sb_info *sbi, struct timespec64 *ts, -+ u8 *tz, __le16 *time, __le16 *date, u8 *time_ms) -+{ -+ struct tm tm; -+ u16 t, d; -+ -+ time64_to_tm(ts->tv_sec, 0, &tm); -+ t = (tm.tm_hour << 11) | (tm.tm_min << 5) | (tm.tm_sec >> 1); -+ d = ((tm.tm_year - 80) << 9) | ((tm.tm_mon + 1) << 5) | tm.tm_mday; -+ -+ *time = cpu_to_le16(t); -+ *date = cpu_to_le16(d); -+ -+ /* time_ms field represent 0 ~ 199(1990 ms) */ -+ if (time_ms) -+ *time_ms = (tm.tm_sec & 1) * 100 + -+ ts->tv_nsec / (10 * NSEC_PER_MSEC); -+ -+ /* -+ * Record 00h value for OffsetFromUtc field and 1 value for OffsetValid -+ * to indicate that local time and UTC are the same. -+ */ -+ *tz = EXFAT_TZ_VALID; -+} -+ -+unsigned short exfat_calc_chksum_2byte(void *data, int len, -+ unsigned short chksum, int type) -+{ -+ int i; -+ unsigned char *c = (unsigned char *)data; -+ -+ for (i = 0; i < len; i++, c++) { -+ if (((i == 2) || (i == 3)) && (type == CS_DIR_ENTRY)) -+ continue; -+ chksum = (((chksum & 1) << 15) | ((chksum & 0xFFFE) >> 1)) + -+ (unsigned short)*c; -+ } -+ return chksum; -+} -+ -+void exfat_update_bh(struct super_block *sb, struct buffer_head *bh, int sync) -+{ -+ set_bit(EXFAT_SB_DIRTY, &EXFAT_SB(sb)->s_state); -+ set_buffer_uptodate(bh); -+ mark_buffer_dirty(bh); -+ -+ if (sync) -+ sync_dirty_buffer(bh); -+} -+ -+void exfat_chain_set(struct exfat_chain *ec, unsigned int dir, -+ unsigned int size, unsigned char flags) -+{ -+ ec->dir = dir; -+ ec->size = size; -+ ec->flags = flags; -+} -+ -+void exfat_chain_dup(struct exfat_chain *dup, struct exfat_chain *ec) -+{ -+ return exfat_chain_set(dup, ec->dir, ec->size, ec->flags); -+} --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-module_alias_fs.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-module_alias_fs.patch deleted file mode 100644 index 6232c18b..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-module_alias_fs.patch +++ /dev/null @@ -1,30 +0,0 @@ -From c37f83b424911f9bb6c9f17a4543c9c77cd73282 Mon Sep 17 00:00:00 2001 -From: Thomas Backlund -Date: Sat, 4 Apr 2020 23:00:31 +0300 -Subject: [PATCH v2] exfat: add missing MODULE_ALIAS_FS() - -This adds the necessary MODULE_ALIAS_FS() to exfat so the module gets -automatically loaded when an exfat filesystem is mounted. - -Signed-off-by: Thomas Backlund -Cc: Namjae Jeon -Cc: Sungjong Seo ---- - fs/exfat/super.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/fs/exfat/super.c b/fs/exfat/super.c -index 16ed202ef527..b4a4063a0272 100644 ---- a/fs/exfat/super.c -+++ b/fs/exfat/super.c -@@ -717,6 +717,7 @@ static void __exit exit_exfat_fs(void) - module_init(init_exfat_fs); - module_exit(exit_exfat_fs); - -+MODULE_ALIAS_FS("exfat"); - MODULE_LICENSE("GPL"); - MODULE_DESCRIPTION("exFAT filesystem support"); - MODULE_AUTHOR("Samsung Electronics Co., Ltd."); --- -2.26.0 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-nls-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-nls-operations.patch deleted file mode 100644 index 5c5792d5..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-nls-operations.patch +++ /dev/null @@ -1,860 +0,0 @@ -From 370e812b3ec190fa492c9fd5a80c38b086d105c0 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:41 +0900 -Subject: [PATCH 10/14] exfat: add nls operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of nls operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Signed-off-by: Al Viro ---- - fs/exfat/nls.c | 831 +++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 831 insertions(+) - create mode 100644 fs/exfat/nls.c - -diff --git a/fs/exfat/nls.c b/fs/exfat/nls.c -new file mode 100644 -index 000000000000..6d1c3ae130ff ---- /dev/null -+++ b/fs/exfat/nls.c -@@ -0,0 +1,831 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+/* Upcase tabel macro */ -+#define EXFAT_NUM_UPCASE (2918) -+#define UTBL_COUNT (0x10000) -+ -+/* -+ * Upcase table in compressed format (7.2.5.1 Recommended Up-case Table -+ * in exfat specification, See: -+ * https://docs.microsoft.com/en-us/windows/win32/fileio/exfat-specification). -+ */ -+static const unsigned short uni_def_upcase[EXFAT_NUM_UPCASE] = { -+ 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, -+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, -+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, -+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, -+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, -+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, -+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, -+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, -+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, -+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, -+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, -+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, -+ 0x0060, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, -+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, -+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, -+ 0x0058, 0x0059, 0x005a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f, -+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, -+ 0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, -+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, -+ 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, -+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, -+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, -+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, -+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, -+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, -+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, -+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, -+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, -+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, -+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, -+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00f7, -+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x0178, -+ 0x0100, 0x0100, 0x0102, 0x0102, 0x0104, 0x0104, 0x0106, 0x0106, -+ 0x0108, 0x0108, 0x010a, 0x010a, 0x010c, 0x010c, 0x010e, 0x010e, -+ 0x0110, 0x0110, 0x0112, 0x0112, 0x0114, 0x0114, 0x0116, 0x0116, -+ 0x0118, 0x0118, 0x011a, 0x011a, 0x011c, 0x011c, 0x011e, 0x011e, -+ 0x0120, 0x0120, 0x0122, 0x0122, 0x0124, 0x0124, 0x0126, 0x0126, -+ 0x0128, 0x0128, 0x012a, 0x012a, 0x012c, 0x012c, 0x012e, 0x012e, -+ 0x0130, 0x0131, 0x0132, 0x0132, 0x0134, 0x0134, 0x0136, 0x0136, -+ 0x0138, 0x0139, 0x0139, 0x013b, 0x013b, 0x013d, 0x013d, 0x013f, -+ 0x013f, 0x0141, 0x0141, 0x0143, 0x0143, 0x0145, 0x0145, 0x0147, -+ 0x0147, 0x0149, 0x014a, 0x014a, 0x014c, 0x014c, 0x014e, 0x014e, -+ 0x0150, 0x0150, 0x0152, 0x0152, 0x0154, 0x0154, 0x0156, 0x0156, -+ 0x0158, 0x0158, 0x015a, 0x015a, 0x015c, 0x015c, 0x015e, 0x015e, -+ 0x0160, 0x0160, 0x0162, 0x0162, 0x0164, 0x0164, 0x0166, 0x0166, -+ 0x0168, 0x0168, 0x016a, 0x016a, 0x016c, 0x016c, 0x016e, 0x016e, -+ 0x0170, 0x0170, 0x0172, 0x0172, 0x0174, 0x0174, 0x0176, 0x0176, -+ 0x0178, 0x0179, 0x0179, 0x017b, 0x017b, 0x017d, 0x017d, 0x017f, -+ 0x0243, 0x0181, 0x0182, 0x0182, 0x0184, 0x0184, 0x0186, 0x0187, -+ 0x0187, 0x0189, 0x018a, 0x018b, 0x018b, 0x018d, 0x018e, 0x018f, -+ 0x0190, 0x0191, 0x0191, 0x0193, 0x0194, 0x01f6, 0x0196, 0x0197, -+ 0x0198, 0x0198, 0x023d, 0x019b, 0x019c, 0x019d, 0x0220, 0x019f, -+ 0x01a0, 0x01a0, 0x01a2, 0x01a2, 0x01a4, 0x01a4, 0x01a6, 0x01a7, -+ 0x01a7, 0x01a9, 0x01aa, 0x01ab, 0x01ac, 0x01ac, 0x01ae, 0x01af, -+ 0x01af, 0x01b1, 0x01b2, 0x01b3, 0x01b3, 0x01b5, 0x01b5, 0x01b7, -+ 0x01b8, 0x01b8, 0x01ba, 0x01bb, 0x01bc, 0x01bc, 0x01be, 0x01f7, -+ 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c4, 0x01c5, 0x01c4, 0x01c7, -+ 0x01c8, 0x01c7, 0x01ca, 0x01cb, 0x01ca, 0x01cd, 0x01cd, 0x01cf, -+ 0x01cf, 0x01d1, 0x01d1, 0x01d3, 0x01d3, 0x01d5, 0x01d5, 0x01d7, -+ 0x01d7, 0x01d9, 0x01d9, 0x01db, 0x01db, 0x018e, 0x01de, 0x01de, -+ 0x01e0, 0x01e0, 0x01e2, 0x01e2, 0x01e4, 0x01e4, 0x01e6, 0x01e6, -+ 0x01e8, 0x01e8, 0x01ea, 0x01ea, 0x01ec, 0x01ec, 0x01ee, 0x01ee, -+ 0x01f0, 0x01f1, 0x01f2, 0x01f1, 0x01f4, 0x01f4, 0x01f6, 0x01f7, -+ 0x01f8, 0x01f8, 0x01fa, 0x01fa, 0x01fc, 0x01fc, 0x01fe, 0x01fe, -+ 0x0200, 0x0200, 0x0202, 0x0202, 0x0204, 0x0204, 0x0206, 0x0206, -+ 0x0208, 0x0208, 0x020a, 0x020a, 0x020c, 0x020c, 0x020e, 0x020e, -+ 0x0210, 0x0210, 0x0212, 0x0212, 0x0214, 0x0214, 0x0216, 0x0216, -+ 0x0218, 0x0218, 0x021a, 0x021a, 0x021c, 0x021c, 0x021e, 0x021e, -+ 0x0220, 0x0221, 0x0222, 0x0222, 0x0224, 0x0224, 0x0226, 0x0226, -+ 0x0228, 0x0228, 0x022a, 0x022a, 0x022c, 0x022c, 0x022e, 0x022e, -+ 0x0230, 0x0230, 0x0232, 0x0232, 0x0234, 0x0235, 0x0236, 0x0237, -+ 0x0238, 0x0239, 0x2c65, 0x023b, 0x023b, 0x023d, 0x2c66, 0x023f, -+ 0x0240, 0x0241, 0x0241, 0x0243, 0x0244, 0x0245, 0x0246, 0x0246, -+ 0x0248, 0x0248, 0x024a, 0x024a, 0x024c, 0x024c, 0x024e, 0x024e, -+ 0x0250, 0x0251, 0x0252, 0x0181, 0x0186, 0x0255, 0x0189, 0x018a, -+ 0x0258, 0x018f, 0x025a, 0x0190, 0x025c, 0x025d, 0x025e, 0x025f, -+ 0x0193, 0x0261, 0x0262, 0x0194, 0x0264, 0x0265, 0x0266, 0x0267, -+ 0x0197, 0x0196, 0x026a, 0x2c62, 0x026c, 0x026d, 0x026e, 0x019c, -+ 0x0270, 0x0271, 0x019d, 0x0273, 0x0274, 0x019f, 0x0276, 0x0277, -+ 0x0278, 0x0279, 0x027a, 0x027b, 0x027c, 0x2c64, 0x027e, 0x027f, -+ 0x01a6, 0x0281, 0x0282, 0x01a9, 0x0284, 0x0285, 0x0286, 0x0287, -+ 0x01ae, 0x0244, 0x01b1, 0x01b2, 0x0245, 0x028d, 0x028e, 0x028f, -+ 0x0290, 0x0291, 0x01b7, 0x0293, 0x0294, 0x0295, 0x0296, 0x0297, -+ 0x0298, 0x0299, 0x029a, 0x029b, 0x029c, 0x029d, 0x029e, 0x029f, -+ 0x02a0, 0x02a1, 0x02a2, 0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, -+ 0x02a8, 0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, -+ 0x02b0, 0x02b1, 0x02b2, 0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, -+ 0x02b8, 0x02b9, 0x02ba, 0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, -+ 0x02c0, 0x02c1, 0x02c2, 0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, -+ 0x02c8, 0x02c9, 0x02ca, 0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, -+ 0x02d0, 0x02d1, 0x02d2, 0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, -+ 0x02d8, 0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df, -+ 0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7, -+ 0x02e8, 0x02e9, 0x02ea, 0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, -+ 0x02f0, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, -+ 0x02f8, 0x02f9, 0x02fa, 0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff, -+ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, -+ 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x030e, 0x030f, -+ 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, -+ 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d, 0x031e, 0x031f, -+ 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, -+ 0x0328, 0x0329, 0x032a, 0x032b, 0x032c, 0x032d, 0x032e, 0x032f, -+ 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, -+ 0x0338, 0x0339, 0x033a, 0x033b, 0x033c, 0x033d, 0x033e, 0x033f, -+ 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, -+ 0x0348, 0x0349, 0x034a, 0x034b, 0x034c, 0x034d, 0x034e, 0x034f, -+ 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, -+ 0x0358, 0x0359, 0x035a, 0x035b, 0x035c, 0x035d, 0x035e, 0x035f, -+ 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, -+ 0x0368, 0x0369, 0x036a, 0x036b, 0x036c, 0x036d, 0x036e, 0x036f, -+ 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, -+ 0x0378, 0x0379, 0x037a, 0x03fd, 0x03fe, 0x03ff, 0x037e, 0x037f, -+ 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, -+ 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e, 0x038f, -+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, -+ 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, -+ 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, -+ 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x0386, 0x0388, 0x0389, 0x038a, -+ 0x03b0, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, -+ 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, -+ 0x03a0, 0x03a1, 0x03a3, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, -+ 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x038c, 0x038e, 0x038f, 0x03cf, -+ 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7, -+ 0x03d8, 0x03d8, 0x03da, 0x03da, 0x03dc, 0x03dc, 0x03de, 0x03de, -+ 0x03e0, 0x03e0, 0x03e2, 0x03e2, 0x03e4, 0x03e4, 0x03e6, 0x03e6, -+ 0x03e8, 0x03e8, 0x03ea, 0x03ea, 0x03ec, 0x03ec, 0x03ee, 0x03ee, -+ 0x03f0, 0x03f1, 0x03f9, 0x03f3, 0x03f4, 0x03f5, 0x03f6, 0x03f7, -+ 0x03f7, 0x03f9, 0x03fa, 0x03fa, 0x03fc, 0x03fd, 0x03fe, 0x03ff, -+ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, -+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f, -+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, -+ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, -+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, -+ 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, -+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, -+ 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, -+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, -+ 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, -+ 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, -+ 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x040d, 0x040e, 0x040f, -+ 0x0460, 0x0460, 0x0462, 0x0462, 0x0464, 0x0464, 0x0466, 0x0466, -+ 0x0468, 0x0468, 0x046a, 0x046a, 0x046c, 0x046c, 0x046e, 0x046e, -+ 0x0470, 0x0470, 0x0472, 0x0472, 0x0474, 0x0474, 0x0476, 0x0476, -+ 0x0478, 0x0478, 0x047a, 0x047a, 0x047c, 0x047c, 0x047e, 0x047e, -+ 0x0480, 0x0480, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, -+ 0x0488, 0x0489, 0x048a, 0x048a, 0x048c, 0x048c, 0x048e, 0x048e, -+ 0x0490, 0x0490, 0x0492, 0x0492, 0x0494, 0x0494, 0x0496, 0x0496, -+ 0x0498, 0x0498, 0x049a, 0x049a, 0x049c, 0x049c, 0x049e, 0x049e, -+ 0x04a0, 0x04a0, 0x04a2, 0x04a2, 0x04a4, 0x04a4, 0x04a6, 0x04a6, -+ 0x04a8, 0x04a8, 0x04aa, 0x04aa, 0x04ac, 0x04ac, 0x04ae, 0x04ae, -+ 0x04b0, 0x04b0, 0x04b2, 0x04b2, 0x04b4, 0x04b4, 0x04b6, 0x04b6, -+ 0x04b8, 0x04b8, 0x04ba, 0x04ba, 0x04bc, 0x04bc, 0x04be, 0x04be, -+ 0x04c0, 0x04c1, 0x04c1, 0x04c3, 0x04c3, 0x04c5, 0x04c5, 0x04c7, -+ 0x04c7, 0x04c9, 0x04c9, 0x04cb, 0x04cb, 0x04cd, 0x04cd, 0x04c0, -+ 0x04d0, 0x04d0, 0x04d2, 0x04d2, 0x04d4, 0x04d4, 0x04d6, 0x04d6, -+ 0x04d8, 0x04d8, 0x04da, 0x04da, 0x04dc, 0x04dc, 0x04de, 0x04de, -+ 0x04e0, 0x04e0, 0x04e2, 0x04e2, 0x04e4, 0x04e4, 0x04e6, 0x04e6, -+ 0x04e8, 0x04e8, 0x04ea, 0x04ea, 0x04ec, 0x04ec, 0x04ee, 0x04ee, -+ 0x04f0, 0x04f0, 0x04f2, 0x04f2, 0x04f4, 0x04f4, 0x04f6, 0x04f6, -+ 0x04f8, 0x04f8, 0x04fa, 0x04fa, 0x04fc, 0x04fc, 0x04fe, 0x04fe, -+ 0x0500, 0x0500, 0x0502, 0x0502, 0x0504, 0x0504, 0x0506, 0x0506, -+ 0x0508, 0x0508, 0x050a, 0x050a, 0x050c, 0x050c, 0x050e, 0x050e, -+ 0x0510, 0x0510, 0x0512, 0x0512, 0x0514, 0x0515, 0x0516, 0x0517, -+ 0x0518, 0x0519, 0x051a, 0x051b, 0x051c, 0x051d, 0x051e, 0x051f, -+ 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, -+ 0x0528, 0x0529, 0x052a, 0x052b, 0x052c, 0x052d, 0x052e, 0x052f, -+ 0x0530, 0x0531, 0x0532, 0x0533, 0x0534, 0x0535, 0x0536, 0x0537, -+ 0x0538, 0x0539, 0x053a, 0x053b, 0x053c, 0x053d, 0x053e, 0x053f, -+ 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0546, 0x0547, -+ 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, 0x054e, 0x054f, -+ 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, 0x0557, -+ 0x0558, 0x0559, 0x055a, 0x055b, 0x055c, 0x055d, 0x055e, 0x055f, -+ 0x0560, 0x0531, 0x0532, 0x0533, 0x0534, 0x0535, 0x0536, 0x0537, -+ 0x0538, 0x0539, 0x053a, 0x053b, 0x053c, 0x053d, 0x053e, 0x053f, -+ 0x0540, 0x0541, 0x0542, 0x0543, 0x0544, 0x0545, 0x0546, 0x0547, -+ 0x0548, 0x0549, 0x054a, 0x054b, 0x054c, 0x054d, 0x054e, 0x054f, -+ 0x0550, 0x0551, 0x0552, 0x0553, 0x0554, 0x0555, 0x0556, 0xffff, -+ 0x17f6, 0x2c63, 0x1d7e, 0x1d7f, 0x1d80, 0x1d81, 0x1d82, 0x1d83, -+ 0x1d84, 0x1d85, 0x1d86, 0x1d87, 0x1d88, 0x1d89, 0x1d8a, 0x1d8b, -+ 0x1d8c, 0x1d8d, 0x1d8e, 0x1d8f, 0x1d90, 0x1d91, 0x1d92, 0x1d93, -+ 0x1d94, 0x1d95, 0x1d96, 0x1d97, 0x1d98, 0x1d99, 0x1d9a, 0x1d9b, -+ 0x1d9c, 0x1d9d, 0x1d9e, 0x1d9f, 0x1da0, 0x1da1, 0x1da2, 0x1da3, -+ 0x1da4, 0x1da5, 0x1da6, 0x1da7, 0x1da8, 0x1da9, 0x1daa, 0x1dab, -+ 0x1dac, 0x1dad, 0x1dae, 0x1daf, 0x1db0, 0x1db1, 0x1db2, 0x1db3, -+ 0x1db4, 0x1db5, 0x1db6, 0x1db7, 0x1db8, 0x1db9, 0x1dba, 0x1dbb, -+ 0x1dbc, 0x1dbd, 0x1dbe, 0x1dbf, 0x1dc0, 0x1dc1, 0x1dc2, 0x1dc3, -+ 0x1dc4, 0x1dc5, 0x1dc6, 0x1dc7, 0x1dc8, 0x1dc9, 0x1dca, 0x1dcb, -+ 0x1dcc, 0x1dcd, 0x1dce, 0x1dcf, 0x1dd0, 0x1dd1, 0x1dd2, 0x1dd3, -+ 0x1dd4, 0x1dd5, 0x1dd6, 0x1dd7, 0x1dd8, 0x1dd9, 0x1dda, 0x1ddb, -+ 0x1ddc, 0x1ddd, 0x1dde, 0x1ddf, 0x1de0, 0x1de1, 0x1de2, 0x1de3, -+ 0x1de4, 0x1de5, 0x1de6, 0x1de7, 0x1de8, 0x1de9, 0x1dea, 0x1deb, -+ 0x1dec, 0x1ded, 0x1dee, 0x1def, 0x1df0, 0x1df1, 0x1df2, 0x1df3, -+ 0x1df4, 0x1df5, 0x1df6, 0x1df7, 0x1df8, 0x1df9, 0x1dfa, 0x1dfb, -+ 0x1dfc, 0x1dfd, 0x1dfe, 0x1dff, 0x1e00, 0x1e00, 0x1e02, 0x1e02, -+ 0x1e04, 0x1e04, 0x1e06, 0x1e06, 0x1e08, 0x1e08, 0x1e0a, 0x1e0a, -+ 0x1e0c, 0x1e0c, 0x1e0e, 0x1e0e, 0x1e10, 0x1e10, 0x1e12, 0x1e12, -+ 0x1e14, 0x1e14, 0x1e16, 0x1e16, 0x1e18, 0x1e18, 0x1e1a, 0x1e1a, -+ 0x1e1c, 0x1e1c, 0x1e1e, 0x1e1e, 0x1e20, 0x1e20, 0x1e22, 0x1e22, -+ 0x1e24, 0x1e24, 0x1e26, 0x1e26, 0x1e28, 0x1e28, 0x1e2a, 0x1e2a, -+ 0x1e2c, 0x1e2c, 0x1e2e, 0x1e2e, 0x1e30, 0x1e30, 0x1e32, 0x1e32, -+ 0x1e34, 0x1e34, 0x1e36, 0x1e36, 0x1e38, 0x1e38, 0x1e3a, 0x1e3a, -+ 0x1e3c, 0x1e3c, 0x1e3e, 0x1e3e, 0x1e40, 0x1e40, 0x1e42, 0x1e42, -+ 0x1e44, 0x1e44, 0x1e46, 0x1e46, 0x1e48, 0x1e48, 0x1e4a, 0x1e4a, -+ 0x1e4c, 0x1e4c, 0x1e4e, 0x1e4e, 0x1e50, 0x1e50, 0x1e52, 0x1e52, -+ 0x1e54, 0x1e54, 0x1e56, 0x1e56, 0x1e58, 0x1e58, 0x1e5a, 0x1e5a, -+ 0x1e5c, 0x1e5c, 0x1e5e, 0x1e5e, 0x1e60, 0x1e60, 0x1e62, 0x1e62, -+ 0x1e64, 0x1e64, 0x1e66, 0x1e66, 0x1e68, 0x1e68, 0x1e6a, 0x1e6a, -+ 0x1e6c, 0x1e6c, 0x1e6e, 0x1e6e, 0x1e70, 0x1e70, 0x1e72, 0x1e72, -+ 0x1e74, 0x1e74, 0x1e76, 0x1e76, 0x1e78, 0x1e78, 0x1e7a, 0x1e7a, -+ 0x1e7c, 0x1e7c, 0x1e7e, 0x1e7e, 0x1e80, 0x1e80, 0x1e82, 0x1e82, -+ 0x1e84, 0x1e84, 0x1e86, 0x1e86, 0x1e88, 0x1e88, 0x1e8a, 0x1e8a, -+ 0x1e8c, 0x1e8c, 0x1e8e, 0x1e8e, 0x1e90, 0x1e90, 0x1e92, 0x1e92, -+ 0x1e94, 0x1e94, 0x1e96, 0x1e97, 0x1e98, 0x1e99, 0x1e9a, 0x1e9b, -+ 0x1e9c, 0x1e9d, 0x1e9e, 0x1e9f, 0x1ea0, 0x1ea0, 0x1ea2, 0x1ea2, -+ 0x1ea4, 0x1ea4, 0x1ea6, 0x1ea6, 0x1ea8, 0x1ea8, 0x1eaa, 0x1eaa, -+ 0x1eac, 0x1eac, 0x1eae, 0x1eae, 0x1eb0, 0x1eb0, 0x1eb2, 0x1eb2, -+ 0x1eb4, 0x1eb4, 0x1eb6, 0x1eb6, 0x1eb8, 0x1eb8, 0x1eba, 0x1eba, -+ 0x1ebc, 0x1ebc, 0x1ebe, 0x1ebe, 0x1ec0, 0x1ec0, 0x1ec2, 0x1ec2, -+ 0x1ec4, 0x1ec4, 0x1ec6, 0x1ec6, 0x1ec8, 0x1ec8, 0x1eca, 0x1eca, -+ 0x1ecc, 0x1ecc, 0x1ece, 0x1ece, 0x1ed0, 0x1ed0, 0x1ed2, 0x1ed2, -+ 0x1ed4, 0x1ed4, 0x1ed6, 0x1ed6, 0x1ed8, 0x1ed8, 0x1eda, 0x1eda, -+ 0x1edc, 0x1edc, 0x1ede, 0x1ede, 0x1ee0, 0x1ee0, 0x1ee2, 0x1ee2, -+ 0x1ee4, 0x1ee4, 0x1ee6, 0x1ee6, 0x1ee8, 0x1ee8, 0x1eea, 0x1eea, -+ 0x1eec, 0x1eec, 0x1eee, 0x1eee, 0x1ef0, 0x1ef0, 0x1ef2, 0x1ef2, -+ 0x1ef4, 0x1ef4, 0x1ef6, 0x1ef6, 0x1ef8, 0x1ef8, 0x1efa, 0x1efb, -+ 0x1efc, 0x1efd, 0x1efe, 0x1eff, 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, -+ 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, -+ 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, -+ 0x1f1c, 0x1f1d, 0x1f16, 0x1f17, 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, -+ 0x1f1c, 0x1f1d, 0x1f1e, 0x1f1f, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, -+ 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, -+ 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, -+ 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, -+ 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, -+ 0x1f4c, 0x1f4d, 0x1f46, 0x1f47, 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, -+ 0x1f4c, 0x1f4d, 0x1f4e, 0x1f4f, 0x1f50, 0x1f59, 0x1f52, 0x1f5b, -+ 0x1f54, 0x1f5d, 0x1f56, 0x1f5f, 0x1f58, 0x1f59, 0x1f5a, 0x1f5b, -+ 0x1f5c, 0x1f5d, 0x1f5e, 0x1f5f, 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, -+ 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, -+ 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f, 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, -+ 0x1fca, 0x1fcb, 0x1fda, 0x1fdb, 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, -+ 0x1ffa, 0x1ffb, 0x1f7e, 0x1f7f, 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, -+ 0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f, 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, -+ 0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f, 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, -+ 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, -+ 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f, 0x1fa8, 0x1fa9, 0x1faa, 0x1fab, -+ 0x1fac, 0x1fad, 0x1fae, 0x1faf, 0x1fa8, 0x1fa9, 0x1faa, 0x1fab, -+ 0x1fac, 0x1fad, 0x1fae, 0x1faf, 0x1fb8, 0x1fb9, 0x1fb2, 0x1fbc, -+ 0x1fb4, 0x1fb5, 0x1fb6, 0x1fb7, 0x1fb8, 0x1fb9, 0x1fba, 0x1fbb, -+ 0x1fbc, 0x1fbd, 0x1fbe, 0x1fbf, 0x1fc0, 0x1fc1, 0x1fc2, 0x1fc3, -+ 0x1fc4, 0x1fc5, 0x1fc6, 0x1fc7, 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, -+ 0x1fc3, 0x1fcd, 0x1fce, 0x1fcf, 0x1fd8, 0x1fd9, 0x1fd2, 0x1fd3, -+ 0x1fd4, 0x1fd5, 0x1fd6, 0x1fd7, 0x1fd8, 0x1fd9, 0x1fda, 0x1fdb, -+ 0x1fdc, 0x1fdd, 0x1fde, 0x1fdf, 0x1fe8, 0x1fe9, 0x1fe2, 0x1fe3, -+ 0x1fe4, 0x1fec, 0x1fe6, 0x1fe7, 0x1fe8, 0x1fe9, 0x1fea, 0x1feb, -+ 0x1fec, 0x1fed, 0x1fee, 0x1fef, 0x1ff0, 0x1ff1, 0x1ff2, 0x1ff3, -+ 0x1ff4, 0x1ff5, 0x1ff6, 0x1ff7, 0x1ff8, 0x1ff9, 0x1ffa, 0x1ffb, -+ 0x1ff3, 0x1ffd, 0x1ffe, 0x1fff, 0x2000, 0x2001, 0x2002, 0x2003, -+ 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x200b, -+ 0x200c, 0x200d, 0x200e, 0x200f, 0x2010, 0x2011, 0x2012, 0x2013, -+ 0x2014, 0x2015, 0x2016, 0x2017, 0x2018, 0x2019, 0x201a, 0x201b, -+ 0x201c, 0x201d, 0x201e, 0x201f, 0x2020, 0x2021, 0x2022, 0x2023, -+ 0x2024, 0x2025, 0x2026, 0x2027, 0x2028, 0x2029, 0x202a, 0x202b, -+ 0x202c, 0x202d, 0x202e, 0x202f, 0x2030, 0x2031, 0x2032, 0x2033, -+ 0x2034, 0x2035, 0x2036, 0x2037, 0x2038, 0x2039, 0x203a, 0x203b, -+ 0x203c, 0x203d, 0x203e, 0x203f, 0x2040, 0x2041, 0x2042, 0x2043, -+ 0x2044, 0x2045, 0x2046, 0x2047, 0x2048, 0x2049, 0x204a, 0x204b, -+ 0x204c, 0x204d, 0x204e, 0x204f, 0x2050, 0x2051, 0x2052, 0x2053, -+ 0x2054, 0x2055, 0x2056, 0x2057, 0x2058, 0x2059, 0x205a, 0x205b, -+ 0x205c, 0x205d, 0x205e, 0x205f, 0x2060, 0x2061, 0x2062, 0x2063, -+ 0x2064, 0x2065, 0x2066, 0x2067, 0x2068, 0x2069, 0x206a, 0x206b, -+ 0x206c, 0x206d, 0x206e, 0x206f, 0x2070, 0x2071, 0x2072, 0x2073, -+ 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x207a, 0x207b, -+ 0x207c, 0x207d, 0x207e, 0x207f, 0x2080, 0x2081, 0x2082, 0x2083, -+ 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x208a, 0x208b, -+ 0x208c, 0x208d, 0x208e, 0x208f, 0x2090, 0x2091, 0x2092, 0x2093, -+ 0x2094, 0x2095, 0x2096, 0x2097, 0x2098, 0x2099, 0x209a, 0x209b, -+ 0x209c, 0x209d, 0x209e, 0x209f, 0x20a0, 0x20a1, 0x20a2, 0x20a3, -+ 0x20a4, 0x20a5, 0x20a6, 0x20a7, 0x20a8, 0x20a9, 0x20aa, 0x20ab, -+ 0x20ac, 0x20ad, 0x20ae, 0x20af, 0x20b0, 0x20b1, 0x20b2, 0x20b3, -+ 0x20b4, 0x20b5, 0x20b6, 0x20b7, 0x20b8, 0x20b9, 0x20ba, 0x20bb, -+ 0x20bc, 0x20bd, 0x20be, 0x20bf, 0x20c0, 0x20c1, 0x20c2, 0x20c3, -+ 0x20c4, 0x20c5, 0x20c6, 0x20c7, 0x20c8, 0x20c9, 0x20ca, 0x20cb, -+ 0x20cc, 0x20cd, 0x20ce, 0x20cf, 0x20d0, 0x20d1, 0x20d2, 0x20d3, -+ 0x20d4, 0x20d5, 0x20d6, 0x20d7, 0x20d8, 0x20d9, 0x20da, 0x20db, -+ 0x20dc, 0x20dd, 0x20de, 0x20df, 0x20e0, 0x20e1, 0x20e2, 0x20e3, -+ 0x20e4, 0x20e5, 0x20e6, 0x20e7, 0x20e8, 0x20e9, 0x20ea, 0x20eb, -+ 0x20ec, 0x20ed, 0x20ee, 0x20ef, 0x20f0, 0x20f1, 0x20f2, 0x20f3, -+ 0x20f4, 0x20f5, 0x20f6, 0x20f7, 0x20f8, 0x20f9, 0x20fa, 0x20fb, -+ 0x20fc, 0x20fd, 0x20fe, 0x20ff, 0x2100, 0x2101, 0x2102, 0x2103, -+ 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2109, 0x210a, 0x210b, -+ 0x210c, 0x210d, 0x210e, 0x210f, 0x2110, 0x2111, 0x2112, 0x2113, -+ 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, 0x2119, 0x211a, 0x211b, -+ 0x211c, 0x211d, 0x211e, 0x211f, 0x2120, 0x2121, 0x2122, 0x2123, -+ 0x2124, 0x2125, 0x2126, 0x2127, 0x2128, 0x2129, 0x212a, 0x212b, -+ 0x212c, 0x212d, 0x212e, 0x212f, 0x2130, 0x2131, 0x2132, 0x2133, -+ 0x2134, 0x2135, 0x2136, 0x2137, 0x2138, 0x2139, 0x213a, 0x213b, -+ 0x213c, 0x213d, 0x213e, 0x213f, 0x2140, 0x2141, 0x2142, 0x2143, -+ 0x2144, 0x2145, 0x2146, 0x2147, 0x2148, 0x2149, 0x214a, 0x214b, -+ 0x214c, 0x214d, 0x2132, 0x214f, 0x2150, 0x2151, 0x2152, 0x2153, -+ 0x2154, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215a, 0x215b, -+ 0x215c, 0x215d, 0x215e, 0x215f, 0x2160, 0x2161, 0x2162, 0x2163, -+ 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, -+ 0x216c, 0x216d, 0x216e, 0x216f, 0x2160, 0x2161, 0x2162, 0x2163, -+ 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216a, 0x216b, -+ 0x216c, 0x216d, 0x216e, 0x216f, 0x2180, 0x2181, 0x2182, 0x2183, -+ 0x2183, 0xffff, 0x034b, 0x24b6, 0x24b7, 0x24b8, 0x24b9, 0x24ba, -+ 0x24bb, 0x24bc, 0x24bd, 0x24be, 0x24bf, 0x24c0, 0x24c1, 0x24c2, -+ 0x24c3, 0x24c4, 0x24c5, 0x24c6, 0x24c7, 0x24c8, 0x24c9, 0x24ca, -+ 0x24cb, 0x24cc, 0x24cd, 0x24ce, 0x24cf, 0xffff, 0x0746, 0x2c00, -+ 0x2c01, 0x2c02, 0x2c03, 0x2c04, 0x2c05, 0x2c06, 0x2c07, 0x2c08, -+ 0x2c09, 0x2c0a, 0x2c0b, 0x2c0c, 0x2c0d, 0x2c0e, 0x2c0f, 0x2c10, -+ 0x2c11, 0x2c12, 0x2c13, 0x2c14, 0x2c15, 0x2c16, 0x2c17, 0x2c18, -+ 0x2c19, 0x2c1a, 0x2c1b, 0x2c1c, 0x2c1d, 0x2c1e, 0x2c1f, 0x2c20, -+ 0x2c21, 0x2c22, 0x2c23, 0x2c24, 0x2c25, 0x2c26, 0x2c27, 0x2c28, -+ 0x2c29, 0x2c2a, 0x2c2b, 0x2c2c, 0x2c2d, 0x2c2e, 0x2c5f, 0x2c60, -+ 0x2c60, 0x2c62, 0x2c63, 0x2c64, 0x2c65, 0x2c66, 0x2c67, 0x2c67, -+ 0x2c69, 0x2c69, 0x2c6b, 0x2c6b, 0x2c6d, 0x2c6e, 0x2c6f, 0x2c70, -+ 0x2c71, 0x2c72, 0x2c73, 0x2c74, 0x2c75, 0x2c75, 0x2c77, 0x2c78, -+ 0x2c79, 0x2c7a, 0x2c7b, 0x2c7c, 0x2c7d, 0x2c7e, 0x2c7f, 0x2c80, -+ 0x2c80, 0x2c82, 0x2c82, 0x2c84, 0x2c84, 0x2c86, 0x2c86, 0x2c88, -+ 0x2c88, 0x2c8a, 0x2c8a, 0x2c8c, 0x2c8c, 0x2c8e, 0x2c8e, 0x2c90, -+ 0x2c90, 0x2c92, 0x2c92, 0x2c94, 0x2c94, 0x2c96, 0x2c96, 0x2c98, -+ 0x2c98, 0x2c9a, 0x2c9a, 0x2c9c, 0x2c9c, 0x2c9e, 0x2c9e, 0x2ca0, -+ 0x2ca0, 0x2ca2, 0x2ca2, 0x2ca4, 0x2ca4, 0x2ca6, 0x2ca6, 0x2ca8, -+ 0x2ca8, 0x2caa, 0x2caa, 0x2cac, 0x2cac, 0x2cae, 0x2cae, 0x2cb0, -+ 0x2cb0, 0x2cb2, 0x2cb2, 0x2cb4, 0x2cb4, 0x2cb6, 0x2cb6, 0x2cb8, -+ 0x2cb8, 0x2cba, 0x2cba, 0x2cbc, 0x2cbc, 0x2cbe, 0x2cbe, 0x2cc0, -+ 0x2cc0, 0x2cc2, 0x2cc2, 0x2cc4, 0x2cc4, 0x2cc6, 0x2cc6, 0x2cc8, -+ 0x2cc8, 0x2cca, 0x2cca, 0x2ccc, 0x2ccc, 0x2cce, 0x2cce, 0x2cd0, -+ 0x2cd0, 0x2cd2, 0x2cd2, 0x2cd4, 0x2cd4, 0x2cd6, 0x2cd6, 0x2cd8, -+ 0x2cd8, 0x2cda, 0x2cda, 0x2cdc, 0x2cdc, 0x2cde, 0x2cde, 0x2ce0, -+ 0x2ce0, 0x2ce2, 0x2ce2, 0x2ce4, 0x2ce5, 0x2ce6, 0x2ce7, 0x2ce8, -+ 0x2ce9, 0x2cea, 0x2ceb, 0x2cec, 0x2ced, 0x2cee, 0x2cef, 0x2cf0, -+ 0x2cf1, 0x2cf2, 0x2cf3, 0x2cf4, 0x2cf5, 0x2cf6, 0x2cf7, 0x2cf8, -+ 0x2cf9, 0x2cfa, 0x2cfb, 0x2cfc, 0x2cfd, 0x2cfe, 0x2cff, 0x10a0, -+ 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8, -+ 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, 0x10b0, -+ 0x10b1, 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, 0x10b8, -+ 0x10b9, 0x10ba, 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, 0x10c0, -+ 0x10c1, 0x10c2, 0x10c3, 0x10c4, 0x10c5, 0xffff, 0xd21b, 0xff21, -+ 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, -+ 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, -+ 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, -+ 0xff3a, 0xff5b, 0xff5c, 0xff5d, 0xff5e, 0xff5f, 0xff60, 0xff61, -+ 0xff62, 0xff63, 0xff64, 0xff65, 0xff66, 0xff67, 0xff68, 0xff69, -+ 0xff6a, 0xff6b, 0xff6c, 0xff6d, 0xff6e, 0xff6f, 0xff70, 0xff71, -+ 0xff72, 0xff73, 0xff74, 0xff75, 0xff76, 0xff77, 0xff78, 0xff79, -+ 0xff7a, 0xff7b, 0xff7c, 0xff7d, 0xff7e, 0xff7f, 0xff80, 0xff81, -+ 0xff82, 0xff83, 0xff84, 0xff85, 0xff86, 0xff87, 0xff88, 0xff89, -+ 0xff8a, 0xff8b, 0xff8c, 0xff8d, 0xff8e, 0xff8f, 0xff90, 0xff91, -+ 0xff92, 0xff93, 0xff94, 0xff95, 0xff96, 0xff97, 0xff98, 0xff99, -+ 0xff9a, 0xff9b, 0xff9c, 0xff9d, 0xff9e, 0xff9f, 0xffa0, 0xffa1, -+ 0xffa2, 0xffa3, 0xffa4, 0xffa5, 0xffa6, 0xffa7, 0xffa8, 0xffa9, -+ 0xffaa, 0xffab, 0xffac, 0xffad, 0xffae, 0xffaf, 0xffb0, 0xffb1, -+ 0xffb2, 0xffb3, 0xffb4, 0xffb5, 0xffb6, 0xffb7, 0xffb8, 0xffb9, -+ 0xffba, 0xffbb, 0xffbc, 0xffbd, 0xffbe, 0xffbf, 0xffc0, 0xffc1, -+ 0xffc2, 0xffc3, 0xffc4, 0xffc5, 0xffc6, 0xffc7, 0xffc8, 0xffc9, -+ 0xffca, 0xffcb, 0xffcc, 0xffcd, 0xffce, 0xffcf, 0xffd0, 0xffd1, -+ 0xffd2, 0xffd3, 0xffd4, 0xffd5, 0xffd6, 0xffd7, 0xffd8, 0xffd9, -+ 0xffda, 0xffdb, 0xffdc, 0xffdd, 0xffde, 0xffdf, 0xffe0, 0xffe1, -+ 0xffe2, 0xffe3, 0xffe4, 0xffe5, 0xffe6, 0xffe7, 0xffe8, 0xffe9, -+ 0xffea, 0xffeb, 0xffec, 0xffed, 0xffee, 0xffef, 0xfff0, 0xfff1, -+ 0xfff2, 0xfff3, 0xfff4, 0xfff5, 0xfff6, 0xfff7, 0xfff8, 0xfff9, -+ 0xfffa, 0xfffb, 0xfffc, 0xfffd, 0xfffe, 0xffff, -+}; -+ -+/* -+ * Allow full-width illegal characters : -+ * "MS windows 7" supports full-width-invalid-name-characters. -+ * So we should check half-width-invalid-name-characters(ASCII) only -+ * for compatibility. -+ * -+ * " * / : < > ? \ | -+ */ -+static unsigned short bad_uni_chars[] = { -+ 0x0022, 0x002A, 0x002F, 0x003A, -+ 0x003C, 0x003E, 0x003F, 0x005C, 0x007C, -+ 0 -+}; -+ -+static int exfat_convert_char_to_ucs2(struct nls_table *nls, -+ const unsigned char *ch, int ch_len, unsigned short *ucs2, -+ int *lossy) -+{ -+ int len; -+ -+ *ucs2 = 0x0; -+ -+ if (ch[0] < 0x80) { -+ *ucs2 = ch[0]; -+ return 1; -+ } -+ -+ len = nls->char2uni(ch, ch_len, ucs2); -+ if (len < 0) { -+ /* conversion failed */ -+ if (lossy != NULL) -+ *lossy |= NLS_NAME_LOSSY; -+ *ucs2 = '_'; -+ return 1; -+ } -+ return len; -+} -+ -+static int exfat_convert_ucs2_to_char(struct nls_table *nls, -+ unsigned short ucs2, unsigned char *ch, int *lossy) -+{ -+ int len; -+ -+ ch[0] = 0x0; -+ -+ if (ucs2 < 0x0080) { -+ ch[0] = ucs2; -+ return 1; -+ } -+ -+ len = nls->uni2char(ucs2, ch, MAX_CHARSET_SIZE); -+ if (len < 0) { -+ /* conversion failed */ -+ if (lossy != NULL) -+ *lossy |= NLS_NAME_LOSSY; -+ ch[0] = '_'; -+ return 1; -+ } -+ return len; -+} -+ -+unsigned short exfat_toupper(struct super_block *sb, unsigned short a) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ return sbi->vol_utbl[a] ? sbi->vol_utbl[a] : a; -+} -+ -+static unsigned short *exfat_wstrchr(unsigned short *str, unsigned short wchar) -+{ -+ while (*str) { -+ if (*(str++) == wchar) -+ return str; -+ } -+ return NULL; -+} -+ -+int exfat_uniname_ncmp(struct super_block *sb, unsigned short *a, -+ unsigned short *b, unsigned int len) -+{ -+ int i; -+ -+ for (i = 0; i < len; i++, a++, b++) -+ if (exfat_toupper(sb, *a) != exfat_toupper(sb, *b)) -+ return 1; -+ return 0; -+} -+ -+static int exfat_utf16_to_utf8(struct super_block *sb, -+ struct exfat_uni_name *p_uniname, unsigned char *p_cstring, -+ int buflen) -+{ -+ int len; -+ const unsigned short *uniname = p_uniname->name; -+ -+ /* always len >= 0 */ -+ len = utf16s_to_utf8s(uniname, MAX_NAME_LENGTH, UTF16_HOST_ENDIAN, -+ p_cstring, buflen); -+ p_cstring[len] = '\0'; -+ return len; -+} -+ -+static int exfat_utf8_to_utf16(struct super_block *sb, -+ const unsigned char *p_cstring, const int len, -+ struct exfat_uni_name *p_uniname, int *p_lossy) -+{ -+ int i, unilen, lossy = NLS_NAME_NO_LOSSY; -+ unsigned short upname[MAX_NAME_LENGTH + 1]; -+ unsigned short *uniname = p_uniname->name; -+ -+ WARN_ON(!len); -+ -+ unilen = utf8s_to_utf16s(p_cstring, len, UTF16_HOST_ENDIAN, -+ (wchar_t *)uniname, MAX_NAME_LENGTH + 2); -+ if (unilen < 0) { -+ exfat_msg(sb, KERN_ERR, -+ "failed to %s (err : %d) nls len : %d", -+ __func__, unilen, len); -+ return unilen; -+ } -+ -+ if (unilen > MAX_NAME_LENGTH) { -+ exfat_msg(sb, KERN_ERR, -+ "failed to %s (estr:ENAMETOOLONG) nls len : %d, unilen : %d > %d", -+ __func__, len, unilen, MAX_NAME_LENGTH); -+ return -ENAMETOOLONG; -+ } -+ -+ p_uniname->name_len = unilen & 0xFF; -+ -+ for (i = 0; i < unilen; i++) { -+ if (*uniname < 0x0020 || -+ exfat_wstrchr(bad_uni_chars, *uniname)) -+ lossy |= NLS_NAME_LOSSY; -+ -+ upname[i] = exfat_toupper(sb, *uniname); -+ uniname++; -+ } -+ -+ *uniname = '\0'; -+ p_uniname->name_len = unilen; -+ p_uniname->name_hash = exfat_calc_chksum_2byte(upname, unilen << 1, 0, -+ CS_DEFAULT); -+ -+ if (p_lossy) -+ *p_lossy = lossy; -+ return unilen; -+} -+ -+#define PLANE_SIZE 0x00010000 -+#define SURROGATE_MASK 0xfffff800 -+#define SURROGATE_PAIR 0x0000d800 -+#define SURROGATE_LOW 0x00000400 -+#define SURROGATE_BITS 0x000003ff -+ -+unsigned short exfat_high_surrogate(unicode_t u) -+{ -+ return ((u - PLANE_SIZE) >> 10) + SURROGATE_PAIR; -+} -+ -+unsigned short exfat_low_surrogate(unicode_t u) -+{ -+ return ((u - PLANE_SIZE) & SURROGATE_BITS) | SURROGATE_PAIR | -+ SURROGATE_LOW; -+} -+ -+static int __exfat_utf16_to_nls(struct super_block *sb, -+ struct exfat_uni_name *p_uniname, unsigned char *p_cstring, -+ int buflen) -+{ -+ int i, j, len, out_len = 0; -+ unsigned char buf[MAX_CHARSET_SIZE]; -+ const unsigned short *uniname = p_uniname->name; -+ struct nls_table *nls = EXFAT_SB(sb)->nls_io; -+ -+ i = 0; -+ while (i < MAX_NAME_LENGTH && out_len < (buflen - 1)) { -+ if (*uniname == '\0') -+ break; -+ if ((*uniname & SURROGATE_MASK) != SURROGATE_PAIR) { -+ len = exfat_convert_ucs2_to_char(nls, *uniname, buf, -+ NULL); -+ } else { -+ /* Process UTF-16 surrogate pair as one character */ -+ if (!(*uniname & SURROGATE_LOW) && -+ i+1 < MAX_NAME_LENGTH && -+ (*(uniname+1) & SURROGATE_MASK) == SURROGATE_PAIR && -+ (*(uniname+1) & SURROGATE_LOW)) { -+ uniname++; -+ i++; -+ } -+ -+ /* -+ * UTF-16 surrogate pair encodes code points above -+ * U+FFFF. Code points above U+FFFF are not supported -+ * by kernel NLS framework therefore use replacement -+ * character -+ */ -+ len = 1; -+ buf[0] = '_'; -+ } -+ -+ if (out_len + len >= buflen) -+ len = buflen - 1 - out_len; -+ out_len += len; -+ -+ if (len > 1) { -+ for (j = 0; j < len; j++) -+ *p_cstring++ = buf[j]; -+ } else { /* len == 1 */ -+ *p_cstring++ = *buf; -+ } -+ -+ uniname++; -+ i++; -+ } -+ -+ *p_cstring = '\0'; -+ return out_len; -+} -+ -+static int exfat_nls_to_ucs2(struct super_block *sb, -+ const unsigned char *p_cstring, const int len, -+ struct exfat_uni_name *p_uniname, int *p_lossy) -+{ -+ int i = 0, unilen = 0, lossy = NLS_NAME_NO_LOSSY; -+ unsigned short upname[MAX_NAME_LENGTH + 1]; -+ unsigned short *uniname = p_uniname->name; -+ struct nls_table *nls = EXFAT_SB(sb)->nls_io; -+ -+ WARN_ON(!len); -+ -+ while (unilen < MAX_NAME_LENGTH && i < len) { -+ i += exfat_convert_char_to_ucs2(nls, p_cstring + i, len - i, -+ uniname, &lossy); -+ -+ if (*uniname < 0x0020 || -+ exfat_wstrchr(bad_uni_chars, *uniname)) -+ lossy |= NLS_NAME_LOSSY; -+ -+ upname[unilen] = exfat_toupper(sb, *uniname); -+ uniname++; -+ unilen++; -+ } -+ -+ if (p_cstring[i] != '\0') -+ lossy |= NLS_NAME_OVERLEN; -+ -+ *uniname = '\0'; -+ p_uniname->name_len = unilen; -+ p_uniname->name_hash = exfat_calc_chksum_2byte(upname, unilen << 1, 0, -+ CS_DEFAULT); -+ -+ if (p_lossy) -+ *p_lossy = lossy; -+ return unilen; -+} -+ -+int exfat_utf16_to_nls(struct super_block *sb, struct exfat_uni_name *uniname, -+ unsigned char *p_cstring, int buflen) -+{ -+ if (EXFAT_SB(sb)->options.utf8) -+ return exfat_utf16_to_utf8(sb, uniname, p_cstring, -+ buflen); -+ return __exfat_utf16_to_nls(sb, uniname, p_cstring, buflen); -+} -+ -+int exfat_nls_to_utf16(struct super_block *sb, const unsigned char *p_cstring, -+ const int len, struct exfat_uni_name *uniname, int *p_lossy) -+{ -+ if (EXFAT_SB(sb)->options.utf8) -+ return exfat_utf8_to_utf16(sb, p_cstring, len, -+ uniname, p_lossy); -+ return exfat_nls_to_ucs2(sb, p_cstring, len, uniname, p_lossy); -+} -+ -+static int exfat_load_upcase_table(struct super_block *sb, -+ sector_t sector, unsigned long long num_sectors, -+ unsigned int utbl_checksum) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned int sect_size = sb->s_blocksize; -+ unsigned int i, index = 0, checksum = 0; -+ int ret; -+ unsigned char skip = false; -+ unsigned short *upcase_table; -+ -+ upcase_table = kcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL); -+ if (!upcase_table) -+ return -ENOMEM; -+ -+ sbi->vol_utbl = upcase_table; -+ num_sectors += sector; -+ -+ while (sector < num_sectors) { -+ struct buffer_head *bh; -+ -+ bh = sb_bread(sb, sector); -+ if (!bh) { -+ exfat_msg(sb, KERN_ERR, -+ "failed to read sector(0x%llx)\n", -+ (unsigned long long)sector); -+ ret = -EIO; -+ goto free_table; -+ } -+ sector++; -+ for (i = 0; i < sect_size && index <= 0xFFFF; i += 2) { -+ unsigned short uni = get_unaligned_le16(bh->b_data + i); -+ -+ checksum = ((checksum & 1) ? 0x80000000 : 0) + -+ (checksum >> 1) + -+ *(((unsigned char *)bh->b_data) + i); -+ checksum = ((checksum & 1) ? 0x80000000 : 0) + -+ (checksum >> 1) + -+ *(((unsigned char *)bh->b_data) + (i + 1)); -+ -+ if (skip) { -+ index += uni; -+ skip = false; -+ } else if (uni == index) { -+ index++; -+ } else if (uni == 0xFFFF) { -+ skip = true; -+ } else { /* uni != index , uni != 0xFFFF */ -+ upcase_table[index] = uni; -+ index++; -+ } -+ } -+ brelse(bh); -+ } -+ -+ if (index >= 0xFFFF && utbl_checksum == checksum) -+ return 0; -+ -+ exfat_msg(sb, KERN_ERR, -+ "failed to load upcase table (idx : 0x%08x, chksum : 0x%08x, utbl_chksum : 0x%08x)\n", -+ index, checksum, utbl_checksum); -+ ret = -EINVAL; -+free_table: -+ exfat_free_upcase_table(sbi); -+ return ret; -+} -+ -+static int exfat_load_default_upcase_table(struct super_block *sb) -+{ -+ int i, ret = -EIO; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned char skip = false; -+ unsigned short uni = 0, *upcase_table; -+ unsigned int index = 0; -+ -+ upcase_table = kcalloc(UTBL_COUNT, sizeof(unsigned short), GFP_KERNEL); -+ if (!upcase_table) -+ return -ENOMEM; -+ -+ sbi->vol_utbl = upcase_table; -+ -+ for (i = 0; index <= 0xFFFF && i < EXFAT_NUM_UPCASE; i++) { -+ uni = uni_def_upcase[i]; -+ if (skip) { -+ index += uni; -+ skip = false; -+ } else if (uni == index) { -+ index++; -+ } else if (uni == 0xFFFF) { -+ skip = true; -+ } else { -+ upcase_table[index] = uni; -+ index++; -+ } -+ } -+ -+ if (index >= 0xFFFF) -+ return 0; -+ -+ /* FATAL error: default upcase table has error */ -+ exfat_free_upcase_table(sbi); -+ return ret; -+} -+ -+int exfat_create_upcase_table(struct super_block *sb) -+{ -+ int i, ret; -+ unsigned int tbl_clu, type; -+ sector_t sector; -+ unsigned long long tbl_size, num_sectors; -+ unsigned char blksize_bits = sb->s_blocksize_bits; -+ struct exfat_chain clu; -+ struct exfat_dentry *ep; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct buffer_head *bh; -+ -+ clu.dir = sbi->root_dir; -+ clu.flags = ALLOC_FAT_CHAIN; -+ -+ while (clu.dir != EXFAT_EOF_CLUSTER) { -+ for (i = 0; i < sbi->dentries_per_clu; i++) { -+ ep = exfat_get_dentry(sb, &clu, i, &bh, NULL); -+ if (!ep) -+ return -EIO; -+ -+ type = exfat_get_entry_type(ep); -+ if (type == TYPE_UNUSED) { -+ brelse(bh); -+ break; -+ } -+ -+ if (type != TYPE_UPCASE) { -+ brelse(bh); -+ continue; -+ } -+ -+ tbl_clu = le32_to_cpu(ep->dentry.upcase.start_clu); -+ tbl_size = le64_to_cpu(ep->dentry.upcase.size); -+ -+ sector = exfat_cluster_to_sector(sbi, tbl_clu); -+ num_sectors = ((tbl_size - 1) >> blksize_bits) + 1; -+ ret = exfat_load_upcase_table(sb, sector, num_sectors, -+ le32_to_cpu(ep->dentry.upcase.checksum)); -+ -+ brelse(bh); -+ if (ret && ret != -EIO) -+ goto load_default; -+ -+ /* load successfully */ -+ return ret; -+ } -+ -+ if (exfat_get_next_cluster(sb, &(clu.dir))) -+ return -EIO; -+ } -+ -+load_default: -+ /* load default upcase table */ -+ return exfat_load_default_upcase_table(sb); -+} -+ -+void exfat_free_upcase_table(struct exfat_sb_info *sbi) -+{ -+ kfree(sbi->vol_utbl); -+} --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-super-block-operations.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-super-block-operations.patch deleted file mode 100644 index f51a2518..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-add-super-block-operations.patch +++ /dev/null @@ -1,758 +0,0 @@ -From 719c1e1829166da399903b13da6dcc5344e73449 Mon Sep 17 00:00:00 2001 -From: Namjae Jeon -Date: Mon, 2 Mar 2020 15:21:33 +0900 -Subject: [PATCH 02/14] exfat: add super block operations -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This adds the implementation of superblock operations for exfat. - -Signed-off-by: Namjae Jeon -Signed-off-by: Sungjong Seo -Reviewed-by: Pali Rohár -Reviewed-by: Christoph Hellwig -Reviewed-by: Arnd Bergmann -Signed-off-by: Al Viro ---- - fs/exfat/super.c | 728 +++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 728 insertions(+) - create mode 100644 fs/exfat/super.c - -diff --git a/fs/exfat/super.c b/fs/exfat/super.c -new file mode 100644 -index 000000000000..f06e0b53e393 ---- /dev/null -+++ b/fs/exfat/super.c -@@ -0,0 +1,728 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "exfat_raw.h" -+#include "exfat_fs.h" -+ -+static char exfat_default_iocharset[] = CONFIG_EXFAT_DEFAULT_IOCHARSET; -+static struct kmem_cache *exfat_inode_cachep; -+ -+static void exfat_free_iocharset(struct exfat_sb_info *sbi) -+{ -+ if (sbi->options.iocharset != exfat_default_iocharset) -+ kfree(sbi->options.iocharset); -+} -+ -+static void exfat_delayed_free(struct rcu_head *p) -+{ -+ struct exfat_sb_info *sbi = container_of(p, struct exfat_sb_info, rcu); -+ -+ unload_nls(sbi->nls_io); -+ exfat_free_iocharset(sbi); -+ exfat_free_upcase_table(sbi); -+ kfree(sbi); -+} -+ -+static void exfat_put_super(struct super_block *sb) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ mutex_lock(&sbi->s_lock); -+ if (test_and_clear_bit(EXFAT_SB_DIRTY, &sbi->s_state)) -+ sync_blockdev(sb->s_bdev); -+ exfat_set_vol_flags(sb, VOL_CLEAN); -+ exfat_free_bitmap(sbi); -+ mutex_unlock(&sbi->s_lock); -+ -+ call_rcu(&sbi->rcu, exfat_delayed_free); -+} -+ -+static int exfat_sync_fs(struct super_block *sb, int wait) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ int err = 0; -+ -+ /* If there are some dirty buffers in the bdev inode */ -+ mutex_lock(&sbi->s_lock); -+ if (test_and_clear_bit(EXFAT_SB_DIRTY, &sbi->s_state)) { -+ sync_blockdev(sb->s_bdev); -+ if (exfat_set_vol_flags(sb, VOL_CLEAN)) -+ err = -EIO; -+ } -+ mutex_unlock(&sbi->s_lock); -+ return err; -+} -+ -+static int exfat_statfs(struct dentry *dentry, struct kstatfs *buf) -+{ -+ struct super_block *sb = dentry->d_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ unsigned long long id = huge_encode_dev(sb->s_bdev->bd_dev); -+ -+ if (sbi->used_clusters == EXFAT_CLUSTERS_UNTRACKED) { -+ mutex_lock(&sbi->s_lock); -+ if (exfat_count_used_clusters(sb, &sbi->used_clusters)) { -+ mutex_unlock(&sbi->s_lock); -+ return -EIO; -+ } -+ mutex_unlock(&sbi->s_lock); -+ } -+ -+ buf->f_type = sb->s_magic; -+ buf->f_bsize = sbi->cluster_size; -+ buf->f_blocks = sbi->num_clusters - 2; /* clu 0 & 1 */ -+ buf->f_bfree = buf->f_blocks - sbi->used_clusters; -+ buf->f_bavail = buf->f_bfree; -+ buf->f_fsid.val[0] = (unsigned int)id; -+ buf->f_fsid.val[1] = (unsigned int)(id >> 32); -+ /* Unicode utf16 255 characters */ -+ buf->f_namelen = EXFAT_MAX_FILE_LEN * NLS_MAX_CHARSET_SIZE; -+ return 0; -+} -+ -+int exfat_set_vol_flags(struct super_block *sb, unsigned short new_flag) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct pbr64 *bpb; -+ bool sync = 0; -+ -+ /* flags are not changed */ -+ if (sbi->vol_flag == new_flag) -+ return 0; -+ -+ sbi->vol_flag = new_flag; -+ -+ /* skip updating volume dirty flag, -+ * if this volume has been mounted with read-only -+ */ -+ if (sb_rdonly(sb)) -+ return 0; -+ -+ if (!sbi->pbr_bh) { -+ sbi->pbr_bh = sb_bread(sb, 0); -+ if (!sbi->pbr_bh) { -+ exfat_msg(sb, KERN_ERR, "failed to read boot sector"); -+ return -ENOMEM; -+ } -+ } -+ -+ bpb = (struct pbr64 *)sbi->pbr_bh->b_data; -+ bpb->bsx.vol_flags = cpu_to_le16(new_flag); -+ -+ if (new_flag == VOL_DIRTY && !buffer_dirty(sbi->pbr_bh)) -+ sync = true; -+ else -+ sync = false; -+ -+ set_buffer_uptodate(sbi->pbr_bh); -+ mark_buffer_dirty(sbi->pbr_bh); -+ -+ if (sync) -+ sync_dirty_buffer(sbi->pbr_bh); -+ return 0; -+} -+ -+static int exfat_show_options(struct seq_file *m, struct dentry *root) -+{ -+ struct super_block *sb = root->d_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_mount_options *opts = &sbi->options; -+ -+ /* Show partition info */ -+ if (!uid_eq(opts->fs_uid, GLOBAL_ROOT_UID)) -+ seq_printf(m, ",uid=%u", -+ from_kuid_munged(&init_user_ns, opts->fs_uid)); -+ if (!gid_eq(opts->fs_gid, GLOBAL_ROOT_GID)) -+ seq_printf(m, ",gid=%u", -+ from_kgid_munged(&init_user_ns, opts->fs_gid)); -+ seq_printf(m, ",fmask=%04o,dmask=%04o", opts->fs_fmask, opts->fs_dmask); -+ if (opts->allow_utime) -+ seq_printf(m, ",allow_utime=%04o", opts->allow_utime); -+ if (opts->utf8) -+ seq_puts(m, ",iocharset=utf8"); -+ else if (sbi->nls_io) -+ seq_printf(m, ",iocharset=%s", sbi->nls_io->charset); -+ seq_printf(m, ",bps=%ld", sb->s_blocksize); -+ if (opts->errors == EXFAT_ERRORS_CONT) -+ seq_puts(m, ",errors=continue"); -+ else if (opts->errors == EXFAT_ERRORS_PANIC) -+ seq_puts(m, ",errors=panic"); -+ else -+ seq_puts(m, ",errors=remount-ro"); -+ if (opts->discard) -+ seq_puts(m, ",discard"); -+ if (opts->time_offset) -+ seq_printf(m, ",time_offset=%d", opts->time_offset); -+ return 0; -+} -+ -+static struct inode *exfat_alloc_inode(struct super_block *sb) -+{ -+ struct exfat_inode_info *ei; -+ -+ ei = kmem_cache_alloc(exfat_inode_cachep, GFP_NOFS); -+ if (!ei) -+ return NULL; -+ -+ init_rwsem(&ei->truncate_lock); -+ return &ei->vfs_inode; -+} -+ -+static void exfat_free_inode(struct inode *inode) -+{ -+ kmem_cache_free(exfat_inode_cachep, EXFAT_I(inode)); -+} -+ -+static const struct super_operations exfat_sops = { -+ .alloc_inode = exfat_alloc_inode, -+ .free_inode = exfat_free_inode, -+ .write_inode = exfat_write_inode, -+ .evict_inode = exfat_evict_inode, -+ .put_super = exfat_put_super, -+ .sync_fs = exfat_sync_fs, -+ .statfs = exfat_statfs, -+ .show_options = exfat_show_options, -+}; -+ -+enum { -+ Opt_uid, -+ Opt_gid, -+ Opt_umask, -+ Opt_dmask, -+ Opt_fmask, -+ Opt_allow_utime, -+ Opt_charset, -+ Opt_errors, -+ Opt_discard, -+ Opt_time_offset, -+}; -+ -+static const struct fs_parameter_spec exfat_param_specs[] = { -+ fsparam_u32("uid", Opt_uid), -+ fsparam_u32("gid", Opt_gid), -+ fsparam_u32oct("umask", Opt_umask), -+ fsparam_u32oct("dmask", Opt_dmask), -+ fsparam_u32oct("fmask", Opt_fmask), -+ fsparam_u32oct("allow_utime", Opt_allow_utime), -+ fsparam_string("iocharset", Opt_charset), -+ fsparam_enum("errors", Opt_errors), -+ fsparam_flag("discard", Opt_discard), -+ fsparam_s32("time_offset", Opt_time_offset), -+ {} -+}; -+ -+static const struct fs_parameter_enum exfat_param_enums[] = { -+ { Opt_errors, "continue", EXFAT_ERRORS_CONT }, -+ { Opt_errors, "panic", EXFAT_ERRORS_PANIC }, -+ { Opt_errors, "remount-ro", EXFAT_ERRORS_RO }, -+ {} -+}; -+ -+static const struct fs_parameter_description exfat_parameters = { -+ .name = "exfat", -+ .specs = exfat_param_specs, -+ .enums = exfat_param_enums, -+}; -+ -+static int exfat_parse_param(struct fs_context *fc, struct fs_parameter *param) -+{ -+ struct exfat_sb_info *sbi = fc->s_fs_info; -+ struct exfat_mount_options *opts = &sbi->options; -+ struct fs_parse_result result; -+ int opt; -+ -+ opt = fs_parse(fc, &exfat_parameters, param, &result); -+ if (opt < 0) -+ return opt; -+ -+ switch (opt) { -+ case Opt_uid: -+ opts->fs_uid = make_kuid(current_user_ns(), result.uint_32); -+ break; -+ case Opt_gid: -+ opts->fs_gid = make_kgid(current_user_ns(), result.uint_32); -+ break; -+ case Opt_umask: -+ opts->fs_fmask = result.uint_32; -+ opts->fs_dmask = result.uint_32; -+ break; -+ case Opt_dmask: -+ opts->fs_dmask = result.uint_32; -+ break; -+ case Opt_fmask: -+ opts->fs_fmask = result.uint_32; -+ break; -+ case Opt_allow_utime: -+ opts->allow_utime = result.uint_32 & 0022; -+ break; -+ case Opt_charset: -+ exfat_free_iocharset(sbi); -+ opts->iocharset = kstrdup(param->string, GFP_KERNEL); -+ if (!opts->iocharset) -+ return -ENOMEM; -+ break; -+ case Opt_errors: -+ opts->errors = result.uint_32; -+ break; -+ case Opt_discard: -+ opts->discard = 1; -+ break; -+ case Opt_time_offset: -+ /* -+ * Make the limit 24 just in case someone invents something -+ * unusual. -+ */ -+ if (result.int_32 < -24 * 60 || result.int_32 > 24 * 60) -+ return -EINVAL; -+ opts->time_offset = result.int_32; -+ break; -+ default: -+ return -EINVAL; -+ } -+ -+ return 0; -+} -+ -+static void exfat_hash_init(struct super_block *sb) -+{ -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ int i; -+ -+ spin_lock_init(&sbi->inode_hash_lock); -+ for (i = 0; i < EXFAT_HASH_SIZE; i++) -+ INIT_HLIST_HEAD(&sbi->inode_hashtable[i]); -+} -+ -+static int exfat_read_root(struct inode *inode) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ struct exfat_inode_info *ei = EXFAT_I(inode); -+ struct exfat_chain cdir; -+ int num_subdirs, num_clu = 0; -+ -+ exfat_chain_set(&ei->dir, sbi->root_dir, 0, ALLOC_FAT_CHAIN); -+ ei->entry = -1; -+ ei->start_clu = sbi->root_dir; -+ ei->flags = ALLOC_FAT_CHAIN; -+ ei->type = TYPE_DIR; -+ ei->version = 0; -+ ei->rwoffset = 0; -+ ei->hint_bmap.off = EXFAT_EOF_CLUSTER; -+ ei->hint_stat.eidx = 0; -+ ei->hint_stat.clu = sbi->root_dir; -+ ei->hint_femp.eidx = EXFAT_HINT_NONE; -+ -+ exfat_chain_set(&cdir, sbi->root_dir, 0, ALLOC_FAT_CHAIN); -+ if (exfat_count_num_clusters(sb, &cdir, &num_clu)) -+ return -EIO; -+ i_size_write(inode, num_clu << sbi->cluster_size_bits); -+ -+ num_subdirs = exfat_count_dir_entries(sb, &cdir); -+ if (num_subdirs < 0) -+ return -EIO; -+ set_nlink(inode, num_subdirs + EXFAT_MIN_SUBDIR); -+ -+ inode->i_uid = sbi->options.fs_uid; -+ inode->i_gid = sbi->options.fs_gid; -+ inode_inc_iversion(inode); -+ inode->i_generation = 0; -+ inode->i_mode = exfat_make_mode(sbi, ATTR_SUBDIR, 0777); -+ inode->i_op = &exfat_dir_inode_operations; -+ inode->i_fop = &exfat_dir_operations; -+ -+ inode->i_blocks = ((i_size_read(inode) + (sbi->cluster_size - 1)) -+ & ~(sbi->cluster_size - 1)) >> inode->i_blkbits; -+ EXFAT_I(inode)->i_pos = ((loff_t)sbi->root_dir << 32) | 0xffffffff; -+ EXFAT_I(inode)->i_size_aligned = i_size_read(inode); -+ EXFAT_I(inode)->i_size_ondisk = i_size_read(inode); -+ -+ exfat_save_attr(inode, ATTR_SUBDIR); -+ inode->i_mtime = inode->i_atime = inode->i_ctime = ei->i_crtime = -+ current_time(inode); -+ exfat_cache_init_inode(inode); -+ return 0; -+} -+ -+static struct pbr *exfat_read_pbr_with_logical_sector(struct super_block *sb, -+ struct buffer_head **prev_bh) -+{ -+ struct pbr *p_pbr = (struct pbr *) (*prev_bh)->b_data; -+ unsigned short logical_sect = 0; -+ -+ logical_sect = 1 << p_pbr->bsx.f64.sect_size_bits; -+ -+ if (!is_power_of_2(logical_sect) || -+ logical_sect < 512 || logical_sect > 4096) { -+ exfat_msg(sb, KERN_ERR, "bogus logical sector size %u", -+ logical_sect); -+ return NULL; -+ } -+ -+ if (logical_sect < sb->s_blocksize) { -+ exfat_msg(sb, KERN_ERR, -+ "logical sector size too small for device (logical sector size = %u)", -+ logical_sect); -+ return NULL; -+ } -+ -+ if (logical_sect > sb->s_blocksize) { -+ struct buffer_head *bh = NULL; -+ -+ __brelse(*prev_bh); -+ *prev_bh = NULL; -+ -+ if (!sb_set_blocksize(sb, logical_sect)) { -+ exfat_msg(sb, KERN_ERR, -+ "unable to set blocksize %u", logical_sect); -+ return NULL; -+ } -+ bh = sb_bread(sb, 0); -+ if (!bh) { -+ exfat_msg(sb, KERN_ERR, -+ "unable to read boot sector (logical sector size = %lu)", -+ sb->s_blocksize); -+ return NULL; -+ } -+ -+ *prev_bh = bh; -+ p_pbr = (struct pbr *) bh->b_data; -+ } -+ return p_pbr; -+} -+ -+/* mount the file system volume */ -+static int __exfat_fill_super(struct super_block *sb) -+{ -+ int ret; -+ struct pbr *p_pbr; -+ struct pbr64 *p_bpb; -+ struct buffer_head *bh; -+ struct exfat_sb_info *sbi = EXFAT_SB(sb); -+ -+ /* set block size to read super block */ -+ sb_min_blocksize(sb, 512); -+ -+ /* read boot sector */ -+ bh = sb_bread(sb, 0); -+ if (!bh) { -+ exfat_msg(sb, KERN_ERR, "unable to read boot sector"); -+ return -EIO; -+ } -+ -+ /* PRB is read */ -+ p_pbr = (struct pbr *)bh->b_data; -+ -+ /* check the validity of PBR */ -+ if (le16_to_cpu((p_pbr->signature)) != PBR_SIGNATURE) { -+ exfat_msg(sb, KERN_ERR, "invalid boot record signature"); -+ ret = -EINVAL; -+ goto free_bh; -+ } -+ -+ -+ /* check logical sector size */ -+ p_pbr = exfat_read_pbr_with_logical_sector(sb, &bh); -+ if (!p_pbr) { -+ ret = -EIO; -+ goto free_bh; -+ } -+ -+ /* -+ * res_zero field must be filled with zero to prevent mounting -+ * from FAT volume. -+ */ -+ if (memchr_inv(p_pbr->bpb.f64.res_zero, 0, -+ sizeof(p_pbr->bpb.f64.res_zero))) { -+ ret = -EINVAL; -+ goto free_bh; -+ } -+ -+ p_bpb = (struct pbr64 *)p_pbr; -+ if (!p_bpb->bsx.num_fats) { -+ exfat_msg(sb, KERN_ERR, "bogus number of FAT structure"); -+ ret = -EINVAL; -+ goto free_bh; -+ } -+ -+ sbi->sect_per_clus = 1 << p_bpb->bsx.sect_per_clus_bits; -+ sbi->sect_per_clus_bits = p_bpb->bsx.sect_per_clus_bits; -+ sbi->cluster_size_bits = sbi->sect_per_clus_bits + sb->s_blocksize_bits; -+ sbi->cluster_size = 1 << sbi->cluster_size_bits; -+ sbi->num_FAT_sectors = le32_to_cpu(p_bpb->bsx.fat_length); -+ sbi->FAT1_start_sector = le32_to_cpu(p_bpb->bsx.fat_offset); -+ sbi->FAT2_start_sector = p_bpb->bsx.num_fats == 1 ? -+ sbi->FAT1_start_sector : -+ sbi->FAT1_start_sector + sbi->num_FAT_sectors; -+ sbi->data_start_sector = le32_to_cpu(p_bpb->bsx.clu_offset); -+ sbi->num_sectors = le64_to_cpu(p_bpb->bsx.vol_length); -+ /* because the cluster index starts with 2 */ -+ sbi->num_clusters = le32_to_cpu(p_bpb->bsx.clu_count) + -+ EXFAT_RESERVED_CLUSTERS; -+ -+ sbi->root_dir = le32_to_cpu(p_bpb->bsx.root_cluster); -+ sbi->dentries_per_clu = 1 << -+ (sbi->cluster_size_bits - DENTRY_SIZE_BITS); -+ -+ sbi->vol_flag = le16_to_cpu(p_bpb->bsx.vol_flags); -+ sbi->clu_srch_ptr = EXFAT_FIRST_CLUSTER; -+ sbi->used_clusters = EXFAT_CLUSTERS_UNTRACKED; -+ -+ if (le16_to_cpu(p_bpb->bsx.vol_flags) & VOL_DIRTY) { -+ sbi->vol_flag |= VOL_DIRTY; -+ exfat_msg(sb, KERN_WARNING, -+ "Volume was not properly unmounted. Some data may be corrupt. Please run fsck."); -+ } -+ -+ /* exFAT file size is limited by a disk volume size */ -+ sb->s_maxbytes = (u64)(sbi->num_clusters - EXFAT_RESERVED_CLUSTERS) << -+ sbi->cluster_size_bits; -+ -+ ret = exfat_create_upcase_table(sb); -+ if (ret) { -+ exfat_msg(sb, KERN_ERR, "failed to load upcase table"); -+ goto free_bh; -+ } -+ -+ ret = exfat_load_bitmap(sb); -+ if (ret) { -+ exfat_msg(sb, KERN_ERR, "failed to load alloc-bitmap"); -+ goto free_upcase_table; -+ } -+ -+ ret = exfat_count_used_clusters(sb, &sbi->used_clusters); -+ if (ret) { -+ exfat_msg(sb, KERN_ERR, "failed to scan clusters"); -+ goto free_alloc_bitmap; -+ } -+ -+ return 0; -+ -+free_alloc_bitmap: -+ exfat_free_bitmap(sbi); -+free_upcase_table: -+ exfat_free_upcase_table(sbi); -+free_bh: -+ brelse(bh); -+ return ret; -+} -+ -+static int exfat_fill_super(struct super_block *sb, struct fs_context *fc) -+{ -+ struct exfat_sb_info *sbi = sb->s_fs_info; -+ struct exfat_mount_options *opts = &sbi->options; -+ struct inode *root_inode; -+ int err; -+ -+ if (opts->allow_utime == (unsigned short)-1) -+ opts->allow_utime = ~opts->fs_dmask & 0022; -+ -+ if (opts->discard) { -+ struct request_queue *q = bdev_get_queue(sb->s_bdev); -+ -+ if (!blk_queue_discard(q)) -+ exfat_msg(sb, KERN_WARNING, -+ "mounting with \"discard\" option, but the device does not support discard"); -+ opts->discard = 0; -+ } -+ -+ sb->s_flags |= SB_NODIRATIME; -+ sb->s_magic = EXFAT_SUPER_MAGIC; -+ sb->s_op = &exfat_sops; -+ -+ sb->s_time_gran = 1; -+ sb->s_time_min = EXFAT_MIN_TIMESTAMP_SECS; -+ sb->s_time_max = EXFAT_MAX_TIMESTAMP_SECS; -+ -+ err = __exfat_fill_super(sb); -+ if (err) { -+ exfat_msg(sb, KERN_ERR, "failed to recognize exfat type"); -+ goto check_nls_io; -+ } -+ -+ /* set up enough so that it can read an inode */ -+ exfat_hash_init(sb); -+ -+ if (!strcmp(sbi->options.iocharset, "utf8")) -+ opts->utf8 = 1; -+ else { -+ sbi->nls_io = load_nls(sbi->options.iocharset); -+ if (!sbi->nls_io) { -+ exfat_msg(sb, KERN_ERR, "IO charset %s not found", -+ sbi->options.iocharset); -+ err = -EINVAL; -+ goto free_table; -+ } -+ } -+ -+ if (sbi->options.utf8) -+ sb->s_d_op = &exfat_utf8_dentry_ops; -+ else -+ sb->s_d_op = &exfat_dentry_ops; -+ -+ root_inode = new_inode(sb); -+ if (!root_inode) { -+ exfat_msg(sb, KERN_ERR, "failed to allocate root inode."); -+ err = -ENOMEM; -+ goto free_table; -+ } -+ -+ root_inode->i_ino = EXFAT_ROOT_INO; -+ inode_set_iversion(root_inode, 1); -+ err = exfat_read_root(root_inode); -+ if (err) { -+ exfat_msg(sb, KERN_ERR, "failed to initialize root inode."); -+ goto put_inode; -+ } -+ -+ exfat_hash_inode(root_inode, EXFAT_I(root_inode)->i_pos); -+ insert_inode_hash(root_inode); -+ -+ sb->s_root = d_make_root(root_inode); -+ if (!sb->s_root) { -+ exfat_msg(sb, KERN_ERR, "failed to get the root dentry"); -+ err = -ENOMEM; -+ goto put_inode; -+ } -+ -+ return 0; -+ -+put_inode: -+ iput(root_inode); -+ sb->s_root = NULL; -+ -+free_table: -+ exfat_free_upcase_table(sbi); -+ exfat_free_bitmap(sbi); -+ -+check_nls_io: -+ unload_nls(sbi->nls_io); -+ exfat_free_iocharset(sbi); -+ sb->s_fs_info = NULL; -+ kfree(sbi); -+ return err; -+} -+ -+static int exfat_get_tree(struct fs_context *fc) -+{ -+ return get_tree_bdev(fc, exfat_fill_super); -+} -+ -+static void exfat_free(struct fs_context *fc) -+{ -+ kfree(fc->s_fs_info); -+} -+ -+static const struct fs_context_operations exfat_context_ops = { -+ .parse_param = exfat_parse_param, -+ .get_tree = exfat_get_tree, -+ .free = exfat_free, -+}; -+ -+static int exfat_init_fs_context(struct fs_context *fc) -+{ -+ struct exfat_sb_info *sbi; -+ -+ sbi = kzalloc(sizeof(struct exfat_sb_info), GFP_KERNEL); -+ if (!sbi) -+ return -ENOMEM; -+ -+ mutex_init(&sbi->s_lock); -+ ratelimit_state_init(&sbi->ratelimit, DEFAULT_RATELIMIT_INTERVAL, -+ DEFAULT_RATELIMIT_BURST); -+ -+ sbi->options.fs_uid = current_uid(); -+ sbi->options.fs_gid = current_gid(); -+ sbi->options.fs_fmask = current->fs->umask; -+ sbi->options.fs_dmask = current->fs->umask; -+ sbi->options.allow_utime = -1; -+ sbi->options.iocharset = exfat_default_iocharset; -+ sbi->options.errors = EXFAT_ERRORS_RO; -+ -+ fc->s_fs_info = sbi; -+ fc->ops = &exfat_context_ops; -+ return 0; -+} -+ -+static struct file_system_type exfat_fs_type = { -+ .owner = THIS_MODULE, -+ .name = "exfat", -+ .init_fs_context = exfat_init_fs_context, -+ .parameters = &exfat_parameters, -+ .kill_sb = kill_block_super, -+ .fs_flags = FS_REQUIRES_DEV, -+}; -+ -+static void exfat_inode_init_once(void *foo) -+{ -+ struct exfat_inode_info *ei = (struct exfat_inode_info *)foo; -+ -+ INIT_HLIST_NODE(&ei->i_hash_fat); -+ inode_init_once(&ei->vfs_inode); -+} -+ -+static int __init init_exfat_fs(void) -+{ -+ int err; -+ -+ err = exfat_cache_init(); -+ if (err) -+ return err; -+ -+ exfat_inode_cachep = kmem_cache_create("exfat_inode_cache", -+ sizeof(struct exfat_inode_info), -+ 0, SLAB_RECLAIM_ACCOUNT | SLAB_MEM_SPREAD, -+ exfat_inode_init_once); -+ if (!exfat_inode_cachep) { -+ err = -ENOMEM; -+ goto shutdown_cache; -+ } -+ -+ err = register_filesystem(&exfat_fs_type); -+ if (err) -+ goto destroy_cache; -+ -+ return 0; -+ -+destroy_cache: -+ kmem_cache_destroy(exfat_inode_cachep); -+shutdown_cache: -+ exfat_cache_shutdown(); -+ return err; -+} -+ -+static void __exit exit_exfat_fs(void) -+{ -+ /* -+ * Make sure all delayed rcu free inodes are flushed before we -+ * destroy cache. -+ */ -+ rcu_barrier(); -+ kmem_cache_destroy(exfat_inode_cachep); -+ unregister_filesystem(&exfat_fs_type); -+ exfat_cache_shutdown(); -+} -+ -+module_init(init_exfat_fs); -+module_exit(exit_exfat_fs); -+ -+MODULE_LICENSE("GPL"); -+MODULE_DESCRIPTION("exFAT filesystem support"); -+MODULE_AUTHOR("Samsung Electronics Co., Ltd."); --- -2.25.1 - diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-fix-discard-support.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-fix-discard-support.patch deleted file mode 100644 index 5de9917c..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-fix-discard-support.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: =?UTF-8?q?Pali=20Roh=C3=A1r?= -Subject: [PATCH 4/4] exfat: Fix discard support -Date: Tue, 17 Mar 2020 23:25:55 +0100 - -Discard support was always unconditionally disabled. Now it is disabled -only in the case when blk_queue_discard() returns false. - -Signed-off-by: Pali Rohár ---- - fs/exfat/super.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/fs/exfat/super.c b/fs/exfat/super.c -index 16ed202ef527..30e914ad17b5 100644 ---- a/fs/exfat/super.c -+++ b/fs/exfat/super.c -@@ -531,10 +531,11 @@ static int exfat_fill_super(struct super_block *sb, struct fs_context *fc) - if (opts->discard) { - struct request_queue *q = bdev_get_queue(sb->s_bdev); - -- if (!blk_queue_discard(q)) -+ if (!blk_queue_discard(q)) { - exfat_msg(sb, KERN_WARNING, - "mounting with \"discard\" option, but the device does not support discard"); -- opts->discard = 0; -+ opts->discard = 0; -+ } - } - - sb->s_flags |= SB_NODIRATIME; --- -2.20.1 diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-remove-from-staging.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-remove-from-staging.patch deleted file mode 100644 index 25268372..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-remove-from-staging.patch +++ /dev/null @@ -1,9152 +0,0 @@ - -This removes the staging driver in favour of the one being merged upstream in 5.7 - -Signed-off-by: Thomas Backlund - ---- - MAINTAINERS | 6 - drivers/staging/Kconfig | 2 - drivers/staging/Makefile | 1 - drivers/staging/exfat/Kconfig | 41 -- - drivers/staging/exfat/Makefile | 10 - drivers/staging/exfat/TODO | 69 --- - drivers/staging/exfat/exfat.h | 824 ---------------------------------------- - drivers/staging/exfat/exfat_blkdev.c | 136 ------ - drivers/staging/exfat/exfat_cache.c | 555 --------------------------- - drivers/staging/exfat/exfat_core.c | 2582 -------------------------------------------------------------------------------------------------------------------------------- - drivers/staging/exfat/exfat_nls.c | 212 ---------- - drivers/staging/exfat/exfat_super.c | 3883 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - drivers/staging/exfat/exfat_upcase.c | 740 ------------------------------------ - 13 files changed, 9061 deletions(-) - -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/exfat_blkdev.c linux-5.6.3/drivers/staging/exfat/exfat_blkdev.c ---- linux-5.6.3.orig/drivers/staging/exfat/exfat_blkdev.c 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/exfat_blkdev.c 1970-01-01 02:00:00.000000000 +0200 -@@ -1,136 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -- */ -- --#include --#include --#include --#include "exfat.h" -- --void exfat_bdev_open(struct super_block *sb) --{ -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- if (p_bd->opened) -- return; -- -- p_bd->sector_size = bdev_logical_block_size(sb->s_bdev); -- p_bd->sector_size_bits = ilog2(p_bd->sector_size); -- p_bd->sector_size_mask = p_bd->sector_size - 1; -- p_bd->num_sectors = i_size_read(sb->s_bdev->bd_inode) >> -- p_bd->sector_size_bits; -- p_bd->opened = true; --} -- --void exfat_bdev_close(struct super_block *sb) --{ -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- p_bd->opened = false; --} -- --int exfat_bdev_read(struct super_block *sb, sector_t secno, struct buffer_head **bh, -- u32 num_secs, bool read) --{ -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- long flags = sbi->debug_flags; -- -- if (flags & EXFAT_DEBUGFLAGS_ERROR_RW) -- return -EIO; --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- -- if (!p_bd->opened) -- return -ENODEV; -- -- if (*bh) -- __brelse(*bh); -- -- if (read) -- *bh = __bread(sb->s_bdev, secno, -- num_secs << p_bd->sector_size_bits); -- else -- *bh = __getblk(sb->s_bdev, secno, -- num_secs << p_bd->sector_size_bits); -- -- if (*bh) -- return 0; -- -- WARN(!p_fs->dev_ejected, -- "[EXFAT] No bh, device seems wrong or to be ejected.\n"); -- -- return -EIO; --} -- --int exfat_bdev_write(struct super_block *sb, sector_t secno, struct buffer_head *bh, -- u32 num_secs, bool sync) --{ -- s32 count; -- struct buffer_head *bh2; -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- long flags = sbi->debug_flags; -- -- if (flags & EXFAT_DEBUGFLAGS_ERROR_RW) -- return -EIO; --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- -- if (!p_bd->opened) -- return -ENODEV; -- -- if (secno == bh->b_blocknr) { -- lock_buffer(bh); -- set_buffer_uptodate(bh); -- mark_buffer_dirty(bh); -- unlock_buffer(bh); -- if (sync && (sync_dirty_buffer(bh) != 0)) -- return -EIO; -- } else { -- count = num_secs << p_bd->sector_size_bits; -- -- bh2 = __getblk(sb->s_bdev, secno, count); -- if (!bh2) -- goto no_bh; -- -- lock_buffer(bh2); -- memcpy(bh2->b_data, bh->b_data, count); -- set_buffer_uptodate(bh2); -- mark_buffer_dirty(bh2); -- unlock_buffer(bh2); -- if (sync && (sync_dirty_buffer(bh2) != 0)) { -- __brelse(bh2); -- goto no_bh; -- } -- __brelse(bh2); -- } -- -- return 0; -- --no_bh: -- WARN(!p_fs->dev_ejected, -- "[EXFAT] No bh, device seems wrong or to be ejected.\n"); -- -- return -EIO; --} -- --int exfat_bdev_sync(struct super_block *sb) --{ -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- long flags = sbi->debug_flags; -- -- if (flags & EXFAT_DEBUGFLAGS_ERROR_RW) -- return -EIO; --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- -- if (!p_bd->opened) -- return -ENODEV; -- -- return sync_blockdev(sb->s_bdev); --} -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/exfat_cache.c linux-5.6.3/drivers/staging/exfat/exfat_cache.c ---- linux-5.6.3.orig/drivers/staging/exfat/exfat_cache.c 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/exfat_cache.c 1970-01-01 02:00:00.000000000 +0200 -@@ -1,555 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -- */ -- --#include --#include --#include --#include "exfat.h" -- --#define LOCKBIT 0x01 --#define DIRTYBIT 0x02 -- --/* Local variables */ --static DEFINE_MUTEX(f_mutex); --static DEFINE_MUTEX(b_mutex); -- --static struct buf_cache_t *FAT_cache_find(struct super_block *sb, sector_t sec) --{ -- s32 off; -- struct buf_cache_t *bp, *hp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- off = (sec + -- (sec >> p_fs->sectors_per_clu_bits)) & (FAT_CACHE_HASH_SIZE - 1); -- -- hp = &p_fs->FAT_cache_hash_list[off]; -- for (bp = hp->hash_next; bp != hp; bp = bp->hash_next) { -- if ((bp->drv == p_fs->drv) && (bp->sec == sec)) { -- WARN(!bp->buf_bh, -- "[EXFAT] FAT_cache has no bh. It will make system panic.\n"); -- -- touch_buffer(bp->buf_bh); -- return bp; -- } -- } -- return NULL; --} -- --static void push_to_mru(struct buf_cache_t *bp, struct buf_cache_t *list) --{ -- bp->next = list->next; -- bp->prev = list; -- list->next->prev = bp; -- list->next = bp; --} -- --static void push_to_lru(struct buf_cache_t *bp, struct buf_cache_t *list) --{ -- bp->prev = list->prev; -- bp->next = list; -- list->prev->next = bp; -- list->prev = bp; --} -- --static void move_to_mru(struct buf_cache_t *bp, struct buf_cache_t *list) --{ -- bp->prev->next = bp->next; -- bp->next->prev = bp->prev; -- push_to_mru(bp, list); --} -- --static void move_to_lru(struct buf_cache_t *bp, struct buf_cache_t *list) --{ -- bp->prev->next = bp->next; -- bp->next->prev = bp->prev; -- push_to_lru(bp, list); --} -- --static struct buf_cache_t *FAT_cache_get(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- bp = p_fs->FAT_cache_lru_list.prev; -- -- move_to_mru(bp, &p_fs->FAT_cache_lru_list); -- return bp; --} -- --static void FAT_cache_insert_hash(struct super_block *sb, -- struct buf_cache_t *bp) --{ -- s32 off; -- struct buf_cache_t *hp; -- struct fs_info_t *p_fs; -- -- p_fs = &(EXFAT_SB(sb)->fs_info); -- off = (bp->sec + -- (bp->sec >> p_fs->sectors_per_clu_bits)) & -- (FAT_CACHE_HASH_SIZE - 1); -- -- hp = &p_fs->FAT_cache_hash_list[off]; -- bp->hash_next = hp->hash_next; -- bp->hash_prev = hp; -- hp->hash_next->hash_prev = bp; -- hp->hash_next = bp; --} -- --static void FAT_cache_remove_hash(struct buf_cache_t *bp) --{ -- (bp->hash_prev)->hash_next = bp->hash_next; -- (bp->hash_next)->hash_prev = bp->hash_prev; --} -- --static void buf_cache_insert_hash(struct super_block *sb, -- struct buf_cache_t *bp) --{ -- s32 off; -- struct buf_cache_t *hp; -- struct fs_info_t *p_fs; -- -- p_fs = &(EXFAT_SB(sb)->fs_info); -- off = (bp->sec + -- (bp->sec >> p_fs->sectors_per_clu_bits)) & -- (BUF_CACHE_HASH_SIZE - 1); -- -- hp = &p_fs->buf_cache_hash_list[off]; -- bp->hash_next = hp->hash_next; -- bp->hash_prev = hp; -- hp->hash_next->hash_prev = bp; -- hp->hash_next = bp; --} -- --static void buf_cache_remove_hash(struct buf_cache_t *bp) --{ -- (bp->hash_prev)->hash_next = bp->hash_next; -- (bp->hash_next)->hash_prev = bp->hash_prev; --} -- --void exfat_buf_init(struct super_block *sb) --{ -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- int i; -- -- /* LRU list */ -- p_fs->FAT_cache_lru_list.next = &p_fs->FAT_cache_lru_list; -- p_fs->FAT_cache_lru_list.prev = &p_fs->FAT_cache_lru_list; -- -- for (i = 0; i < FAT_CACHE_SIZE; i++) { -- p_fs->FAT_cache_array[i].drv = -1; -- p_fs->FAT_cache_array[i].sec = ~0; -- p_fs->FAT_cache_array[i].flag = 0; -- p_fs->FAT_cache_array[i].buf_bh = NULL; -- p_fs->FAT_cache_array[i].prev = NULL; -- p_fs->FAT_cache_array[i].next = NULL; -- push_to_mru(&p_fs->FAT_cache_array[i], -- &p_fs->FAT_cache_lru_list); -- } -- -- p_fs->buf_cache_lru_list.next = &p_fs->buf_cache_lru_list; -- p_fs->buf_cache_lru_list.prev = &p_fs->buf_cache_lru_list; -- -- for (i = 0; i < BUF_CACHE_SIZE; i++) { -- p_fs->buf_cache_array[i].drv = -1; -- p_fs->buf_cache_array[i].sec = ~0; -- p_fs->buf_cache_array[i].flag = 0; -- p_fs->buf_cache_array[i].buf_bh = NULL; -- p_fs->buf_cache_array[i].prev = NULL; -- p_fs->buf_cache_array[i].next = NULL; -- push_to_mru(&p_fs->buf_cache_array[i], -- &p_fs->buf_cache_lru_list); -- } -- -- /* HASH list */ -- for (i = 0; i < FAT_CACHE_HASH_SIZE; i++) { -- p_fs->FAT_cache_hash_list[i].drv = -1; -- p_fs->FAT_cache_hash_list[i].sec = ~0; -- p_fs->FAT_cache_hash_list[i].hash_next = -- &p_fs->FAT_cache_hash_list[i]; -- p_fs->FAT_cache_hash_list[i].hash_prev = -- &p_fs->FAT_cache_hash_list[i]; -- } -- -- for (i = 0; i < FAT_CACHE_SIZE; i++) -- FAT_cache_insert_hash(sb, &p_fs->FAT_cache_array[i]); -- -- for (i = 0; i < BUF_CACHE_HASH_SIZE; i++) { -- p_fs->buf_cache_hash_list[i].drv = -1; -- p_fs->buf_cache_hash_list[i].sec = ~0; -- p_fs->buf_cache_hash_list[i].hash_next = -- &p_fs->buf_cache_hash_list[i]; -- p_fs->buf_cache_hash_list[i].hash_prev = -- &p_fs->buf_cache_hash_list[i]; -- } -- -- for (i = 0; i < BUF_CACHE_SIZE; i++) -- buf_cache_insert_hash(sb, &p_fs->buf_cache_array[i]); --} -- --void exfat_buf_shutdown(struct super_block *sb) --{ --} -- --static int __exfat_fat_read(struct super_block *sb, u32 loc, u32 *content) --{ -- s32 off; -- u32 _content; -- sector_t sec; -- u8 *fat_sector, *fat_entry; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- sec = p_fs->FAT1_start_sector + -- (loc >> (p_bd->sector_size_bits - 2)); -- off = (loc << 2) & p_bd->sector_size_mask; -- -- fat_sector = exfat_fat_getblk(sb, sec); -- if (!fat_sector) -- return -1; -- -- fat_entry = &fat_sector[off]; -- _content = GET32_A(fat_entry); -- -- if (_content >= CLUSTER_32(0xFFFFFFF8)) { -- *content = CLUSTER_32(~0); -- return 0; -- } -- *content = CLUSTER_32(_content); -- return 0; --} -- --/* in : sb, loc -- * out: content -- * returns 0 on success -- * -1 on error -- */ --int exfat_fat_read(struct super_block *sb, u32 loc, u32 *content) --{ -- s32 ret; -- -- mutex_lock(&f_mutex); -- ret = __exfat_fat_read(sb, loc, content); -- mutex_unlock(&f_mutex); -- -- return ret; --} -- --static s32 __exfat_fat_write(struct super_block *sb, u32 loc, u32 content) --{ -- s32 off; -- sector_t sec; -- u8 *fat_sector, *fat_entry; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- sec = p_fs->FAT1_start_sector + (loc >> -- (p_bd->sector_size_bits - 2)); -- off = (loc << 2) & p_bd->sector_size_mask; -- -- fat_sector = exfat_fat_getblk(sb, sec); -- if (!fat_sector) -- return -1; -- -- fat_entry = &fat_sector[off]; -- -- SET32_A(fat_entry, content); -- -- exfat_fat_modify(sb, sec); -- return 0; --} -- --int exfat_fat_write(struct super_block *sb, u32 loc, u32 content) --{ -- s32 ret; -- -- mutex_lock(&f_mutex); -- ret = __exfat_fat_write(sb, loc, content); -- mutex_unlock(&f_mutex); -- -- return ret; --} -- --u8 *exfat_fat_getblk(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- bp = FAT_cache_find(sb, sec); -- if (bp) { -- move_to_mru(bp, &p_fs->FAT_cache_lru_list); -- return bp->buf_bh->b_data; -- } -- -- bp = FAT_cache_get(sb, sec); -- -- FAT_cache_remove_hash(bp); -- -- bp->drv = p_fs->drv; -- bp->sec = sec; -- bp->flag = 0; -- -- FAT_cache_insert_hash(sb, bp); -- -- if (sector_read(sb, sec, &bp->buf_bh, 1) != 0) { -- FAT_cache_remove_hash(bp); -- bp->drv = -1; -- bp->sec = ~0; -- bp->flag = 0; -- bp->buf_bh = NULL; -- -- move_to_lru(bp, &p_fs->FAT_cache_lru_list); -- return NULL; -- } -- -- return bp->buf_bh->b_data; --} -- --void exfat_fat_modify(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- -- bp = FAT_cache_find(sb, sec); -- if (bp) -- sector_write(sb, sec, bp->buf_bh, 0); --} -- --void exfat_fat_release_all(struct super_block *sb) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- mutex_lock(&f_mutex); -- -- bp = p_fs->FAT_cache_lru_list.next; -- while (bp != &p_fs->FAT_cache_lru_list) { -- if (bp->drv == p_fs->drv) { -- bp->drv = -1; -- bp->sec = ~0; -- bp->flag = 0; -- -- if (bp->buf_bh) { -- __brelse(bp->buf_bh); -- bp->buf_bh = NULL; -- } -- } -- bp = bp->next; -- } -- -- mutex_unlock(&f_mutex); --} -- --void exfat_fat_sync(struct super_block *sb) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- mutex_lock(&f_mutex); -- -- bp = p_fs->FAT_cache_lru_list.next; -- while (bp != &p_fs->FAT_cache_lru_list) { -- if ((bp->drv == p_fs->drv) && (bp->flag & DIRTYBIT)) { -- sync_dirty_buffer(bp->buf_bh); -- bp->flag &= ~(DIRTYBIT); -- } -- bp = bp->next; -- } -- -- mutex_unlock(&f_mutex); --} -- --static struct buf_cache_t *buf_cache_find(struct super_block *sb, sector_t sec) --{ -- s32 off; -- struct buf_cache_t *bp, *hp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- off = (sec + (sec >> p_fs->sectors_per_clu_bits)) & -- (BUF_CACHE_HASH_SIZE - 1); -- -- hp = &p_fs->buf_cache_hash_list[off]; -- for (bp = hp->hash_next; bp != hp; bp = bp->hash_next) { -- if ((bp->drv == p_fs->drv) && (bp->sec == sec)) { -- touch_buffer(bp->buf_bh); -- return bp; -- } -- } -- return NULL; --} -- --static struct buf_cache_t *buf_cache_get(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- bp = p_fs->buf_cache_lru_list.prev; -- while (bp->flag & LOCKBIT) -- bp = bp->prev; -- -- move_to_mru(bp, &p_fs->buf_cache_lru_list); -- return bp; --} -- --static u8 *__exfat_buf_getblk(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- bp = buf_cache_find(sb, sec); -- if (bp) { -- move_to_mru(bp, &p_fs->buf_cache_lru_list); -- return bp->buf_bh->b_data; -- } -- -- bp = buf_cache_get(sb, sec); -- -- buf_cache_remove_hash(bp); -- -- bp->drv = p_fs->drv; -- bp->sec = sec; -- bp->flag = 0; -- -- buf_cache_insert_hash(sb, bp); -- -- if (sector_read(sb, sec, &bp->buf_bh, 1) != 0) { -- buf_cache_remove_hash(bp); -- bp->drv = -1; -- bp->sec = ~0; -- bp->flag = 0; -- bp->buf_bh = NULL; -- -- move_to_lru(bp, &p_fs->buf_cache_lru_list); -- return NULL; -- } -- -- return bp->buf_bh->b_data; --} -- --u8 *exfat_buf_getblk(struct super_block *sb, sector_t sec) --{ -- u8 *buf; -- -- mutex_lock(&b_mutex); -- buf = __exfat_buf_getblk(sb, sec); -- mutex_unlock(&b_mutex); -- -- return buf; --} -- --void exfat_buf_modify(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- -- mutex_lock(&b_mutex); -- -- bp = buf_cache_find(sb, sec); -- if (likely(bp)) -- sector_write(sb, sec, bp->buf_bh, 0); -- -- WARN(!bp, "[EXFAT] failed to find buffer_cache(sector:%llu).\n", -- (unsigned long long)sec); -- -- mutex_unlock(&b_mutex); --} -- --void exfat_buf_lock(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- -- mutex_lock(&b_mutex); -- -- bp = buf_cache_find(sb, sec); -- if (likely(bp)) -- bp->flag |= LOCKBIT; -- -- WARN(!bp, "[EXFAT] failed to find buffer_cache(sector:%llu).\n", -- (unsigned long long)sec); -- -- mutex_unlock(&b_mutex); --} -- --void exfat_buf_unlock(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- -- mutex_lock(&b_mutex); -- -- bp = buf_cache_find(sb, sec); -- if (likely(bp)) -- bp->flag &= ~(LOCKBIT); -- -- WARN(!bp, "[EXFAT] failed to find buffer_cache(sector:%llu).\n", -- (unsigned long long)sec); -- -- mutex_unlock(&b_mutex); --} -- --void exfat_buf_release(struct super_block *sb, sector_t sec) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- mutex_lock(&b_mutex); -- -- bp = buf_cache_find(sb, sec); -- if (likely(bp)) { -- bp->drv = -1; -- bp->sec = ~0; -- bp->flag = 0; -- -- if (bp->buf_bh) { -- __brelse(bp->buf_bh); -- bp->buf_bh = NULL; -- } -- -- move_to_lru(bp, &p_fs->buf_cache_lru_list); -- } -- -- mutex_unlock(&b_mutex); --} -- --void exfat_buf_release_all(struct super_block *sb) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- mutex_lock(&b_mutex); -- -- bp = p_fs->buf_cache_lru_list.next; -- while (bp != &p_fs->buf_cache_lru_list) { -- if (bp->drv == p_fs->drv) { -- bp->drv = -1; -- bp->sec = ~0; -- bp->flag = 0; -- -- if (bp->buf_bh) { -- __brelse(bp->buf_bh); -- bp->buf_bh = NULL; -- } -- } -- bp = bp->next; -- } -- -- mutex_unlock(&b_mutex); --} -- --void exfat_buf_sync(struct super_block *sb) --{ -- struct buf_cache_t *bp; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- mutex_lock(&b_mutex); -- -- bp = p_fs->buf_cache_lru_list.next; -- while (bp != &p_fs->buf_cache_lru_list) { -- if ((bp->drv == p_fs->drv) && (bp->flag & DIRTYBIT)) { -- sync_dirty_buffer(bp->buf_bh); -- bp->flag &= ~(DIRTYBIT); -- } -- bp = bp->next; -- } -- -- mutex_unlock(&b_mutex); --} -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/exfat_core.c linux-5.6.3/drivers/staging/exfat/exfat_core.c ---- linux-5.6.3.orig/drivers/staging/exfat/exfat_core.c 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/exfat_core.c 1970-01-01 02:00:00.000000000 +0200 -@@ -1,2582 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -- */ -- --#include --#include --#include --#include --#include --#include --#include "exfat.h" -- --static void __set_sb_dirty(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- sbi->s_dirt = 1; --} -- --static u8 name_buf[MAX_PATH_LENGTH * MAX_CHARSET_SIZE]; -- --static u8 free_bit[] = { -- 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, /* 0 ~ 19 */ -- 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, /* 20 ~ 39 */ -- 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, /* 40 ~ 59 */ -- 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, /* 60 ~ 79 */ -- 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, /* 80 ~ 99 */ -- 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, /* 100 ~ 119 */ -- 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, /* 120 ~ 139 */ -- 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, /* 140 ~ 159 */ -- 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, /* 160 ~ 179 */ -- 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, /* 180 ~ 199 */ -- 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, /* 200 ~ 219 */ -- 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, /* 220 ~ 239 */ -- 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 240 ~ 254 */ --}; -- --static u8 used_bit[] = { -- 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, /* 0 ~ 19 */ -- 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, /* 20 ~ 39 */ -- 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, /* 40 ~ 59 */ -- 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, /* 60 ~ 79 */ -- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, /* 80 ~ 99 */ -- 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, /* 100 ~ 119 */ -- 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, /* 120 ~ 139 */ -- 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, /* 140 ~ 159 */ -- 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, /* 160 ~ 179 */ -- 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, /* 180 ~ 199 */ -- 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, /* 200 ~ 219 */ -- 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, /* 220 ~ 239 */ -- 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 /* 240 ~ 255 */ --}; -- --#define BITMAP_LOC(v) ((v) >> 3) --#define BITMAP_SHIFT(v) ((v) & 0x07) -- --static inline s32 exfat_bitmap_test(u8 *bitmap, int i) --{ -- u8 data; -- -- data = bitmap[BITMAP_LOC(i)]; -- if ((data >> BITMAP_SHIFT(i)) & 0x01) -- return 1; -- return 0; --} -- --static inline void exfat_bitmap_set(u8 *bitmap, int i) --{ -- bitmap[BITMAP_LOC(i)] |= (0x01 << BITMAP_SHIFT(i)); --} -- --static inline void exfat_bitmap_clear(u8 *bitmap, int i) --{ -- bitmap[BITMAP_LOC(i)] &= ~(0x01 << BITMAP_SHIFT(i)); --} -- --/* -- * File System Management Functions -- */ -- --void fs_set_vol_flags(struct super_block *sb, u32 new_flag) --{ -- struct pbr_sector_t *p_pbr; -- struct bpbex_t *p_bpb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (p_fs->vol_flag == new_flag) -- return; -- -- p_fs->vol_flag = new_flag; -- -- if (!p_fs->pbr_bh) { -- if (sector_read(sb, p_fs->PBR_sector, -- &p_fs->pbr_bh, 1) != 0) -- return; -- } -- -- p_pbr = (struct pbr_sector_t *)p_fs->pbr_bh->b_data; -- p_bpb = (struct bpbex_t *)p_pbr->bpb; -- SET16(p_bpb->vol_flags, (u16)new_flag); -- -- /* XXX duyoung -- * what can we do here? (cuz fs_set_vol_flags() is void) -- */ -- if ((new_flag == VOL_DIRTY) && (!buffer_dirty(p_fs->pbr_bh))) -- sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 1); -- else -- sector_write(sb, p_fs->PBR_sector, p_fs->pbr_bh, 0); --} -- --void fs_error(struct super_block *sb) --{ -- struct exfat_mount_options *opts = &EXFAT_SB(sb)->options; -- -- if (opts->errors == EXFAT_ERRORS_PANIC) { -- panic("[EXFAT] Filesystem panic from previous error\n"); -- } else if ((opts->errors == EXFAT_ERRORS_RO) && !sb_rdonly(sb)) { -- sb->s_flags |= SB_RDONLY; -- pr_err("[EXFAT] Filesystem has been set read-only\n"); -- } --} -- --/* -- * Cluster Management Functions -- */ -- --static s32 clear_cluster(struct super_block *sb, u32 clu) --{ -- sector_t s, n; -- s32 ret = 0; -- struct buffer_head *tmp_bh = NULL; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- if (clu == CLUSTER_32(0)) { /* FAT16 root_dir */ -- s = p_fs->root_start_sector; -- n = p_fs->data_start_sector; -- } else { -- s = START_SECTOR(clu); -- n = s + p_fs->sectors_per_clu; -- } -- -- for (; s < n; s++) { -- ret = sector_read(sb, s, &tmp_bh, 0); -- if (ret != 0) -- return ret; -- -- memset((char *)tmp_bh->b_data, 0x0, p_bd->sector_size); -- ret = sector_write(sb, s, tmp_bh, 0); -- if (ret != 0) -- break; -- } -- -- brelse(tmp_bh); -- return ret; --} -- --static s32 set_alloc_bitmap(struct super_block *sb, u32 clu) --{ -- int i, b; -- sector_t sector; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- i = clu >> (p_bd->sector_size_bits + 3); -- b = clu & ((p_bd->sector_size << 3) - 1); -- -- sector = START_SECTOR(p_fs->map_clu) + i; -- -- exfat_bitmap_set((u8 *)p_fs->vol_amap[i]->b_data, b); -- -- return sector_write(sb, sector, p_fs->vol_amap[i], 0); --} -- --static s32 clr_alloc_bitmap(struct super_block *sb, u32 clu) --{ -- int i, b; -- sector_t sector; --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct exfat_mount_options *opts = &sbi->options; -- int ret; --#endif /* CONFIG_STAGING_EXFAT_DISCARD */ -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- i = clu >> (p_bd->sector_size_bits + 3); -- b = clu & ((p_bd->sector_size << 3) - 1); -- -- sector = START_SECTOR(p_fs->map_clu) + i; -- -- exfat_bitmap_clear((u8 *)p_fs->vol_amap[i]->b_data, b); -- --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- if (opts->discard) { -- ret = sb_issue_discard(sb, START_SECTOR(clu), -- (1 << p_fs->sectors_per_clu_bits), -- GFP_NOFS, 0); -- if (ret == -EOPNOTSUPP) { -- pr_warn("discard not supported by device, disabling"); -- opts->discard = 0; -- } else { -- return ret; -- } -- } --#endif /* CONFIG_STAGING_EXFAT_DISCARD */ -- -- return sector_write(sb, sector, p_fs->vol_amap[i], 0); --} -- --static u32 test_alloc_bitmap(struct super_block *sb, u32 clu) --{ -- int i, map_i, map_b; -- u32 clu_base, clu_free; -- u8 k, clu_mask; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- clu_base = (clu & ~(0x7)) + 2; -- clu_mask = (1 << (clu - clu_base + 2)) - 1; -- -- map_i = clu >> (p_bd->sector_size_bits + 3); -- map_b = (clu >> 3) & p_bd->sector_size_mask; -- -- for (i = 2; i < p_fs->num_clusters; i += 8) { -- k = *(((u8 *)p_fs->vol_amap[map_i]->b_data) + map_b); -- if (clu_mask > 0) { -- k |= clu_mask; -- clu_mask = 0; -- } -- if (k < 0xFF) { -- clu_free = clu_base + free_bit[k]; -- if (clu_free < p_fs->num_clusters) -- return clu_free; -- } -- clu_base += 8; -- -- if (((++map_b) >= p_bd->sector_size) || -- (clu_base >= p_fs->num_clusters)) { -- if ((++map_i) >= p_fs->map_sectors) { -- clu_base = 2; -- map_i = 0; -- } -- map_b = 0; -- } -- } -- -- return CLUSTER_32(~0); --} -- --s32 exfat_alloc_cluster(struct super_block *sb, s32 num_alloc, -- struct chain_t *p_chain) --{ -- s32 num_clusters = 0; -- u32 hint_clu, new_clu, last_clu = CLUSTER_32(~0); -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- hint_clu = p_chain->dir; -- if (hint_clu == CLUSTER_32(~0)) { -- hint_clu = test_alloc_bitmap(sb, p_fs->clu_srch_ptr - 2); -- if (hint_clu == CLUSTER_32(~0)) -- return 0; -- } else if (hint_clu >= p_fs->num_clusters) { -- hint_clu = 2; -- p_chain->flags = 0x01; -- } -- -- __set_sb_dirty(sb); -- -- p_chain->dir = CLUSTER_32(~0); -- -- while ((new_clu = test_alloc_bitmap(sb, hint_clu - 2)) != CLUSTER_32(~0)) { -- if (new_clu != hint_clu) { -- if (p_chain->flags == 0x03) { -- exfat_chain_cont_cluster(sb, p_chain->dir, -- num_clusters); -- p_chain->flags = 0x01; -- } -- } -- -- if (set_alloc_bitmap(sb, new_clu - 2) != 0) -- return -EIO; -- -- num_clusters++; -- -- if (p_chain->flags == 0x01) { -- if (exfat_fat_write(sb, new_clu, CLUSTER_32(~0)) < 0) -- return -EIO; -- } -- -- if (p_chain->dir == CLUSTER_32(~0)) { -- p_chain->dir = new_clu; -- } else { -- if (p_chain->flags == 0x01) { -- if (exfat_fat_write(sb, last_clu, new_clu) < 0) -- return -EIO; -- } -- } -- last_clu = new_clu; -- -- if ((--num_alloc) == 0) { -- p_fs->clu_srch_ptr = hint_clu; -- if (p_fs->used_clusters != UINT_MAX) -- p_fs->used_clusters += num_clusters; -- -- p_chain->size += num_clusters; -- return num_clusters; -- } -- -- hint_clu = new_clu + 1; -- if (hint_clu >= p_fs->num_clusters) { -- hint_clu = 2; -- -- if (p_chain->flags == 0x03) { -- exfat_chain_cont_cluster(sb, p_chain->dir, -- num_clusters); -- p_chain->flags = 0x01; -- } -- } -- } -- -- p_fs->clu_srch_ptr = hint_clu; -- if (p_fs->used_clusters != UINT_MAX) -- p_fs->used_clusters += num_clusters; -- -- p_chain->size += num_clusters; -- return num_clusters; --} -- --void exfat_free_cluster(struct super_block *sb, struct chain_t *p_chain, -- s32 do_relse) --{ -- s32 num_clusters = 0; -- u32 clu; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- int i; -- sector_t sector; -- -- if ((p_chain->dir == CLUSTER_32(0)) || (p_chain->dir == CLUSTER_32(~0))) -- return; -- -- if (p_chain->size <= 0) { -- pr_err("[EXFAT] free_cluster : skip free-req clu:%u, because of zero-size truncation\n", -- p_chain->dir); -- return; -- } -- -- __set_sb_dirty(sb); -- clu = p_chain->dir; -- -- if (p_chain->flags == 0x03) { -- do { -- if (do_relse) { -- sector = START_SECTOR(clu); -- for (i = 0; i < p_fs->sectors_per_clu; i++) -- exfat_buf_release(sb, sector + i); -- } -- -- if (clr_alloc_bitmap(sb, clu - 2) != 0) -- break; -- clu++; -- -- num_clusters++; -- } while (num_clusters < p_chain->size); -- } else { -- do { -- if (p_fs->dev_ejected) -- break; -- -- if (do_relse) { -- sector = START_SECTOR(clu); -- for (i = 0; i < p_fs->sectors_per_clu; i++) -- exfat_buf_release(sb, sector + i); -- } -- -- if (clr_alloc_bitmap(sb, clu - 2) != 0) -- break; -- -- if (exfat_fat_read(sb, clu, &clu) == -1) -- break; -- num_clusters++; -- } while ((clu != CLUSTER_32(0)) && (clu != CLUSTER_32(~0))); -- } -- -- if (p_fs->used_clusters != UINT_MAX) -- p_fs->used_clusters -= num_clusters; --} -- --static u32 find_last_cluster(struct super_block *sb, struct chain_t *p_chain) --{ -- u32 clu, next; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- clu = p_chain->dir; -- -- if (p_chain->flags == 0x03) { -- clu += p_chain->size - 1; -- } else { -- while ((exfat_fat_read(sb, clu, &next) == 0) && -- (next != CLUSTER_32(~0))) { -- if (p_fs->dev_ejected) -- break; -- clu = next; -- } -- } -- -- return clu; --} -- --s32 count_num_clusters(struct super_block *sb, struct chain_t *p_chain) --{ -- int i, count = 0; -- u32 clu; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if ((p_chain->dir == CLUSTER_32(0)) || (p_chain->dir == CLUSTER_32(~0))) -- return 0; -- -- clu = p_chain->dir; -- -- if (p_chain->flags == 0x03) { -- count = p_chain->size; -- } else { -- for (i = 2; i < p_fs->num_clusters; i++) { -- count++; -- if (exfat_fat_read(sb, clu, &clu) != 0) -- return 0; -- if (clu == CLUSTER_32(~0)) -- break; -- } -- } -- -- return count; --} -- --s32 exfat_count_used_clusters(struct super_block *sb) --{ -- int i, map_i, map_b, count = 0; -- u8 k; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- map_i = 0; -- map_b = 0; -- -- for (i = 2; i < p_fs->num_clusters; i += 8) { -- k = *(((u8 *)p_fs->vol_amap[map_i]->b_data) + map_b); -- count += used_bit[k]; -- -- if ((++map_b) >= p_bd->sector_size) { -- map_i++; -- map_b = 0; -- } -- } -- -- return count; --} -- --void exfat_chain_cont_cluster(struct super_block *sb, u32 chain, s32 len) --{ -- if (len == 0) -- return; -- -- while (len > 1) { -- if (exfat_fat_write(sb, chain, chain + 1) < 0) -- break; -- chain++; -- len--; -- } -- exfat_fat_write(sb, chain, CLUSTER_32(~0)); --} -- --/* -- * Allocation Bitmap Management Functions -- */ -- --s32 load_alloc_bitmap(struct super_block *sb) --{ -- int i, j, ret; -- u32 map_size; -- u32 type; -- sector_t sector; -- struct chain_t clu; -- struct bmap_dentry_t *ep; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- clu.dir = p_fs->root_dir; -- clu.flags = 0x01; -- -- while (clu.dir != CLUSTER_32(~0)) { -- if (p_fs->dev_ejected) -- break; -- -- for (i = 0; i < p_fs->dentries_per_clu; i++) { -- ep = (struct bmap_dentry_t *)get_entry_in_dir(sb, &clu, -- i, NULL); -- if (!ep) -- return -ENOENT; -- -- type = exfat_get_entry_type((struct dentry_t *)ep); -- -- if (type == TYPE_UNUSED) -- break; -- if (type != TYPE_BITMAP) -- continue; -- -- if (ep->flags == 0x0) { -- p_fs->map_clu = GET32_A(ep->start_clu); -- map_size = (u32)GET64_A(ep->size); -- -- p_fs->map_sectors = ((map_size - 1) >> p_bd->sector_size_bits) + 1; -- -- p_fs->vol_amap = kmalloc_array(p_fs->map_sectors, -- sizeof(struct buffer_head *), -- GFP_KERNEL); -- if (!p_fs->vol_amap) -- return -ENOMEM; -- -- sector = START_SECTOR(p_fs->map_clu); -- -- for (j = 0; j < p_fs->map_sectors; j++) { -- p_fs->vol_amap[j] = NULL; -- ret = sector_read(sb, sector + j, &p_fs->vol_amap[j], 1); -- if (ret != 0) { -- /* release all buffers and free vol_amap */ -- i = 0; -- while (i < j) -- brelse(p_fs->vol_amap[i++]); -- -- kfree(p_fs->vol_amap); -- p_fs->vol_amap = NULL; -- return ret; -- } -- } -- -- p_fs->pbr_bh = NULL; -- return 0; -- } -- } -- -- if (exfat_fat_read(sb, clu.dir, &clu.dir) != 0) -- return -EIO; -- } -- -- return -EFSCORRUPTED; --} -- --void free_alloc_bitmap(struct super_block *sb) --{ -- int i; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- brelse(p_fs->pbr_bh); -- -- for (i = 0; i < p_fs->map_sectors; i++) -- __brelse(p_fs->vol_amap[i]); -- -- kfree(p_fs->vol_amap); -- p_fs->vol_amap = NULL; --} -- --void sync_alloc_bitmap(struct super_block *sb) --{ -- int i; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (!p_fs->vol_amap) -- return; -- -- for (i = 0; i < p_fs->map_sectors; i++) -- sync_dirty_buffer(p_fs->vol_amap[i]); --} -- --/* -- * Upcase table Management Functions -- */ --static s32 __load_upcase_table(struct super_block *sb, sector_t sector, -- u32 num_sectors, u32 utbl_checksum) --{ -- int i, ret = -EINVAL; -- u32 j; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- struct buffer_head *tmp_bh = NULL; -- sector_t end_sector = num_sectors + sector; -- -- bool skip = false; -- u32 index = 0; -- u16 uni = 0; -- u16 **upcase_table; -- -- u32 checksum = 0; -- -- upcase_table = kmalloc_array(UTBL_COL_COUNT, sizeof(u16 *), GFP_KERNEL); -- p_fs->vol_utbl = upcase_table; -- if (!upcase_table) -- return -ENOMEM; -- memset(upcase_table, 0, UTBL_COL_COUNT * sizeof(u16 *)); -- -- while (sector < end_sector) { -- ret = sector_read(sb, sector, &tmp_bh, 1); -- if (ret != 0) { -- pr_debug("sector read (0x%llX)fail\n", -- (unsigned long long)sector); -- goto error; -- } -- sector++; -- -- for (i = 0; i < p_bd->sector_size && index <= 0xFFFF; i += 2) { -- uni = GET16(((u8 *)tmp_bh->b_data) + i); -- -- checksum = ((checksum & 1) ? 0x80000000 : 0) + -- (checksum >> 1) + *(((u8 *)tmp_bh->b_data) + -- i); -- checksum = ((checksum & 1) ? 0x80000000 : 0) + -- (checksum >> 1) + *(((u8 *)tmp_bh->b_data) + -- (i + 1)); -- -- if (skip) { -- pr_debug("skip from 0x%X ", index); -- index += uni; -- pr_debug("to 0x%X (amount of 0x%X)\n", -- index, uni); -- skip = false; -- } else if (uni == index) { -- index++; -- } else if (uni == 0xFFFF) { -- skip = true; -- } else { /* uni != index , uni != 0xFFFF */ -- u16 col_index = get_col_index(index); -- -- if (!upcase_table[col_index]) { -- pr_debug("alloc = 0x%X\n", col_index); -- upcase_table[col_index] = kmalloc_array(UTBL_ROW_COUNT, -- sizeof(u16), GFP_KERNEL); -- if (!upcase_table[col_index]) { -- ret = -ENOMEM; -- goto error; -- } -- -- for (j = 0; j < UTBL_ROW_COUNT; j++) -- upcase_table[col_index][j] = (col_index << LOW_INDEX_BIT) | j; -- } -- -- upcase_table[col_index][get_row_index(index)] = uni; -- index++; -- } -- } -- } -- if (index >= 0xFFFF && utbl_checksum == checksum) { -- if (tmp_bh) -- brelse(tmp_bh); -- return 0; -- } -- ret = -EINVAL; --error: -- if (tmp_bh) -- brelse(tmp_bh); -- free_upcase_table(sb); -- return ret; --} -- --static s32 __load_default_upcase_table(struct super_block *sb) --{ -- int i, ret = -EINVAL; -- u32 j; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- bool skip = false; -- u32 index = 0; -- u16 uni = 0; -- u16 **upcase_table; -- -- upcase_table = kmalloc_array(UTBL_COL_COUNT, sizeof(u16 *), GFP_KERNEL); -- p_fs->vol_utbl = upcase_table; -- if (!upcase_table) -- return -ENOMEM; -- memset(upcase_table, 0, UTBL_COL_COUNT * sizeof(u16 *)); -- -- for (i = 0; index <= 0xFFFF && i < NUM_UPCASE * 2; i += 2) { -- uni = GET16(uni_upcase + i); -- if (skip) { -- pr_debug("skip from 0x%X ", index); -- index += uni; -- pr_debug("to 0x%X (amount of 0x%X)\n", index, uni); -- skip = false; -- } else if (uni == index) { -- index++; -- } else if (uni == 0xFFFF) { -- skip = true; -- } else { /* uni != index , uni != 0xFFFF */ -- u16 col_index = get_col_index(index); -- -- if (!upcase_table[col_index]) { -- pr_debug("alloc = 0x%X\n", col_index); -- upcase_table[col_index] = kmalloc_array(UTBL_ROW_COUNT, -- sizeof(u16), -- GFP_KERNEL); -- if (!upcase_table[col_index]) { -- ret = -ENOMEM; -- goto error; -- } -- -- for (j = 0; j < UTBL_ROW_COUNT; j++) -- upcase_table[col_index][j] = (col_index << LOW_INDEX_BIT) | j; -- } -- -- upcase_table[col_index][get_row_index(index)] = uni; -- index++; -- } -- } -- -- if (index >= 0xFFFF) -- return 0; -- --error: -- /* FATAL error: default upcase table has error */ -- free_upcase_table(sb); -- return ret; --} -- --s32 load_upcase_table(struct super_block *sb) --{ -- int i; -- u32 tbl_clu, tbl_size; -- sector_t sector; -- u32 type, num_sectors; -- struct chain_t clu; -- struct case_dentry_t *ep; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- clu.dir = p_fs->root_dir; -- clu.flags = 0x01; -- -- if (p_fs->dev_ejected) -- return -EIO; -- -- while (clu.dir != CLUSTER_32(~0)) { -- for (i = 0; i < p_fs->dentries_per_clu; i++) { -- ep = (struct case_dentry_t *)get_entry_in_dir(sb, &clu, -- i, NULL); -- if (!ep) -- return -ENOENT; -- -- type = exfat_get_entry_type((struct dentry_t *)ep); -- -- if (type == TYPE_UNUSED) -- break; -- if (type != TYPE_UPCASE) -- continue; -- -- tbl_clu = GET32_A(ep->start_clu); -- tbl_size = (u32)GET64_A(ep->size); -- -- sector = START_SECTOR(tbl_clu); -- num_sectors = ((tbl_size - 1) >> p_bd->sector_size_bits) + 1; -- if (__load_upcase_table(sb, sector, num_sectors, -- GET32_A(ep->checksum)) != 0) -- break; -- return 0; -- } -- if (exfat_fat_read(sb, clu.dir, &clu.dir) != 0) -- return -EIO; -- } -- /* load default upcase table */ -- return __load_default_upcase_table(sb); --} -- --void free_upcase_table(struct super_block *sb) --{ -- u32 i; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- u16 **upcase_table; -- -- upcase_table = p_fs->vol_utbl; -- for (i = 0; i < UTBL_COL_COUNT; i++) -- kfree(upcase_table[i]); -- -- kfree(p_fs->vol_utbl); -- p_fs->vol_utbl = NULL; --} -- --/* -- * Directory Entry Management Functions -- */ -- --u32 exfat_get_entry_type(struct dentry_t *p_entry) --{ -- struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; -- -- if (ep->type == 0x0) { -- return TYPE_UNUSED; -- } else if (ep->type < 0x80) { -- return TYPE_DELETED; -- } else if (ep->type == 0x80) { -- return TYPE_INVALID; -- } else if (ep->type < 0xA0) { -- if (ep->type == 0x81) { -- return TYPE_BITMAP; -- } else if (ep->type == 0x82) { -- return TYPE_UPCASE; -- } else if (ep->type == 0x83) { -- return TYPE_VOLUME; -- } else if (ep->type == 0x85) { -- if (GET16_A(ep->attr) & ATTR_SUBDIR) -- return TYPE_DIR; -- else -- return TYPE_FILE; -- } -- return TYPE_CRITICAL_PRI; -- } else if (ep->type < 0xC0) { -- if (ep->type == 0xA0) -- return TYPE_GUID; -- else if (ep->type == 0xA1) -- return TYPE_PADDING; -- else if (ep->type == 0xA2) -- return TYPE_ACLTAB; -- return TYPE_BENIGN_PRI; -- } else if (ep->type < 0xE0) { -- if (ep->type == 0xC0) -- return TYPE_STREAM; -- else if (ep->type == 0xC1) -- return TYPE_EXTEND; -- else if (ep->type == 0xC2) -- return TYPE_ACL; -- return TYPE_CRITICAL_SEC; -- } -- -- return TYPE_BENIGN_SEC; --} -- --static void exfat_set_entry_type(struct dentry_t *p_entry, u32 type) --{ -- struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; -- -- if (type == TYPE_UNUSED) { -- ep->type = 0x0; -- } else if (type == TYPE_DELETED) { -- ep->type &= ~0x80; -- } else if (type == TYPE_STREAM) { -- ep->type = 0xC0; -- } else if (type == TYPE_EXTEND) { -- ep->type = 0xC1; -- } else if (type == TYPE_BITMAP) { -- ep->type = 0x81; -- } else if (type == TYPE_UPCASE) { -- ep->type = 0x82; -- } else if (type == TYPE_VOLUME) { -- ep->type = 0x83; -- } else if (type == TYPE_DIR) { -- ep->type = 0x85; -- SET16_A(ep->attr, ATTR_SUBDIR); -- } else if (type == TYPE_FILE) { -- ep->type = 0x85; -- SET16_A(ep->attr, ATTR_ARCHIVE); -- } else if (type == TYPE_SYMLINK) { -- ep->type = 0x85; -- SET16_A(ep->attr, ATTR_ARCHIVE | ATTR_SYMLINK); -- } --} -- --u32 exfat_get_entry_attr(struct dentry_t *p_entry) --{ -- struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; -- -- return (u32)GET16_A(ep->attr); --} -- --void exfat_set_entry_attr(struct dentry_t *p_entry, u32 attr) --{ -- struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; -- -- SET16_A(ep->attr, (u16)attr); --} -- --u8 exfat_get_entry_flag(struct dentry_t *p_entry) --{ -- struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry; -- -- return ep->flags; --} -- --void exfat_set_entry_flag(struct dentry_t *p_entry, u8 flags) --{ -- struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry; -- -- ep->flags = flags; --} -- --u32 exfat_get_entry_clu0(struct dentry_t *p_entry) --{ -- struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry; -- -- return GET32_A(ep->start_clu); --} -- --void exfat_set_entry_clu0(struct dentry_t *p_entry, u32 start_clu) --{ -- struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry; -- -- SET32_A(ep->start_clu, start_clu); --} -- --u64 exfat_get_entry_size(struct dentry_t *p_entry) --{ -- struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry; -- -- return GET64_A(ep->valid_size); --} -- --void exfat_set_entry_size(struct dentry_t *p_entry, u64 size) --{ -- struct strm_dentry_t *ep = (struct strm_dentry_t *)p_entry; -- -- SET64_A(ep->valid_size, size); -- SET64_A(ep->size, size); --} -- --void exfat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, -- u8 mode) --{ -- u16 t = 0x00, d = 0x21; -- struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; -- -- switch (mode) { -- case TM_CREATE: -- t = GET16_A(ep->create_time); -- d = GET16_A(ep->create_date); -- break; -- case TM_MODIFY: -- t = GET16_A(ep->modify_time); -- d = GET16_A(ep->modify_date); -- break; -- case TM_ACCESS: -- t = GET16_A(ep->access_time); -- d = GET16_A(ep->access_date); -- break; -- } -- -- tp->sec = (t & 0x001F) << 1; -- tp->min = (t >> 5) & 0x003F; -- tp->hour = (t >> 11); -- tp->day = (d & 0x001F); -- tp->mon = (d >> 5) & 0x000F; -- tp->year = (d >> 9); --} -- --void exfat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, -- u8 mode) --{ -- u16 t, d; -- struct file_dentry_t *ep = (struct file_dentry_t *)p_entry; -- -- t = (tp->hour << 11) | (tp->min << 5) | (tp->sec >> 1); -- d = (tp->year << 9) | (tp->mon << 5) | tp->day; -- -- switch (mode) { -- case TM_CREATE: -- SET16_A(ep->create_time, t); -- SET16_A(ep->create_date, d); -- break; -- case TM_MODIFY: -- SET16_A(ep->modify_time, t); -- SET16_A(ep->modify_date, d); -- break; -- case TM_ACCESS: -- SET16_A(ep->access_time, t); -- SET16_A(ep->access_date, d); -- break; -- } --} -- --static void init_file_entry(struct file_dentry_t *ep, u32 type) --{ -- struct timestamp_t tm, *tp; -- -- exfat_set_entry_type((struct dentry_t *)ep, type); -- -- tp = tm_current(&tm); -- exfat_set_entry_time((struct dentry_t *)ep, tp, TM_CREATE); -- exfat_set_entry_time((struct dentry_t *)ep, tp, TM_MODIFY); -- exfat_set_entry_time((struct dentry_t *)ep, tp, TM_ACCESS); -- ep->create_time_ms = 0; -- ep->modify_time_ms = 0; -- ep->access_time_ms = 0; --} -- --static void init_strm_entry(struct strm_dentry_t *ep, u8 flags, u32 start_clu, u64 size) --{ -- exfat_set_entry_type((struct dentry_t *)ep, TYPE_STREAM); -- ep->flags = flags; -- SET32_A(ep->start_clu, start_clu); -- SET64_A(ep->valid_size, size); -- SET64_A(ep->size, size); --} -- --static void init_name_entry(struct name_dentry_t *ep, u16 *uniname) --{ -- int i; -- -- exfat_set_entry_type((struct dentry_t *)ep, TYPE_EXTEND); -- ep->flags = 0x0; -- -- for (i = 0; i < 30; i++, i++) { -- SET16_A(ep->unicode_0_14 + i, *uniname); -- if (*uniname == 0x0) -- break; -- uniname++; -- } --} -- --static s32 exfat_init_dir_entry(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, u32 type, u32 start_clu, u64 size) --{ -- sector_t sector; -- u8 flags; -- struct file_dentry_t *file_ep; -- struct strm_dentry_t *strm_ep; -- -- flags = (type == TYPE_FILE) ? 0x01 : 0x03; -- -- /* we cannot use get_entry_set_in_dir here because file ep is not initialized yet */ -- file_ep = (struct file_dentry_t *)get_entry_in_dir(sb, p_dir, entry, -- §or); -- if (!file_ep) -- return -ENOENT; -- -- strm_ep = (struct strm_dentry_t *)get_entry_in_dir(sb, p_dir, entry + 1, -- §or); -- if (!strm_ep) -- return -ENOENT; -- -- init_file_entry(file_ep, type); -- exfat_buf_modify(sb, sector); -- -- init_strm_entry(strm_ep, flags, start_clu, size); -- exfat_buf_modify(sb, sector); -- -- return 0; --} -- --static s32 exfat_init_ext_entry(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, s32 num_entries, -- struct uni_name_t *p_uniname, -- struct dos_name_t *p_dosname) --{ -- int i; -- sector_t sector; -- u16 *uniname = p_uniname->name; -- struct file_dentry_t *file_ep; -- struct strm_dentry_t *strm_ep; -- struct name_dentry_t *name_ep; -- -- file_ep = (struct file_dentry_t *)get_entry_in_dir(sb, p_dir, entry, -- §or); -- if (!file_ep) -- return -ENOENT; -- -- file_ep->num_ext = (u8)(num_entries - 1); -- exfat_buf_modify(sb, sector); -- -- strm_ep = (struct strm_dentry_t *)get_entry_in_dir(sb, p_dir, entry + 1, -- §or); -- if (!strm_ep) -- return -ENOENT; -- -- strm_ep->name_len = p_uniname->name_len; -- SET16_A(strm_ep->name_hash, p_uniname->name_hash); -- exfat_buf_modify(sb, sector); -- -- for (i = 2; i < num_entries; i++) { -- name_ep = (struct name_dentry_t *)get_entry_in_dir(sb, p_dir, -- entry + i, -- §or); -- if (!name_ep) -- return -ENOENT; -- -- init_name_entry(name_ep, uniname); -- exfat_buf_modify(sb, sector); -- uniname += 15; -- } -- -- update_dir_checksum(sb, p_dir, entry); -- -- return 0; --} -- --void exfat_delete_dir_entry(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, s32 order, s32 num_entries) --{ -- int i; -- sector_t sector; -- struct dentry_t *ep; -- -- for (i = order; i < num_entries; i++) { -- ep = get_entry_in_dir(sb, p_dir, entry + i, §or); -- if (!ep) -- return; -- -- exfat_set_entry_type(ep, TYPE_DELETED); -- exfat_buf_modify(sb, sector); -- } --} -- --void update_dir_checksum(struct super_block *sb, struct chain_t *p_dir, -- s32 entry) --{ -- int i, num_entries; -- sector_t sector; -- u16 chksum; -- struct file_dentry_t *file_ep; -- struct dentry_t *ep; -- -- file_ep = (struct file_dentry_t *)get_entry_in_dir(sb, p_dir, entry, -- §or); -- if (!file_ep) -- return; -- -- exfat_buf_lock(sb, sector); -- -- num_entries = (s32)file_ep->num_ext + 1; -- chksum = calc_checksum_2byte((void *)file_ep, DENTRY_SIZE, 0, -- CS_DIR_ENTRY); -- -- for (i = 1; i < num_entries; i++) { -- ep = get_entry_in_dir(sb, p_dir, entry + i, NULL); -- if (!ep) { -- exfat_buf_unlock(sb, sector); -- return; -- } -- -- chksum = calc_checksum_2byte((void *)ep, DENTRY_SIZE, chksum, -- CS_DEFAULT); -- } -- -- SET16_A(file_ep->checksum, chksum); -- exfat_buf_modify(sb, sector); -- exfat_buf_unlock(sb, sector); --} -- --static s32 __write_partial_entries_in_entry_set(struct super_block *sb, -- struct entry_set_cache_t *es, -- sector_t sec, s32 off, u32 count) --{ -- s32 num_entries, buf_off = (off - es->offset); -- u32 remaining_byte_in_sector, copy_entries; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- u32 clu; -- u8 *buf, *esbuf = (u8 *)&es->__buf; -- -- pr_debug("%s entered es %p sec %llu off %d count %d\n", -- __func__, es, (unsigned long long)sec, off, count); -- num_entries = count; -- -- while (num_entries) { -- /* white per sector base */ -- remaining_byte_in_sector = (1 << p_bd->sector_size_bits) - off; -- copy_entries = min_t(s32, -- remaining_byte_in_sector >> DENTRY_SIZE_BITS, -- num_entries); -- buf = exfat_buf_getblk(sb, sec); -- if (!buf) -- goto err_out; -- pr_debug("es->buf %p buf_off %u\n", esbuf, buf_off); -- pr_debug("copying %d entries from %p to sector %llu\n", -- copy_entries, (esbuf + buf_off), -- (unsigned long long)sec); -- memcpy(buf + off, esbuf + buf_off, -- copy_entries << DENTRY_SIZE_BITS); -- exfat_buf_modify(sb, sec); -- num_entries -= copy_entries; -- -- if (num_entries) { -- /* get next sector */ -- if (IS_LAST_SECTOR_IN_CLUSTER(sec)) { -- clu = GET_CLUSTER_FROM_SECTOR(sec); -- if (es->alloc_flag == 0x03) { -- clu++; -- } else { -- if (exfat_fat_read(sb, clu, &clu) == -1) -- goto err_out; -- } -- sec = START_SECTOR(clu); -- } else { -- sec++; -- } -- off = 0; -- buf_off += copy_entries << DENTRY_SIZE_BITS; -- } -- } -- -- pr_debug("%s exited successfully\n", __func__); -- return 0; --err_out: -- pr_debug("%s failed\n", __func__); -- return -EINVAL; --} -- --/* write back all entries in entry set */ --static s32 write_whole_entry_set(struct super_block *sb, struct entry_set_cache_t *es) --{ -- return __write_partial_entries_in_entry_set(sb, es, es->sector, -- es->offset, -- es->num_entries); --} -- --void update_dir_checksum_with_entry_set(struct super_block *sb, -- struct entry_set_cache_t *es) --{ -- struct dentry_t *ep; -- u16 chksum = 0; -- s32 chksum_type = CS_DIR_ENTRY, i; -- -- ep = (struct dentry_t *)&es->__buf; -- for (i = 0; i < es->num_entries; i++) { -- pr_debug("%s ep %p\n", __func__, ep); -- chksum = calc_checksum_2byte((void *)ep, DENTRY_SIZE, chksum, -- chksum_type); -- ep++; -- chksum_type = CS_DEFAULT; -- } -- -- ep = (struct dentry_t *)&es->__buf; -- SET16_A(((struct file_dentry_t *)ep)->checksum, chksum); -- write_whole_entry_set(sb, es); --} -- --static s32 _walk_fat_chain(struct super_block *sb, struct chain_t *p_dir, -- s32 byte_offset, u32 *clu) --{ -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- s32 clu_offset; -- u32 cur_clu; -- -- clu_offset = byte_offset >> p_fs->cluster_size_bits; -- cur_clu = p_dir->dir; -- -- if (p_dir->flags == 0x03) { -- cur_clu += clu_offset; -- } else { -- while (clu_offset > 0) { -- if (exfat_fat_read(sb, cur_clu, &cur_clu) == -1) -- return -EIO; -- clu_offset--; -- } -- } -- -- if (clu) -- *clu = cur_clu; -- return 0; --} -- --static s32 find_location(struct super_block *sb, struct chain_t *p_dir, s32 entry, -- sector_t *sector, s32 *offset) --{ -- s32 off, ret; -- u32 clu = 0; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- off = entry << DENTRY_SIZE_BITS; -- -- if (p_dir->dir == CLUSTER_32(0)) { /* FAT16 root_dir */ -- *offset = off & p_bd->sector_size_mask; -- *sector = off >> p_bd->sector_size_bits; -- *sector += p_fs->root_start_sector; -- } else { -- ret = _walk_fat_chain(sb, p_dir, off, &clu); -- if (ret != 0) -- return ret; -- -- /* byte offset in cluster */ -- off &= p_fs->cluster_size - 1; -- -- /* byte offset in sector */ -- *offset = off & p_bd->sector_size_mask; -- -- /* sector offset in cluster */ -- *sector = off >> p_bd->sector_size_bits; -- *sector += START_SECTOR(clu); -- } -- return 0; --} -- --struct dentry_t *get_entry_in_dir(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, sector_t *sector) --{ -- s32 off; -- sector_t sec; -- u8 *buf; -- -- if (find_location(sb, p_dir, entry, &sec, &off) != 0) -- return NULL; -- -- buf = exfat_buf_getblk(sb, sec); -- -- if (!buf) -- return NULL; -- -- if (sector) -- *sector = sec; -- return (struct dentry_t *)(buf + off); --} -- --/* returns a set of dentries for a file or dir. -- * Note that this is a copy (dump) of dentries so that user should call write_entry_set() -- * to apply changes made in this entry set to the real device. -- * in: -- * sb+p_dir+entry: indicates a file/dir -- * type: specifies how many dentries should be included. -- * out: -- * file_ep: will point the first dentry(= file dentry) on success -- * return: -- * pointer of entry set on success, -- * NULL on failure. -- */ -- --#define ES_MODE_STARTED 0 --#define ES_MODE_GET_FILE_ENTRY 1 --#define ES_MODE_GET_STRM_ENTRY 2 --#define ES_MODE_GET_NAME_ENTRY 3 --#define ES_MODE_GET_CRITICAL_SEC_ENTRY 4 --struct entry_set_cache_t *get_entry_set_in_dir(struct super_block *sb, -- struct chain_t *p_dir, s32 entry, -- u32 type, -- struct dentry_t **file_ep) --{ -- s32 off, ret, byte_offset; -- u32 clu = 0; -- sector_t sec; -- u32 entry_type; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- struct entry_set_cache_t *es = NULL; -- struct dentry_t *ep, *pos; -- u8 *buf; -- u8 num_entries; -- s32 mode = ES_MODE_STARTED; -- size_t bufsize; -- -- pr_debug("%s entered p_dir dir %u flags %x size %d\n", -- __func__, p_dir->dir, p_dir->flags, p_dir->size); -- -- byte_offset = entry << DENTRY_SIZE_BITS; -- ret = _walk_fat_chain(sb, p_dir, byte_offset, &clu); -- if (ret != 0) -- return NULL; -- -- /* byte offset in cluster */ -- byte_offset &= p_fs->cluster_size - 1; -- -- /* byte offset in sector */ -- off = byte_offset & p_bd->sector_size_mask; -- -- /* sector offset in cluster */ -- sec = byte_offset >> p_bd->sector_size_bits; -- sec += START_SECTOR(clu); -- -- buf = exfat_buf_getblk(sb, sec); -- if (!buf) -- goto err_out; -- -- ep = (struct dentry_t *)(buf + off); -- entry_type = exfat_get_entry_type(ep); -- -- if ((entry_type != TYPE_FILE) && (entry_type != TYPE_DIR)) -- goto err_out; -- -- if (type == ES_ALL_ENTRIES) -- num_entries = ((struct file_dentry_t *)ep)->num_ext + 1; -- else -- num_entries = type; -- -- bufsize = offsetof(struct entry_set_cache_t, __buf) + (num_entries) * -- sizeof(struct dentry_t); -- pr_debug("%s: trying to kmalloc %zx bytes for %d entries\n", __func__, -- bufsize, num_entries); -- es = kmalloc(bufsize, GFP_KERNEL); -- if (!es) -- goto err_out; -- -- es->num_entries = num_entries; -- es->sector = sec; -- es->offset = off; -- es->alloc_flag = p_dir->flags; -- -- pos = (struct dentry_t *)&es->__buf; -- -- while (num_entries) { -- /* -- * instead of copying whole sector, we will check every entry. -- * this will provide minimum stablity and consistency. -- */ -- entry_type = exfat_get_entry_type(ep); -- -- if ((entry_type == TYPE_UNUSED) || (entry_type == TYPE_DELETED)) -- goto err_out; -- -- switch (mode) { -- case ES_MODE_STARTED: -- if ((entry_type == TYPE_FILE) || (entry_type == TYPE_DIR)) -- mode = ES_MODE_GET_FILE_ENTRY; -- else -- goto err_out; -- break; -- case ES_MODE_GET_FILE_ENTRY: -- if (entry_type == TYPE_STREAM) -- mode = ES_MODE_GET_STRM_ENTRY; -- else -- goto err_out; -- break; -- case ES_MODE_GET_STRM_ENTRY: -- if (entry_type == TYPE_EXTEND) -- mode = ES_MODE_GET_NAME_ENTRY; -- else -- goto err_out; -- break; -- case ES_MODE_GET_NAME_ENTRY: -- if (entry_type == TYPE_EXTEND) -- break; -- else if (entry_type == TYPE_STREAM) -- goto err_out; -- else if (entry_type & TYPE_CRITICAL_SEC) -- mode = ES_MODE_GET_CRITICAL_SEC_ENTRY; -- else -- goto err_out; -- break; -- case ES_MODE_GET_CRITICAL_SEC_ENTRY: -- if ((entry_type == TYPE_EXTEND) || -- (entry_type == TYPE_STREAM)) -- goto err_out; -- else if ((entry_type & TYPE_CRITICAL_SEC) != -- TYPE_CRITICAL_SEC) -- goto err_out; -- break; -- } -- -- memcpy(pos, ep, sizeof(struct dentry_t)); -- -- if (--num_entries == 0) -- break; -- -- if (((off + DENTRY_SIZE) & p_bd->sector_size_mask) < -- (off & p_bd->sector_size_mask)) { -- /* get the next sector */ -- if (IS_LAST_SECTOR_IN_CLUSTER(sec)) { -- if (es->alloc_flag == 0x03) { -- clu++; -- } else { -- if (exfat_fat_read(sb, clu, &clu) == -1) -- goto err_out; -- } -- sec = START_SECTOR(clu); -- } else { -- sec++; -- } -- buf = exfat_buf_getblk(sb, sec); -- if (!buf) -- goto err_out; -- off = 0; -- ep = (struct dentry_t *)(buf); -- } else { -- ep++; -- off += DENTRY_SIZE; -- } -- pos++; -- } -- -- if (file_ep) -- *file_ep = (struct dentry_t *)&es->__buf; -- -- pr_debug("%s exiting es %p sec %llu offset %d flags %d, num_entries %u buf ptr %p\n", -- __func__, es, (unsigned long long)es->sector, es->offset, -- es->alloc_flag, es->num_entries, &es->__buf); -- return es; --err_out: -- pr_debug("%s exited NULL (es %p)\n", __func__, es); -- kfree(es); -- return NULL; --} -- --void release_entry_set(struct entry_set_cache_t *es) --{ -- pr_debug("%s es=%p\n", __func__, es); -- kfree(es); --} -- --/* search EMPTY CONTINUOUS "num_entries" entries */ --static s32 search_deleted_or_unused_entry(struct super_block *sb, -- struct chain_t *p_dir, -- s32 num_entries) --{ -- int i, dentry, num_empty = 0; -- s32 dentries_per_clu; -- u32 type; -- struct chain_t clu; -- struct dentry_t *ep; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- dentries_per_clu = p_fs->dentries_in_root; -- else -- dentries_per_clu = p_fs->dentries_per_clu; -- -- if (p_fs->hint_uentry.dir == p_dir->dir) { -- if (p_fs->hint_uentry.entry == -1) -- return -1; -- -- clu.dir = p_fs->hint_uentry.clu.dir; -- clu.size = p_fs->hint_uentry.clu.size; -- clu.flags = p_fs->hint_uentry.clu.flags; -- -- dentry = p_fs->hint_uentry.entry; -- } else { -- p_fs->hint_uentry.entry = -1; -- -- clu.dir = p_dir->dir; -- clu.size = p_dir->size; -- clu.flags = p_dir->flags; -- -- dentry = 0; -- } -- -- while (clu.dir != CLUSTER_32(~0)) { -- if (p_fs->dev_ejected) -- break; -- -- if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- i = dentry % dentries_per_clu; -- else -- i = dentry & (dentries_per_clu - 1); -- -- for (; i < dentries_per_clu; i++, dentry++) { -- ep = get_entry_in_dir(sb, &clu, i, NULL); -- if (!ep) -- return -1; -- -- type = exfat_get_entry_type(ep); -- -- if (type == TYPE_UNUSED) { -- num_empty++; -- if (p_fs->hint_uentry.entry == -1) { -- p_fs->hint_uentry.dir = p_dir->dir; -- p_fs->hint_uentry.entry = dentry; -- -- p_fs->hint_uentry.clu.dir = clu.dir; -- p_fs->hint_uentry.clu.size = clu.size; -- p_fs->hint_uentry.clu.flags = clu.flags; -- } -- } else if (type == TYPE_DELETED) { -- num_empty++; -- } else { -- num_empty = 0; -- } -- -- if (num_empty >= num_entries) { -- p_fs->hint_uentry.dir = CLUSTER_32(~0); -- p_fs->hint_uentry.entry = -1; -- -- if (p_fs->vol_type == EXFAT) -- return dentry - (num_entries - 1); -- else -- return dentry; -- } -- } -- -- if (p_dir->dir == CLUSTER_32(0)) -- break; /* FAT16 root_dir */ -- -- if (clu.flags == 0x03) { -- if ((--clu.size) > 0) -- clu.dir++; -- else -- clu.dir = CLUSTER_32(~0); -- } else { -- if (exfat_fat_read(sb, clu.dir, &clu.dir) != 0) -- return -1; -- } -- } -- -- return -1; --} -- --static s32 find_empty_entry(struct inode *inode, struct chain_t *p_dir, s32 num_entries) --{ -- s32 ret, dentry; -- u32 last_clu; -- sector_t sector; -- u64 size = 0; -- struct chain_t clu; -- struct dentry_t *ep = NULL; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- -- if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- return search_deleted_or_unused_entry(sb, p_dir, num_entries); -- -- while ((dentry = search_deleted_or_unused_entry(sb, p_dir, num_entries)) < 0) { -- if (p_fs->dev_ejected) -- break; -- -- if (p_dir->dir != p_fs->root_dir) -- size = i_size_read(inode); -- -- last_clu = find_last_cluster(sb, p_dir); -- clu.dir = last_clu + 1; -- clu.size = 0; -- clu.flags = p_dir->flags; -- -- /* (1) allocate a cluster */ -- ret = exfat_alloc_cluster(sb, 1, &clu); -- if (ret < 1) -- return -EIO; -- -- if (clear_cluster(sb, clu.dir) != 0) -- return -EIO; -- -- /* (2) append to the FAT chain */ -- if (clu.flags != p_dir->flags) { -- exfat_chain_cont_cluster(sb, p_dir->dir, p_dir->size); -- p_dir->flags = 0x01; -- p_fs->hint_uentry.clu.flags = 0x01; -- } -- if (clu.flags == 0x01) -- if (exfat_fat_write(sb, last_clu, clu.dir) < 0) -- return -EIO; -- -- if (p_fs->hint_uentry.entry == -1) { -- p_fs->hint_uentry.dir = p_dir->dir; -- p_fs->hint_uentry.entry = p_dir->size << (p_fs->cluster_size_bits - DENTRY_SIZE_BITS); -- -- p_fs->hint_uentry.clu.dir = clu.dir; -- p_fs->hint_uentry.clu.size = 0; -- p_fs->hint_uentry.clu.flags = clu.flags; -- } -- p_fs->hint_uentry.clu.size++; -- p_dir->size++; -- -- /* (3) update the directory entry */ -- if (p_dir->dir != p_fs->root_dir) { -- size += p_fs->cluster_size; -- -- ep = get_entry_in_dir(sb, &fid->dir, -- fid->entry + 1, §or); -- if (!ep) -- return -ENOENT; -- exfat_set_entry_size(ep, size); -- exfat_set_entry_flag(ep, p_dir->flags); -- exfat_buf_modify(sb, sector); -- -- update_dir_checksum(sb, &fid->dir, -- fid->entry); -- } -- -- i_size_write(inode, i_size_read(inode) + p_fs->cluster_size); -- EXFAT_I(inode)->mmu_private += p_fs->cluster_size; -- EXFAT_I(inode)->fid.size += p_fs->cluster_size; -- EXFAT_I(inode)->fid.flags = p_dir->flags; -- inode->i_blocks += 1 << (p_fs->cluster_size_bits - 9); -- } -- -- return dentry; --} -- --static s32 extract_uni_name_from_name_entry(struct name_dentry_t *ep, u16 *uniname, -- s32 order) --{ -- int i, len = 0; -- -- for (i = 0; i < 30; i += 2) { -- *uniname = GET16_A(ep->unicode_0_14 + i); -- if (*uniname == 0x0) -- return len; -- uniname++; -- len++; -- } -- -- *uniname = 0x0; -- return len; --} -- --/* return values of exfat_find_dir_entry() -- * >= 0 : return dir entiry position with the name in dir -- * -1 : (root dir, ".") it is the root dir itself -- * -2 : entry with the name does not exist -- */ --s32 exfat_find_dir_entry(struct super_block *sb, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, s32 num_entries, -- struct dos_name_t *p_dosname, u32 type) --{ -- int i = 0, dentry = 0, num_ext_entries = 0, len, step; -- s32 order = 0; -- bool is_feasible_entry = false; -- s32 dentries_per_clu, num_empty = 0; -- u32 entry_type; -- u16 entry_uniname[16], *uniname = NULL, unichar; -- struct chain_t clu; -- struct dentry_t *ep; -- struct file_dentry_t *file_ep; -- struct strm_dentry_t *strm_ep; -- struct name_dentry_t *name_ep; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (p_dir->dir == p_fs->root_dir) { -- if ((!nls_uniname_cmp(sb, p_uniname->name, -- (u16 *)UNI_CUR_DIR_NAME)) || -- (!nls_uniname_cmp(sb, p_uniname->name, -- (u16 *)UNI_PAR_DIR_NAME))) -- return -1; // special case, root directory itself -- } -- -- if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- dentries_per_clu = p_fs->dentries_in_root; -- else -- dentries_per_clu = p_fs->dentries_per_clu; -- -- clu.dir = p_dir->dir; -- clu.size = p_dir->size; -- clu.flags = p_dir->flags; -- -- p_fs->hint_uentry.dir = p_dir->dir; -- p_fs->hint_uentry.entry = -1; -- -- while (clu.dir != CLUSTER_32(~0)) { -- if (p_fs->dev_ejected) -- break; -- -- while (i < dentries_per_clu) { -- ep = get_entry_in_dir(sb, &clu, i, NULL); -- if (!ep) -- return -2; -- -- entry_type = exfat_get_entry_type(ep); -- step = 1; -- -- if ((entry_type == TYPE_UNUSED) || (entry_type == TYPE_DELETED)) { -- is_feasible_entry = false; -- -- if (p_fs->hint_uentry.entry == -1) { -- num_empty++; -- -- if (num_empty == 1) { -- p_fs->hint_uentry.clu.dir = clu.dir; -- p_fs->hint_uentry.clu.size = clu.size; -- p_fs->hint_uentry.clu.flags = clu.flags; -- } -- if ((num_empty >= num_entries) || (entry_type == TYPE_UNUSED)) -- p_fs->hint_uentry.entry = dentry - (num_empty - 1); -- } -- -- if (entry_type == TYPE_UNUSED) -- return -2; -- } else { -- num_empty = 0; -- -- if ((entry_type == TYPE_FILE) || (entry_type == TYPE_DIR)) { -- file_ep = (struct file_dentry_t *)ep; -- if ((type == TYPE_ALL) || (type == entry_type)) { -- num_ext_entries = file_ep->num_ext; -- is_feasible_entry = true; -- } else { -- is_feasible_entry = false; -- step = file_ep->num_ext + 1; -- } -- } else if (entry_type == TYPE_STREAM) { -- if (is_feasible_entry) { -- strm_ep = (struct strm_dentry_t *)ep; -- if (p_uniname->name_hash == GET16_A(strm_ep->name_hash) && -- p_uniname->name_len == strm_ep->name_len) { -- order = 1; -- } else { -- is_feasible_entry = false; -- step = num_ext_entries; -- } -- } -- } else if (entry_type == TYPE_EXTEND) { -- if (is_feasible_entry) { -- name_ep = (struct name_dentry_t *)ep; -- -- if ((++order) == 2) -- uniname = p_uniname->name; -- else -- uniname += 15; -- -- len = extract_uni_name_from_name_entry(name_ep, -- entry_uniname, order); -- -- unichar = *(uniname + len); -- *(uniname + len) = 0x0; -- -- if (nls_uniname_cmp(sb, uniname, entry_uniname)) { -- is_feasible_entry = false; -- step = num_ext_entries - order + 1; -- } else if (order == num_ext_entries) { -- p_fs->hint_uentry.dir = CLUSTER_32(~0); -- p_fs->hint_uentry.entry = -1; -- return dentry - (num_ext_entries); -- } -- -- *(uniname + len) = unichar; -- } -- } else { -- is_feasible_entry = false; -- } -- } -- -- i += step; -- dentry += step; -- } -- -- i -= dentries_per_clu; -- -- if (p_dir->dir == CLUSTER_32(0)) -- break; /* FAT16 root_dir */ -- -- if (clu.flags == 0x03) { -- if ((--clu.size) > 0) -- clu.dir++; -- else -- clu.dir = CLUSTER_32(~0); -- } else { -- if (exfat_fat_read(sb, clu.dir, &clu.dir) != 0) -- return -2; -- } -- } -- -- return -2; --} -- --s32 exfat_count_ext_entries(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, struct dentry_t *p_entry) --{ -- int i, count = 0; -- u32 type; -- struct file_dentry_t *file_ep = (struct file_dentry_t *)p_entry; -- struct dentry_t *ext_ep; -- -- for (i = 0, entry++; i < file_ep->num_ext; i++, entry++) { -- ext_ep = get_entry_in_dir(sb, p_dir, entry, NULL); -- if (!ext_ep) -- return -1; -- -- type = exfat_get_entry_type(ext_ep); -- if ((type == TYPE_EXTEND) || (type == TYPE_STREAM)) -- count++; -- else -- return count; -- } -- -- return count; --} -- --s32 count_dos_name_entries(struct super_block *sb, struct chain_t *p_dir, -- u32 type) --{ -- int i, count = 0; -- s32 dentries_per_clu; -- u32 entry_type; -- struct chain_t clu; -- struct dentry_t *ep; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- dentries_per_clu = p_fs->dentries_in_root; -- else -- dentries_per_clu = p_fs->dentries_per_clu; -- -- clu.dir = p_dir->dir; -- clu.size = p_dir->size; -- clu.flags = p_dir->flags; -- -- while (clu.dir != CLUSTER_32(~0)) { -- if (p_fs->dev_ejected) -- break; -- -- for (i = 0; i < dentries_per_clu; i++) { -- ep = get_entry_in_dir(sb, &clu, i, NULL); -- if (!ep) -- return -ENOENT; -- -- entry_type = exfat_get_entry_type(ep); -- -- if (entry_type == TYPE_UNUSED) -- return count; -- if (!(type & TYPE_CRITICAL_PRI) && -- !(type & TYPE_BENIGN_PRI)) -- continue; -- -- if ((type == TYPE_ALL) || (type == entry_type)) -- count++; -- } -- -- if (p_dir->dir == CLUSTER_32(0)) -- break; /* FAT16 root_dir */ -- -- if (clu.flags == 0x03) { -- if ((--clu.size) > 0) -- clu.dir++; -- else -- clu.dir = CLUSTER_32(~0); -- } else { -- if (exfat_fat_read(sb, clu.dir, &clu.dir) != 0) -- return -EIO; -- } -- } -- -- return count; --} -- --bool is_dir_empty(struct super_block *sb, struct chain_t *p_dir) --{ -- int i, count = 0; -- s32 dentries_per_clu; -- u32 type; -- struct chain_t clu; -- struct dentry_t *ep; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- dentries_per_clu = p_fs->dentries_in_root; -- else -- dentries_per_clu = p_fs->dentries_per_clu; -- -- clu.dir = p_dir->dir; -- clu.size = p_dir->size; -- clu.flags = p_dir->flags; -- -- while (clu.dir != CLUSTER_32(~0)) { -- if (p_fs->dev_ejected) -- break; -- -- for (i = 0; i < dentries_per_clu; i++) { -- ep = get_entry_in_dir(sb, &clu, i, NULL); -- if (!ep) -- break; -- -- type = exfat_get_entry_type(ep); -- -- if (type == TYPE_UNUSED) -- return true; -- if ((type != TYPE_FILE) && (type != TYPE_DIR)) -- continue; -- -- if (p_dir->dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- return false; -- -- if (p_fs->vol_type == EXFAT) -- return false; -- if ((p_dir->dir == p_fs->root_dir) || ((++count) > 2)) -- return false; -- } -- -- if (p_dir->dir == CLUSTER_32(0)) -- break; /* FAT16 root_dir */ -- -- if (clu.flags == 0x03) { -- if ((--clu.size) > 0) -- clu.dir++; -- else -- clu.dir = CLUSTER_32(~0); -- } -- if (exfat_fat_read(sb, clu.dir, &clu.dir) != 0) -- break; -- } -- -- return true; --} -- --/* -- * Name Conversion Functions -- */ -- --/* input : dir, uni_name -- * output : num_of_entry, dos_name(format : aaaaaa~1.bbb) -- */ --s32 get_num_entries_and_dos_name(struct super_block *sb, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, s32 *entries, -- struct dos_name_t *p_dosname) --{ -- s32 num_entries; -- -- num_entries = exfat_calc_num_entries(p_uniname); -- if (num_entries == 0) -- return -EINVAL; -- -- *entries = num_entries; -- -- return 0; --} -- --void exfat_get_uni_name_from_ext_entry(struct super_block *sb, -- struct chain_t *p_dir, s32 entry, -- u16 *uniname) --{ -- int i; -- struct dentry_t *ep; -- struct entry_set_cache_t *es; -- -- es = get_entry_set_in_dir(sb, p_dir, entry, ES_ALL_ENTRIES, &ep); -- if (!es || es->num_entries < 3) { -- if (es) -- release_entry_set(es); -- return; -- } -- -- ep += 2; -- -- /* -- * First entry : file entry -- * Second entry : stream-extension entry -- * Third entry : first file-name entry -- * So, the index of first file-name dentry should start from 2. -- */ -- for (i = 2; i < es->num_entries; i++, ep++) { -- if (exfat_get_entry_type(ep) == TYPE_EXTEND) -- extract_uni_name_from_name_entry((struct name_dentry_t *) -- ep, uniname, i); -- else -- goto out; -- uniname += 15; -- } -- --out: -- release_entry_set(es); --} -- --s32 exfat_calc_num_entries(struct uni_name_t *p_uniname) --{ -- s32 len; -- -- len = p_uniname->name_len; -- if (len == 0) -- return 0; -- -- /* 1 file entry + 1 stream entry + name entries */ -- return (len - 1) / 15 + 3; --} -- --u16 calc_checksum_2byte(void *data, s32 len, u16 chksum, s32 type) --{ -- int i; -- u8 *c = (u8 *)data; -- -- switch (type) { -- case CS_DIR_ENTRY: -- for (i = 0; i < len; i++, c++) { -- if ((i == 2) || (i == 3)) -- continue; -- chksum = (((chksum & 1) << 15) | -- ((chksum & 0xFFFE) >> 1)) + (u16)*c; -- } -- break; -- default -- : -- for (i = 0; i < len; i++, c++) -- chksum = (((chksum & 1) << 15) | -- ((chksum & 0xFFFE) >> 1)) + (u16)*c; -- } -- -- return chksum; --} -- --/* -- * Name Resolution Functions -- */ -- --/* return values of resolve_path() -- * > 0 : return the length of the path -- * < 0 : return error -- */ --s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir, -- struct uni_name_t *p_uniname) --{ -- bool lossy = false; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- -- if (strscpy(name_buf, path, sizeof(name_buf)) < 0) -- return -EINVAL; -- -- nls_cstring_to_uniname(sb, p_uniname, name_buf, &lossy); -- if (lossy) -- return -EINVAL; -- -- fid->size = i_size_read(inode); -- -- p_dir->dir = fid->start_clu; -- p_dir->size = (s32)(fid->size >> p_fs->cluster_size_bits); -- p_dir->flags = fid->flags; -- -- return 0; --} -- --s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr) --{ -- struct bpbex_t *p_bpb = (struct bpbex_t *)p_pbr->bpb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- if (p_bpb->num_fats == 0) -- return -EFSCORRUPTED; -- -- p_fs->sectors_per_clu = 1 << p_bpb->sectors_per_clu_bits; -- p_fs->sectors_per_clu_bits = p_bpb->sectors_per_clu_bits; -- p_fs->cluster_size_bits = p_fs->sectors_per_clu_bits + -- p_bd->sector_size_bits; -- p_fs->cluster_size = 1 << p_fs->cluster_size_bits; -- -- p_fs->num_FAT_sectors = GET32(p_bpb->fat_length); -- -- p_fs->FAT1_start_sector = p_fs->PBR_sector + GET32(p_bpb->fat_offset); -- if (p_bpb->num_fats == 1) -- p_fs->FAT2_start_sector = p_fs->FAT1_start_sector; -- else -- p_fs->FAT2_start_sector = p_fs->FAT1_start_sector + -- p_fs->num_FAT_sectors; -- -- p_fs->root_start_sector = p_fs->PBR_sector + GET32(p_bpb->clu_offset); -- p_fs->data_start_sector = p_fs->root_start_sector; -- -- p_fs->num_sectors = GET64(p_bpb->vol_length); -- p_fs->num_clusters = GET32(p_bpb->clu_count) + 2; -- /* because the cluster index starts with 2 */ -- -- p_fs->vol_type = EXFAT; -- p_fs->vol_id = GET32(p_bpb->vol_serial); -- -- p_fs->root_dir = GET32(p_bpb->root_cluster); -- p_fs->dentries_in_root = 0; -- p_fs->dentries_per_clu = 1 << (p_fs->cluster_size_bits - -- DENTRY_SIZE_BITS); -- -- p_fs->vol_flag = (u32)GET16(p_bpb->vol_flags); -- p_fs->clu_srch_ptr = 2; -- p_fs->used_clusters = UINT_MAX; -- -- return 0; --} -- --s32 create_dir(struct inode *inode, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, struct file_id_t *fid) --{ -- s32 ret, dentry, num_entries; -- u64 size; -- struct chain_t clu; -- struct dos_name_t dos_name; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- ret = get_num_entries_and_dos_name(sb, p_dir, p_uniname, &num_entries, -- &dos_name); -- if (ret) -- return ret; -- -- /* find_empty_entry must be called before alloc_cluster */ -- dentry = find_empty_entry(inode, p_dir, num_entries); -- if (dentry < 0) -- return -ENOSPC; -- -- clu.dir = CLUSTER_32(~0); -- clu.size = 0; -- clu.flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01; -- -- /* (1) allocate a cluster */ -- ret = exfat_alloc_cluster(sb, 1, &clu); -- if (ret < 0) -- return ret; -- else if (ret == 0) -- return -ENOSPC; -- -- ret = clear_cluster(sb, clu.dir); -- if (ret != 0) -- return ret; -- -- size = p_fs->cluster_size; -- -- /* (2) update the directory entry */ -- /* make sub-dir entry in parent directory */ -- ret = exfat_init_dir_entry(sb, p_dir, dentry, TYPE_DIR, clu.dir, -- size); -- if (ret != 0) -- return ret; -- -- ret = exfat_init_ext_entry(sb, p_dir, dentry, num_entries, p_uniname, -- &dos_name); -- if (ret != 0) -- return ret; -- -- fid->dir.dir = p_dir->dir; -- fid->dir.size = p_dir->size; -- fid->dir.flags = p_dir->flags; -- fid->entry = dentry; -- -- fid->attr = ATTR_SUBDIR; -- fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01; -- fid->size = size; -- fid->start_clu = clu.dir; -- -- fid->type = TYPE_DIR; -- fid->rwoffset = 0; -- fid->hint_last_off = -1; -- -- return 0; --} -- --s32 create_file(struct inode *inode, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, u8 mode, struct file_id_t *fid) --{ -- s32 ret, dentry, num_entries; -- struct dos_name_t dos_name; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- ret = get_num_entries_and_dos_name(sb, p_dir, p_uniname, &num_entries, -- &dos_name); -- if (ret) -- return ret; -- -- /* find_empty_entry must be called before alloc_cluster() */ -- dentry = find_empty_entry(inode, p_dir, num_entries); -- if (dentry < 0) -- return -ENOSPC; -- -- /* (1) update the directory entry */ -- /* fill the dos name directory entry information of the created file. -- * the first cluster is not determined yet. (0) -- */ -- ret = exfat_init_dir_entry(sb, p_dir, dentry, TYPE_FILE | mode, -- CLUSTER_32(0), 0); -- if (ret != 0) -- return ret; -- -- ret = exfat_init_ext_entry(sb, p_dir, dentry, num_entries, p_uniname, -- &dos_name); -- if (ret != 0) -- return ret; -- -- fid->dir.dir = p_dir->dir; -- fid->dir.size = p_dir->size; -- fid->dir.flags = p_dir->flags; -- fid->entry = dentry; -- -- fid->attr = ATTR_ARCHIVE | mode; -- fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01; -- fid->size = 0; -- fid->start_clu = CLUSTER_32(~0); -- -- fid->type = TYPE_FILE; -- fid->rwoffset = 0; -- fid->hint_last_off = -1; -- -- return 0; --} -- --void remove_file(struct inode *inode, struct chain_t *p_dir, s32 entry) --{ -- s32 num_entries; -- sector_t sector; -- struct dentry_t *ep; -- struct super_block *sb = inode->i_sb; -- -- ep = get_entry_in_dir(sb, p_dir, entry, §or); -- if (!ep) -- return; -- -- exfat_buf_lock(sb, sector); -- -- /* exfat_buf_lock() before call count_ext_entries() */ -- num_entries = exfat_count_ext_entries(sb, p_dir, entry, ep); -- if (num_entries < 0) { -- exfat_buf_unlock(sb, sector); -- return; -- } -- num_entries++; -- -- exfat_buf_unlock(sb, sector); -- -- /* (1) update the directory entry */ -- exfat_delete_dir_entry(sb, p_dir, entry, 0, num_entries); --} -- --s32 exfat_rename_file(struct inode *inode, struct chain_t *p_dir, s32 oldentry, -- struct uni_name_t *p_uniname, struct file_id_t *fid) --{ -- s32 ret, newentry = -1, num_old_entries, num_new_entries; -- sector_t sector_old, sector_new; -- struct dos_name_t dos_name; -- struct dentry_t *epold, *epnew; -- struct super_block *sb = inode->i_sb; -- -- epold = get_entry_in_dir(sb, p_dir, oldentry, §or_old); -- if (!epold) -- return -ENOENT; -- -- exfat_buf_lock(sb, sector_old); -- -- /* exfat_buf_lock() before call count_ext_entries() */ -- num_old_entries = exfat_count_ext_entries(sb, p_dir, oldentry, -- epold); -- if (num_old_entries < 0) { -- exfat_buf_unlock(sb, sector_old); -- return -ENOENT; -- } -- num_old_entries++; -- -- ret = get_num_entries_and_dos_name(sb, p_dir, p_uniname, -- &num_new_entries, &dos_name); -- if (ret) { -- exfat_buf_unlock(sb, sector_old); -- return ret; -- } -- -- if (num_old_entries < num_new_entries) { -- newentry = find_empty_entry(inode, p_dir, num_new_entries); -- if (newentry < 0) { -- exfat_buf_unlock(sb, sector_old); -- return -ENOSPC; -- } -- -- epnew = get_entry_in_dir(sb, p_dir, newentry, §or_new); -- if (!epnew) { -- exfat_buf_unlock(sb, sector_old); -- return -ENOENT; -- } -- -- memcpy((void *)epnew, (void *)epold, DENTRY_SIZE); -- if (exfat_get_entry_type(epnew) == TYPE_FILE) { -- exfat_set_entry_attr(epnew, -- exfat_get_entry_attr(epnew) | -- ATTR_ARCHIVE); -- fid->attr |= ATTR_ARCHIVE; -- } -- exfat_buf_modify(sb, sector_new); -- exfat_buf_unlock(sb, sector_old); -- -- epold = get_entry_in_dir(sb, p_dir, oldentry + 1, -- §or_old); -- exfat_buf_lock(sb, sector_old); -- epnew = get_entry_in_dir(sb, p_dir, newentry + 1, -- §or_new); -- -- if (!epold || !epnew) { -- exfat_buf_unlock(sb, sector_old); -- return -ENOENT; -- } -- -- memcpy((void *)epnew, (void *)epold, DENTRY_SIZE); -- exfat_buf_modify(sb, sector_new); -- exfat_buf_unlock(sb, sector_old); -- -- ret = exfat_init_ext_entry(sb, p_dir, newentry, -- num_new_entries, p_uniname, -- &dos_name); -- if (ret != 0) -- return ret; -- -- exfat_delete_dir_entry(sb, p_dir, oldentry, 0, -- num_old_entries); -- fid->entry = newentry; -- } else { -- if (exfat_get_entry_type(epold) == TYPE_FILE) { -- exfat_set_entry_attr(epold, -- exfat_get_entry_attr(epold) | -- ATTR_ARCHIVE); -- fid->attr |= ATTR_ARCHIVE; -- } -- exfat_buf_modify(sb, sector_old); -- exfat_buf_unlock(sb, sector_old); -- -- ret = exfat_init_ext_entry(sb, p_dir, oldentry, -- num_new_entries, p_uniname, -- &dos_name); -- if (ret != 0) -- return ret; -- -- exfat_delete_dir_entry(sb, p_dir, oldentry, num_new_entries, -- num_old_entries); -- } -- -- return 0; --} -- --s32 move_file(struct inode *inode, struct chain_t *p_olddir, s32 oldentry, -- struct chain_t *p_newdir, struct uni_name_t *p_uniname, -- struct file_id_t *fid) --{ -- s32 ret, newentry, num_new_entries, num_old_entries; -- sector_t sector_mov, sector_new; -- struct dos_name_t dos_name; -- struct dentry_t *epmov, *epnew; -- struct super_block *sb = inode->i_sb; -- -- epmov = get_entry_in_dir(sb, p_olddir, oldentry, §or_mov); -- if (!epmov) -- return -ENOENT; -- -- /* check if the source and target directory is the same */ -- if (exfat_get_entry_type(epmov) == TYPE_DIR && -- exfat_get_entry_clu0(epmov) == p_newdir->dir) -- return -EINVAL; -- -- exfat_buf_lock(sb, sector_mov); -- -- /* exfat_buf_lock() before call count_ext_entries() */ -- num_old_entries = exfat_count_ext_entries(sb, p_olddir, oldentry, -- epmov); -- if (num_old_entries < 0) { -- exfat_buf_unlock(sb, sector_mov); -- return -ENOENT; -- } -- num_old_entries++; -- -- ret = get_num_entries_and_dos_name(sb, p_newdir, p_uniname, -- &num_new_entries, &dos_name); -- if (ret) { -- exfat_buf_unlock(sb, sector_mov); -- return ret; -- } -- -- newentry = find_empty_entry(inode, p_newdir, num_new_entries); -- if (newentry < 0) { -- exfat_buf_unlock(sb, sector_mov); -- return -ENOSPC; -- } -- -- epnew = get_entry_in_dir(sb, p_newdir, newentry, §or_new); -- if (!epnew) { -- exfat_buf_unlock(sb, sector_mov); -- return -ENOENT; -- } -- -- memcpy((void *)epnew, (void *)epmov, DENTRY_SIZE); -- if (exfat_get_entry_type(epnew) == TYPE_FILE) { -- exfat_set_entry_attr(epnew, exfat_get_entry_attr(epnew) | -- ATTR_ARCHIVE); -- fid->attr |= ATTR_ARCHIVE; -- } -- exfat_buf_modify(sb, sector_new); -- exfat_buf_unlock(sb, sector_mov); -- -- epmov = get_entry_in_dir(sb, p_olddir, oldentry + 1, -- §or_mov); -- exfat_buf_lock(sb, sector_mov); -- epnew = get_entry_in_dir(sb, p_newdir, newentry + 1, -- §or_new); -- if (!epmov || !epnew) { -- exfat_buf_unlock(sb, sector_mov); -- return -ENOENT; -- } -- -- memcpy((void *)epnew, (void *)epmov, DENTRY_SIZE); -- exfat_buf_modify(sb, sector_new); -- exfat_buf_unlock(sb, sector_mov); -- -- ret = exfat_init_ext_entry(sb, p_newdir, newentry, num_new_entries, -- p_uniname, &dos_name); -- if (ret != 0) -- return ret; -- -- exfat_delete_dir_entry(sb, p_olddir, oldentry, 0, num_old_entries); -- -- fid->dir.dir = p_newdir->dir; -- fid->dir.size = p_newdir->size; -- fid->dir.flags = p_newdir->flags; -- -- fid->entry = newentry; -- -- return 0; --} -- --/* -- * Sector Read/Write Functions -- */ -- --int sector_read(struct super_block *sb, sector_t sec, struct buffer_head **bh, -- bool read) --{ -- s32 ret = -EIO; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if ((sec >= (p_fs->PBR_sector + p_fs->num_sectors)) && -- (p_fs->num_sectors > 0)) { -- pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n", -- __func__, (unsigned long long)sec); -- fs_error(sb); -- return ret; -- } -- -- if (!p_fs->dev_ejected) { -- ret = exfat_bdev_read(sb, sec, bh, 1, read); -- if (ret != 0) -- p_fs->dev_ejected = 1; -- } -- -- return ret; --} -- --int sector_write(struct super_block *sb, sector_t sec, struct buffer_head *bh, -- bool sync) --{ -- s32 ret = -EIO; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (sec >= (p_fs->PBR_sector + p_fs->num_sectors) && -- (p_fs->num_sectors > 0)) { -- pr_err("[EXFAT] %s: out of range error! (sec = %llu)\n", -- __func__, (unsigned long long)sec); -- fs_error(sb); -- return ret; -- } -- -- if (!bh) { -- pr_err("[EXFAT] %s: bh is NULL!\n", __func__); -- fs_error(sb); -- return ret; -- } -- -- if (!p_fs->dev_ejected) { -- ret = exfat_bdev_write(sb, sec, bh, 1, sync); -- if (ret != 0) -- p_fs->dev_ejected = 1; -- } -- -- return ret; --} -- --int multi_sector_read(struct super_block *sb, sector_t sec, -- struct buffer_head **bh, s32 num_secs, bool read) --{ -- s32 ret = -EIO; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors)) && -- (p_fs->num_sectors > 0)) { -- pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n", -- __func__, (unsigned long long)sec, num_secs); -- fs_error(sb); -- return ret; -- } -- -- if (!p_fs->dev_ejected) { -- ret = exfat_bdev_read(sb, sec, bh, num_secs, read); -- if (ret != 0) -- p_fs->dev_ejected = 1; -- } -- -- return ret; --} -- --int multi_sector_write(struct super_block *sb, sector_t sec, -- struct buffer_head *bh, s32 num_secs, bool sync) --{ -- s32 ret = -EIO; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if ((sec + num_secs) > (p_fs->PBR_sector + p_fs->num_sectors) && -- (p_fs->num_sectors > 0)) { -- pr_err("[EXFAT] %s: out of range error! (sec = %llu, num_secs = %d)\n", -- __func__, (unsigned long long)sec, num_secs); -- fs_error(sb); -- return ret; -- } -- if (!bh) { -- pr_err("[EXFAT] %s: bh is NULL!\n", __func__); -- fs_error(sb); -- return ret; -- } -- -- if (!p_fs->dev_ejected) { -- ret = exfat_bdev_write(sb, sec, bh, num_secs, sync); -- if (ret != 0) -- p_fs->dev_ejected = 1; -- } -- -- return ret; --} -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/exfat.h linux-5.6.3/drivers/staging/exfat/exfat.h ---- linux-5.6.3.orig/drivers/staging/exfat/exfat.h 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/exfat.h 1970-01-01 02:00:00.000000000 +0200 -@@ -1,824 +0,0 @@ --/* SPDX-License-Identifier: GPL-2.0-or-later */ --/* -- * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -- */ -- --#ifndef _EXFAT_H --#define _EXFAT_H -- --#include --#include -- --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- /* For Debugging Purpose */ -- /* IOCTL code 'f' used by -- * - file systems typically #0~0x1F -- * - embedded terminal devices #128~ -- * - exts for debugging purpose #99 -- * number 100 and 101 is available now but has possible conflicts -- */ --#define EXFAT_IOC_GET_DEBUGFLAGS _IOR('f', 100, long) --#define EXFAT_IOC_SET_DEBUGFLAGS _IOW('f', 101, long) -- --#define EXFAT_DEBUGFLAGS_INVALID_UMOUNT 0x01 --#define EXFAT_DEBUGFLAGS_ERROR_RW 0x02 --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- --#ifdef CONFIG_STAGING_EXFAT_DEBUG_MSG --#define DEBUG 1 --#else --#undef DEBUG --#endif -- --#define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ -- --#define DENTRY_SIZE 32 /* dir entry size */ --#define DENTRY_SIZE_BITS 5 -- --/* PBR entries */ --#define PBR_SIGNATURE 0xAA55 --#define EXT_SIGNATURE 0xAA550000 --#define VOL_LABEL "NO NAME " /* size should be 11 */ --#define OEM_NAME "MSWIN4.1" /* size should be 8 */ --#define STR_FAT12 "FAT12 " /* size should be 8 */ --#define STR_FAT16 "FAT16 " /* size should be 8 */ --#define STR_FAT32 "FAT32 " /* size should be 8 */ --#define STR_EXFAT "EXFAT " /* size should be 8 */ --#define VOL_CLEAN 0x0000 --#define VOL_DIRTY 0x0002 -- --/* max number of clusters */ --#define FAT12_THRESHOLD 4087 /* 2^12 - 1 + 2 (clu 0 & 1) */ --#define FAT16_THRESHOLD 65527 /* 2^16 - 1 + 2 */ --#define FAT32_THRESHOLD 268435457 /* 2^28 - 1 + 2 */ --#define EXFAT_THRESHOLD 268435457 /* 2^28 - 1 + 2 */ -- --/* file types */ --#define TYPE_UNUSED 0x0000 --#define TYPE_DELETED 0x0001 --#define TYPE_INVALID 0x0002 --#define TYPE_CRITICAL_PRI 0x0100 --#define TYPE_BITMAP 0x0101 --#define TYPE_UPCASE 0x0102 --#define TYPE_VOLUME 0x0103 --#define TYPE_DIR 0x0104 --#define TYPE_FILE 0x011F --#define TYPE_SYMLINK 0x015F --#define TYPE_CRITICAL_SEC 0x0200 --#define TYPE_STREAM 0x0201 --#define TYPE_EXTEND 0x0202 --#define TYPE_ACL 0x0203 --#define TYPE_BENIGN_PRI 0x0400 --#define TYPE_GUID 0x0401 --#define TYPE_PADDING 0x0402 --#define TYPE_ACLTAB 0x0403 --#define TYPE_BENIGN_SEC 0x0800 --#define TYPE_ALL 0x0FFF -- --/* time modes */ --#define TM_CREATE 0 --#define TM_MODIFY 1 --#define TM_ACCESS 2 -- --/* checksum types */ --#define CS_DIR_ENTRY 0 --#define CS_PBR_SECTOR 1 --#define CS_DEFAULT 2 -- --#define CLUSTER_16(x) ((u16)(x)) --#define CLUSTER_32(x) ((u32)(x)) -- --#define START_SECTOR(x) \ -- ((((sector_t)((x) - 2)) << p_fs->sectors_per_clu_bits) + \ -- p_fs->data_start_sector) -- --#define IS_LAST_SECTOR_IN_CLUSTER(sec) \ -- ((((sec) - p_fs->data_start_sector + 1) & \ -- ((1 << p_fs->sectors_per_clu_bits) - 1)) == 0) -- --#define GET_CLUSTER_FROM_SECTOR(sec) \ -- ((u32)((((sec) - p_fs->data_start_sector) >> \ -- p_fs->sectors_per_clu_bits) + 2)) -- --#define GET16(p_src) \ -- (((u16)(p_src)[0]) | (((u16)(p_src)[1]) << 8)) --#define GET32(p_src) \ -- (((u32)(p_src)[0]) | (((u32)(p_src)[1]) << 8) | \ -- (((u32)(p_src)[2]) << 16) | (((u32)(p_src)[3]) << 24)) --#define GET64(p_src) \ -- (((u64)(p_src)[0]) | (((u64)(p_src)[1]) << 8) | \ -- (((u64)(p_src)[2]) << 16) | (((u64)(p_src)[3]) << 24) | \ -- (((u64)(p_src)[4]) << 32) | (((u64)(p_src)[5]) << 40) | \ -- (((u64)(p_src)[6]) << 48) | (((u64)(p_src)[7]) << 56)) -- --#define SET16(p_dst, src) \ -- do { \ -- (p_dst)[0] = (u8)(src); \ -- (p_dst)[1] = (u8)(((u16)(src)) >> 8); \ -- } while (0) --#define SET32(p_dst, src) \ -- do { \ -- (p_dst)[0] = (u8)(src); \ -- (p_dst)[1] = (u8)(((u32)(src)) >> 8); \ -- (p_dst)[2] = (u8)(((u32)(src)) >> 16); \ -- (p_dst)[3] = (u8)(((u32)(src)) >> 24); \ -- } while (0) --#define SET64(p_dst, src) \ -- do { \ -- (p_dst)[0] = (u8)(src); \ -- (p_dst)[1] = (u8)(((u64)(src)) >> 8); \ -- (p_dst)[2] = (u8)(((u64)(src)) >> 16); \ -- (p_dst)[3] = (u8)(((u64)(src)) >> 24); \ -- (p_dst)[4] = (u8)(((u64)(src)) >> 32); \ -- (p_dst)[5] = (u8)(((u64)(src)) >> 40); \ -- (p_dst)[6] = (u8)(((u64)(src)) >> 48); \ -- (p_dst)[7] = (u8)(((u64)(src)) >> 56); \ -- } while (0) -- --#ifdef __LITTLE_ENDIAN --#define GET16_A(p_src) (*((u16 *)(p_src))) --#define GET32_A(p_src) (*((u32 *)(p_src))) --#define GET64_A(p_src) (*((u64 *)(p_src))) --#define SET16_A(p_dst, src) (*((u16 *)(p_dst)) = (u16)(src)) --#define SET32_A(p_dst, src) (*((u32 *)(p_dst)) = (u32)(src)) --#define SET64_A(p_dst, src) (*((u64 *)(p_dst)) = (u64)(src)) --#else /* BIG_ENDIAN */ --#define GET16_A(p_src) GET16(p_src) --#define GET32_A(p_src) GET32(p_src) --#define GET64_A(p_src) GET64(p_src) --#define SET16_A(p_dst, src) SET16(p_dst, src) --#define SET32_A(p_dst, src) SET32(p_dst, src) --#define SET64_A(p_dst, src) SET64(p_dst, src) --#endif -- --/* cache size (in number of sectors) */ --/* (should be an exponential value of 2) */ --#define FAT_CACHE_SIZE 128 --#define FAT_CACHE_HASH_SIZE 64 --#define BUF_CACHE_SIZE 256 --#define BUF_CACHE_HASH_SIZE 64 -- --/* Upcase table macro */ --#define HIGH_INDEX_BIT (8) --#define HIGH_INDEX_MASK (0xFF00) --#define LOW_INDEX_BIT (16 - HIGH_INDEX_BIT) --#define UTBL_ROW_COUNT BIT(LOW_INDEX_BIT) --#define UTBL_COL_COUNT BIT(HIGH_INDEX_BIT) -- --static inline u16 get_col_index(u16 i) --{ -- return i >> LOW_INDEX_BIT; --} -- --static inline u16 get_row_index(u16 i) --{ -- return i & ~HIGH_INDEX_MASK; --} -- --#define EXFAT_SUPER_MAGIC (0x2011BAB0L) --#define EXFAT_ROOT_INO 1 -- --/* FAT types */ --#define FAT12 0x01 /* FAT12 */ --#define FAT16 0x0E /* Win95 FAT16 (LBA) */ --#define FAT32 0x0C /* Win95 FAT32 (LBA) */ --#define EXFAT 0x07 /* exFAT */ -- --/* file name lengths */ --#define MAX_CHARSET_SIZE 3 /* max size of multi-byte character */ --#define MAX_PATH_DEPTH 15 /* max depth of path name */ --#define MAX_NAME_LENGTH 256 /* max len of filename including NULL */ --#define MAX_PATH_LENGTH 260 /* max len of pathname including NULL */ --#define DOS_NAME_LENGTH 11 /* DOS filename length excluding NULL */ --#define DOS_PATH_LENGTH 80 /* DOS pathname length excluding NULL */ -- --/* file attributes */ --#define ATTR_NORMAL 0x0000 --#define ATTR_READONLY 0x0001 --#define ATTR_HIDDEN 0x0002 --#define ATTR_SYSTEM 0x0004 --#define ATTR_VOLUME 0x0008 --#define ATTR_SUBDIR 0x0010 --#define ATTR_ARCHIVE 0x0020 --#define ATTR_SYMLINK 0x0040 --#define ATTR_EXTEND 0x000F --#define ATTR_RWMASK 0x007E -- --/* file creation modes */ --#define FM_REGULAR 0x00 --#define FM_SYMLINK 0x40 -- --#define NUM_UPCASE 2918 -- --#define DOS_CUR_DIR_NAME ". " --#define DOS_PAR_DIR_NAME ".. " -- --#ifdef __LITTLE_ENDIAN --#define UNI_CUR_DIR_NAME ".\0" --#define UNI_PAR_DIR_NAME ".\0.\0" --#else --#define UNI_CUR_DIR_NAME "\0." --#define UNI_PAR_DIR_NAME "\0.\0." --#endif -- --struct date_time_t { -- u16 Year; -- u16 Month; -- u16 Day; -- u16 Hour; -- u16 Minute; -- u16 Second; -- u16 MilliSecond; --}; -- --struct part_info_t { -- u32 Offset; /* start sector number of the partition */ -- u32 Size; /* in sectors */ --}; -- --struct dev_info_t { -- u32 SecSize; /* sector size in bytes */ -- u32 DevSize; /* block device size in sectors */ --}; -- --struct vol_info_t { -- u32 FatType; -- u32 ClusterSize; -- u32 NumClusters; -- u32 FreeClusters; -- u32 UsedClusters; --}; -- --/* directory structure */ --struct chain_t { -- u32 dir; -- s32 size; -- u8 flags; --}; -- --struct file_id_t { -- struct chain_t dir; -- s32 entry; -- u32 type; -- u32 attr; -- u32 start_clu; -- u64 size; -- u8 flags; -- s64 rwoffset; -- s32 hint_last_off; -- u32 hint_last_clu; --}; -- --struct dir_entry_t { -- char Name[MAX_NAME_LENGTH * MAX_CHARSET_SIZE]; -- -- /* used only for FAT12/16/32, not used for exFAT */ -- char ShortName[DOS_NAME_LENGTH + 2]; -- -- u32 Attr; -- u64 Size; -- u32 NumSubdirs; -- struct date_time_t CreateTimestamp; -- struct date_time_t ModifyTimestamp; -- struct date_time_t AccessTimestamp; --}; -- --struct timestamp_t { -- u16 sec; /* 0 ~ 59 */ -- u16 min; /* 0 ~ 59 */ -- u16 hour; /* 0 ~ 23 */ -- u16 day; /* 1 ~ 31 */ -- u16 mon; /* 1 ~ 12 */ -- u16 year; /* 0 ~ 127 (since 1980) */ --}; -- --/* MS_DOS FAT partition boot record (512 bytes) */ --struct pbr_sector_t { -- u8 jmp_boot[3]; -- u8 oem_name[8]; -- u8 bpb[109]; -- u8 boot_code[390]; -- u8 signature[2]; --}; -- --/* MS-DOS FAT12/16 BIOS parameter block (51 bytes) */ --struct bpb16_t { -- u8 sector_size[2]; -- u8 sectors_per_clu; -- u8 num_reserved[2]; -- u8 num_fats; -- u8 num_root_entries[2]; -- u8 num_sectors[2]; -- u8 media_type; -- u8 num_fat_sectors[2]; -- u8 sectors_in_track[2]; -- u8 num_heads[2]; -- u8 num_hid_sectors[4]; -- u8 num_huge_sectors[4]; -- -- u8 phy_drv_no; -- u8 reserved; -- u8 ext_signature; -- u8 vol_serial[4]; -- u8 vol_label[11]; -- u8 vol_type[8]; --}; -- --/* MS-DOS FAT32 BIOS parameter block (79 bytes) */ --struct bpb32_t { -- u8 sector_size[2]; -- u8 sectors_per_clu; -- u8 num_reserved[2]; -- u8 num_fats; -- u8 num_root_entries[2]; -- u8 num_sectors[2]; -- u8 media_type; -- u8 num_fat_sectors[2]; -- u8 sectors_in_track[2]; -- u8 num_heads[2]; -- u8 num_hid_sectors[4]; -- u8 num_huge_sectors[4]; -- u8 num_fat32_sectors[4]; -- u8 ext_flags[2]; -- u8 fs_version[2]; -- u8 root_cluster[4]; -- u8 fsinfo_sector[2]; -- u8 backup_sector[2]; -- u8 reserved[12]; -- -- u8 phy_drv_no; -- u8 ext_reserved; -- u8 ext_signature; -- u8 vol_serial[4]; -- u8 vol_label[11]; -- u8 vol_type[8]; --}; -- --/* MS-DOS EXFAT BIOS parameter block (109 bytes) */ --struct bpbex_t { -- u8 reserved1[53]; -- u8 vol_offset[8]; -- u8 vol_length[8]; -- u8 fat_offset[4]; -- u8 fat_length[4]; -- u8 clu_offset[4]; -- u8 clu_count[4]; -- u8 root_cluster[4]; -- u8 vol_serial[4]; -- u8 fs_version[2]; -- u8 vol_flags[2]; -- u8 sector_size_bits; -- u8 sectors_per_clu_bits; -- u8 num_fats; -- u8 phy_drv_no; -- u8 perc_in_use; -- u8 reserved2[7]; --}; -- --/* MS-DOS FAT file system information sector (512 bytes) */ --struct fsi_sector_t { -- u8 signature1[4]; -- u8 reserved1[480]; -- u8 signature2[4]; -- u8 free_cluster[4]; -- u8 next_cluster[4]; -- u8 reserved2[14]; -- u8 signature3[2]; --}; -- --/* MS-DOS FAT directory entry (32 bytes) */ --struct dentry_t { -- u8 dummy[32]; --}; -- --struct dos_dentry_t { -- u8 name[DOS_NAME_LENGTH]; -- u8 attr; -- u8 lcase; -- u8 create_time_ms; -- u8 create_time[2]; -- u8 create_date[2]; -- u8 access_date[2]; -- u8 start_clu_hi[2]; -- u8 modify_time[2]; -- u8 modify_date[2]; -- u8 start_clu_lo[2]; -- u8 size[4]; --}; -- --/* MS-DOS FAT extended directory entry (32 bytes) */ --struct ext_dentry_t { -- u8 order; -- u8 unicode_0_4[10]; -- u8 attr; -- u8 sysid; -- u8 checksum; -- u8 unicode_5_10[12]; -- u8 start_clu[2]; -- u8 unicode_11_12[4]; --}; -- --/* MS-DOS EXFAT file directory entry (32 bytes) */ --struct file_dentry_t { -- u8 type; -- u8 num_ext; -- u8 checksum[2]; -- u8 attr[2]; -- u8 reserved1[2]; -- u8 create_time[2]; -- u8 create_date[2]; -- u8 modify_time[2]; -- u8 modify_date[2]; -- u8 access_time[2]; -- u8 access_date[2]; -- u8 create_time_ms; -- u8 modify_time_ms; -- u8 access_time_ms; -- u8 reserved2[9]; --}; -- --/* MS-DOS EXFAT stream extension directory entry (32 bytes) */ --struct strm_dentry_t { -- u8 type; -- u8 flags; -- u8 reserved1; -- u8 name_len; -- u8 name_hash[2]; -- u8 reserved2[2]; -- u8 valid_size[8]; -- u8 reserved3[4]; -- u8 start_clu[4]; -- u8 size[8]; --}; -- --/* MS-DOS EXFAT file name directory entry (32 bytes) */ --struct name_dentry_t { -- u8 type; -- u8 flags; -- u8 unicode_0_14[30]; --}; -- --/* MS-DOS EXFAT allocation bitmap directory entry (32 bytes) */ --struct bmap_dentry_t { -- u8 type; -- u8 flags; -- u8 reserved[18]; -- u8 start_clu[4]; -- u8 size[8]; --}; -- --/* MS-DOS EXFAT up-case table directory entry (32 bytes) */ --struct case_dentry_t { -- u8 type; -- u8 reserved1[3]; -- u8 checksum[4]; -- u8 reserved2[12]; -- u8 start_clu[4]; -- u8 size[8]; --}; -- --/* MS-DOS EXFAT volume label directory entry (32 bytes) */ --struct volm_dentry_t { -- u8 type; -- u8 label_len; -- u8 unicode_0_10[22]; -- u8 reserved[8]; --}; -- --/* unused entry hint information */ --struct uentry_t { -- u32 dir; -- s32 entry; -- struct chain_t clu; --}; -- --/* DOS name structure */ --struct dos_name_t { -- u8 name[DOS_NAME_LENGTH]; -- u8 name_case; --}; -- --/* unicode name structure */ --struct uni_name_t { -- u16 name[MAX_NAME_LENGTH]; -- u16 name_hash; -- u8 name_len; --}; -- --struct buf_cache_t { -- struct buf_cache_t *next; -- struct buf_cache_t *prev; -- struct buf_cache_t *hash_next; -- struct buf_cache_t *hash_prev; -- s32 drv; -- sector_t sec; -- u32 flag; -- struct buffer_head *buf_bh; --}; -- --struct fs_info_t { -- u32 drv; /* drive ID */ -- u32 vol_type; /* volume FAT type */ -- u32 vol_id; /* volume serial number */ -- -- u64 num_sectors; /* num of sectors in volume */ -- u32 num_clusters; /* num of clusters in volume */ -- u32 cluster_size; /* cluster size in bytes */ -- u32 cluster_size_bits; -- u32 sectors_per_clu; /* cluster size in sectors */ -- u32 sectors_per_clu_bits; -- -- u32 PBR_sector; /* PBR sector */ -- u32 FAT1_start_sector; /* FAT1 start sector */ -- u32 FAT2_start_sector; /* FAT2 start sector */ -- u32 root_start_sector; /* root dir start sector */ -- u32 data_start_sector; /* data area start sector */ -- u32 num_FAT_sectors; /* num of FAT sectors */ -- -- u32 root_dir; /* root dir cluster */ -- u32 dentries_in_root; /* num of dentries in root dir */ -- u32 dentries_per_clu; /* num of dentries per cluster */ -- -- u32 vol_flag; /* volume dirty flag */ -- struct buffer_head *pbr_bh; /* PBR sector */ -- -- u32 map_clu; /* allocation bitmap start cluster */ -- u32 map_sectors; /* num of allocation bitmap sectors */ -- struct buffer_head **vol_amap; /* allocation bitmap */ -- -- u16 **vol_utbl; /* upcase table */ -- -- u32 clu_srch_ptr; /* cluster search pointer */ -- u32 used_clusters; /* number of used clusters */ -- struct uentry_t hint_uentry; /* unused entry hint information */ -- -- u32 dev_ejected; /* block device operation error flag */ -- -- struct mutex v_mutex; -- -- /* FAT cache */ -- struct buf_cache_t FAT_cache_array[FAT_CACHE_SIZE]; -- struct buf_cache_t FAT_cache_lru_list; -- struct buf_cache_t FAT_cache_hash_list[FAT_CACHE_HASH_SIZE]; -- -- /* buf cache */ -- struct buf_cache_t buf_cache_array[BUF_CACHE_SIZE]; -- struct buf_cache_t buf_cache_lru_list; -- struct buf_cache_t buf_cache_hash_list[BUF_CACHE_HASH_SIZE]; --}; -- --#define ES_2_ENTRIES 2 --#define ES_3_ENTRIES 3 --#define ES_ALL_ENTRIES 0 -- --struct entry_set_cache_t { -- /* sector number that contains file_entry */ -- sector_t sector; -- -- /* byte offset in the sector */ -- s32 offset; -- -- /* -- * flag in stream entry. -- * 01 for cluster chain, -- * 03 for contig. clusteres. -- */ -- s32 alloc_flag; -- -- u32 num_entries; -- -- /* __buf should be the last member */ -- void *__buf; --}; -- --#define EXFAT_ERRORS_CONT 1 /* ignore error and continue */ --#define EXFAT_ERRORS_PANIC 2 /* panic on error */ --#define EXFAT_ERRORS_RO 3 /* remount r/o on error */ -- --/* ioctl command */ --#define EXFAT_IOCTL_GET_VOLUME_ID _IOR('r', 0x12, __u32) -- --struct exfat_mount_options { -- kuid_t fs_uid; -- kgid_t fs_gid; -- unsigned short fs_fmask; -- unsigned short fs_dmask; -- -- /* permission for setting the [am]time */ -- unsigned short allow_utime; -- -- /* codepage for shortname conversions */ -- unsigned short codepage; -- -- /* charset for filename input/display */ -- char *iocharset; -- -- unsigned char casesensitive; -- -- /* on error: continue, panic, remount-ro */ -- unsigned char errors; --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- /* flag on if -o dicard specified and device support discard() */ -- unsigned char discard; --#endif /* CONFIG_STAGING_EXFAT_DISCARD */ --}; -- --#define EXFAT_HASH_BITS 8 --#define EXFAT_HASH_SIZE BIT(EXFAT_HASH_BITS) -- --/* -- * EXFAT file system in-core superblock data -- */ --struct bd_info_t { -- s32 sector_size; /* in bytes */ -- s32 sector_size_bits; -- s32 sector_size_mask; -- -- /* total number of sectors in this block device */ -- s32 num_sectors; -- -- /* opened or not */ -- bool opened; --}; -- --struct exfat_sb_info { -- struct fs_info_t fs_info; -- struct bd_info_t bd_info; -- -- struct exfat_mount_options options; -- -- int s_dirt; -- struct mutex s_lock; -- struct nls_table *nls_disk; /* Codepage used on disk */ -- struct nls_table *nls_io; /* Charset used for input and display */ -- -- struct inode *fat_inode; -- -- spinlock_t inode_hash_lock; -- struct hlist_head inode_hashtable[EXFAT_HASH_SIZE]; --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- long debug_flags; --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ --}; -- --/* -- * EXFAT file system inode data in memory -- */ --struct exfat_inode_info { -- struct file_id_t fid; -- char *target; -- /* NOTE: mmu_private is 64bits, so must hold ->i_mutex to access */ -- loff_t mmu_private; /* physically allocated size */ -- loff_t i_pos; /* on-disk position of directory entry or 0 */ -- struct hlist_node i_hash_fat; /* hash by i_location */ -- struct rw_semaphore truncate_lock; -- struct inode vfs_inode; -- struct rw_semaphore i_alloc_sem; /* protect bmap against truncate */ --}; -- --#define EXFAT_SB(sb) ((struct exfat_sb_info *)((sb)->s_fs_info)) -- --static inline struct exfat_inode_info *EXFAT_I(struct inode *inode) --{ -- return container_of(inode, struct exfat_inode_info, vfs_inode); --} -- --/* NLS management function */ --u16 nls_upper(struct super_block *sb, u16 a); --int nls_uniname_cmp(struct super_block *sb, u16 *a, u16 *b); --void nls_uniname_to_cstring(struct super_block *sb, u8 *p_cstring, -- struct uni_name_t *p_uniname); --void nls_cstring_to_uniname(struct super_block *sb, -- struct uni_name_t *p_uniname, u8 *p_cstring, -- bool *p_lossy); -- --/* buffer cache management */ --void exfat_buf_init(struct super_block *sb); --void exfat_buf_shutdown(struct super_block *sb); --int exfat_fat_read(struct super_block *sb, u32 loc, u32 *content); --s32 exfat_fat_write(struct super_block *sb, u32 loc, u32 content); --u8 *exfat_fat_getblk(struct super_block *sb, sector_t sec); --void exfat_fat_modify(struct super_block *sb, sector_t sec); --void exfat_fat_release_all(struct super_block *sb); --void exfat_fat_sync(struct super_block *sb); --u8 *exfat_buf_getblk(struct super_block *sb, sector_t sec); --void exfat_buf_modify(struct super_block *sb, sector_t sec); --void exfat_buf_lock(struct super_block *sb, sector_t sec); --void exfat_buf_unlock(struct super_block *sb, sector_t sec); --void exfat_buf_release(struct super_block *sb, sector_t sec); --void exfat_buf_release_all(struct super_block *sb); --void exfat_buf_sync(struct super_block *sb); -- --/* fs management functions */ --void fs_set_vol_flags(struct super_block *sb, u32 new_flag); --void fs_error(struct super_block *sb); -- --/* cluster management functions */ --s32 count_num_clusters(struct super_block *sb, struct chain_t *dir); --void exfat_chain_cont_cluster(struct super_block *sb, u32 chain, s32 len); -- --/* allocation bitmap management functions */ --s32 load_alloc_bitmap(struct super_block *sb); --void free_alloc_bitmap(struct super_block *sb); --void sync_alloc_bitmap(struct super_block *sb); -- --/* upcase table management functions */ --s32 load_upcase_table(struct super_block *sb); --void free_upcase_table(struct super_block *sb); -- --/* dir entry management functions */ --struct timestamp_t *tm_current(struct timestamp_t *tm); -- --struct dentry_t *get_entry_in_dir(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, sector_t *sector); --struct entry_set_cache_t *get_entry_set_in_dir(struct super_block *sb, -- struct chain_t *p_dir, s32 entry, -- u32 type, -- struct dentry_t **file_ep); --void release_entry_set(struct entry_set_cache_t *es); --s32 count_dos_name_entries(struct super_block *sb, struct chain_t *p_dir, -- u32 type); --void update_dir_checksum(struct super_block *sb, struct chain_t *p_dir, -- s32 entry); --void update_dir_checksum_with_entry_set(struct super_block *sb, -- struct entry_set_cache_t *es); --bool is_dir_empty(struct super_block *sb, struct chain_t *p_dir); -- --/* name conversion functions */ --s32 get_num_entries_and_dos_name(struct super_block *sb, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, s32 *entries, -- struct dos_name_t *p_dosname); --u16 calc_checksum_2byte(void *data, s32 len, u16 chksum, s32 type); -- --/* name resolution functions */ --s32 resolve_path(struct inode *inode, char *path, struct chain_t *p_dir, -- struct uni_name_t *p_uniname); -- --/* file operation functions */ --s32 exfat_mount(struct super_block *sb, struct pbr_sector_t *p_pbr); --s32 create_dir(struct inode *inode, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, struct file_id_t *fid); --s32 create_file(struct inode *inode, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, u8 mode, struct file_id_t *fid); --void remove_file(struct inode *inode, struct chain_t *p_dir, s32 entry); --s32 exfat_rename_file(struct inode *inode, struct chain_t *p_dir, s32 old_entry, -- struct uni_name_t *p_uniname, struct file_id_t *fid); --s32 move_file(struct inode *inode, struct chain_t *p_olddir, s32 oldentry, -- struct chain_t *p_newdir, struct uni_name_t *p_uniname, -- struct file_id_t *fid); -- --/* sector read/write functions */ --int sector_read(struct super_block *sb, sector_t sec, -- struct buffer_head **bh, bool read); --int sector_write(struct super_block *sb, sector_t sec, -- struct buffer_head *bh, bool sync); --int multi_sector_read(struct super_block *sb, sector_t sec, -- struct buffer_head **bh, s32 num_secs, bool read); --int multi_sector_write(struct super_block *sb, sector_t sec, -- struct buffer_head *bh, s32 num_secs, bool sync); -- --void exfat_bdev_open(struct super_block *sb); --void exfat_bdev_close(struct super_block *sb); --int exfat_bdev_read(struct super_block *sb, sector_t secno, -- struct buffer_head **bh, u32 num_secs, bool read); --int exfat_bdev_write(struct super_block *sb, sector_t secno, -- struct buffer_head *bh, u32 num_secs, bool sync); --int exfat_bdev_sync(struct super_block *sb); -- --/* cluster operation functions */ --s32 exfat_alloc_cluster(struct super_block *sb, s32 num_alloc, -- struct chain_t *p_chain); --void exfat_free_cluster(struct super_block *sb, struct chain_t *p_chain, -- s32 do_relse); --s32 exfat_count_used_clusters(struct super_block *sb); -- --/* dir operation functions */ --s32 exfat_find_dir_entry(struct super_block *sb, struct chain_t *p_dir, -- struct uni_name_t *p_uniname, s32 num_entries, -- struct dos_name_t *p_dosname, u32 type); --void exfat_delete_dir_entry(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, s32 order, s32 num_entries); --void exfat_get_uni_name_from_ext_entry(struct super_block *sb, -- struct chain_t *p_dir, s32 entry, -- u16 *uniname); --s32 exfat_count_ext_entries(struct super_block *sb, struct chain_t *p_dir, -- s32 entry, struct dentry_t *p_entry); --s32 exfat_calc_num_entries(struct uni_name_t *p_uniname); -- --/* dir entry getter/setter */ --u32 exfat_get_entry_type(struct dentry_t *p_entry); --u32 exfat_get_entry_attr(struct dentry_t *p_entry); --void exfat_set_entry_attr(struct dentry_t *p_entry, u32 attr); --u8 exfat_get_entry_flag(struct dentry_t *p_entry); --void exfat_set_entry_flag(struct dentry_t *p_entry, u8 flags); --u32 exfat_get_entry_clu0(struct dentry_t *p_entry); --void exfat_set_entry_clu0(struct dentry_t *p_entry, u32 start_clu); --u64 exfat_get_entry_size(struct dentry_t *p_entry); --void exfat_set_entry_size(struct dentry_t *p_entry, u64 size); --void exfat_get_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, -- u8 mode); --void exfat_set_entry_time(struct dentry_t *p_entry, struct timestamp_t *tp, -- u8 mode); -- --extern const u8 uni_upcase[]; --#endif /* _EXFAT_H */ -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/exfat_nls.c linux-5.6.3/drivers/staging/exfat/exfat_nls.c ---- linux-5.6.3.orig/drivers/staging/exfat/exfat_nls.c 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/exfat_nls.c 1970-01-01 02:00:00.000000000 +0200 -@@ -1,212 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -- */ -- --#include --#include --#include "exfat.h" -- --static u16 bad_uni_chars[] = { -- /* " * / : < > ? \ | */ -- 0x0022, 0x002A, 0x002F, 0x003A, -- 0x003C, 0x003E, 0x003F, 0x005C, 0x007C, -- 0 --}; -- --static int convert_ch_to_uni(struct nls_table *nls, u16 *uni, u8 *ch, -- bool *lossy) --{ -- int len; -- -- *uni = 0x0; -- -- if (ch[0] < 0x80) { -- *uni = (u16)ch[0]; -- return 1; -- } -- -- len = nls->char2uni(ch, NLS_MAX_CHARSET_SIZE, uni); -- if (len < 0) { -- /* conversion failed */ -- pr_info("%s: fail to use nls\n", __func__); -- if (lossy) -- *lossy = true; -- *uni = (u16)'_'; -- if (!strcmp(nls->charset, "utf8")) -- return 1; -- else -- return 2; -- } -- -- return len; --} -- --static int convert_uni_to_ch(struct nls_table *nls, u8 *ch, u16 uni, -- bool *lossy) --{ -- int len; -- -- ch[0] = 0x0; -- -- if (uni < 0x0080) { -- ch[0] = (u8)uni; -- return 1; -- } -- -- len = nls->uni2char(uni, ch, NLS_MAX_CHARSET_SIZE); -- if (len < 0) { -- /* conversion failed */ -- pr_info("%s: fail to use nls\n", __func__); -- if (lossy) -- *lossy = true; -- ch[0] = '_'; -- return 1; -- } -- -- return len; --} -- --u16 nls_upper(struct super_block *sb, u16 a) --{ -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- if (EXFAT_SB(sb)->options.casesensitive) -- return a; -- if (p_fs->vol_utbl && p_fs->vol_utbl[get_col_index(a)]) -- return p_fs->vol_utbl[get_col_index(a)][get_row_index(a)]; -- else -- return a; --} -- --static u16 *nls_wstrchr(u16 *str, u16 wchar) --{ -- while (*str) { -- if (*(str++) == wchar) -- return str; -- } -- -- return NULL; --} -- --int nls_uniname_cmp(struct super_block *sb, u16 *a, u16 *b) --{ -- int i; -- -- for (i = 0; i < MAX_NAME_LENGTH; i++, a++, b++) { -- if (nls_upper(sb, *a) != nls_upper(sb, *b)) -- return 1; -- if (*a == 0x0) -- return 0; -- } -- return 0; --} -- --void nls_uniname_to_cstring(struct super_block *sb, u8 *p_cstring, -- struct uni_name_t *p_uniname) --{ -- int i, j, len; -- u8 buf[MAX_CHARSET_SIZE]; -- u16 *uniname = p_uniname->name; -- struct nls_table *nls = EXFAT_SB(sb)->nls_io; -- -- if (!nls) { -- len = utf16s_to_utf8s(uniname, MAX_NAME_LENGTH, -- UTF16_HOST_ENDIAN, p_cstring, -- MAX_NAME_LENGTH); -- p_cstring[len] = 0; -- return; -- } -- -- i = 0; -- while (i < (MAX_NAME_LENGTH - 1)) { -- if (*uniname == (u16)'\0') -- break; -- -- len = convert_uni_to_ch(nls, buf, *uniname, NULL); -- -- if (len > 1) { -- for (j = 0; j < len; j++) -- *p_cstring++ = (char)*(buf + j); -- } else { /* len == 1 */ -- *p_cstring++ = (char)*buf; -- } -- -- uniname++; -- i++; -- } -- -- *p_cstring = '\0'; --} -- --void nls_cstring_to_uniname(struct super_block *sb, -- struct uni_name_t *p_uniname, u8 *p_cstring, -- bool *p_lossy) --{ -- int i, j; -- bool lossy = false; -- u8 *end_of_name; -- u8 upname[MAX_NAME_LENGTH * 2]; -- u16 *uniname = p_uniname->name; -- struct nls_table *nls = EXFAT_SB(sb)->nls_io; -- -- /* strip all trailing spaces */ -- end_of_name = p_cstring + strlen(p_cstring); -- -- while (*(--end_of_name) == ' ') { -- if (end_of_name < p_cstring) -- break; -- } -- *(++end_of_name) = '\0'; -- -- if (strcmp(p_cstring, ".") && strcmp(p_cstring, "..")) { -- /* strip all trailing periods */ -- while (*(--end_of_name) == '.') { -- if (end_of_name < p_cstring) -- break; -- } -- *(++end_of_name) = '\0'; -- } -- -- if (*p_cstring == '\0') -- lossy = true; -- -- if (!nls) { -- i = utf8s_to_utf16s(p_cstring, MAX_NAME_LENGTH, -- UTF16_HOST_ENDIAN, uniname, -- MAX_NAME_LENGTH); -- for (j = 0; j < i; j++) -- SET16_A(upname + j * 2, nls_upper(sb, uniname[j])); -- uniname[i] = '\0'; -- } else { -- i = 0; -- j = 0; -- while (j < (MAX_NAME_LENGTH - 1)) { -- if (*(p_cstring + i) == '\0') -- break; -- -- i += convert_ch_to_uni(nls, uniname, -- (u8 *)(p_cstring + i), &lossy); -- -- if ((*uniname < 0x0020) || -- nls_wstrchr(bad_uni_chars, *uniname)) -- lossy = true; -- -- SET16_A(upname + j * 2, nls_upper(sb, *uniname)); -- -- uniname++; -- j++; -- } -- -- if (*(p_cstring + i) != '\0') -- lossy = true; -- *uniname = (u16)'\0'; -- } -- -- p_uniname->name_len = j; -- p_uniname->name_hash = calc_checksum_2byte(upname, j << 1, 0, -- CS_DEFAULT); -- -- if (p_lossy) -- *p_lossy = lossy; --} -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/exfat_super.c linux-5.6.3/drivers/staging/exfat/exfat_super.c ---- linux-5.6.3.orig/drivers/staging/exfat/exfat_super.c 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/exfat_super.c 1970-01-01 02:00:00.000000000 +0200 -@@ -1,3883 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -- */ -- --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --#define EXFAT_VERSION "1.3.0" -- --#include "exfat.h" -- --static struct kmem_cache *exfat_inode_cachep; -- --static int exfat_default_codepage = CONFIG_STAGING_EXFAT_DEFAULT_CODEPAGE; --static char exfat_default_iocharset[] = CONFIG_STAGING_EXFAT_DEFAULT_IOCHARSET; -- --#define INC_IVERSION(x) (inode_inc_iversion(x)) --#define GET_IVERSION(x) (inode_peek_iversion_raw(x)) --#define SET_IVERSION(x, y) (inode_set_iversion(x, y)) -- --static struct inode *exfat_iget(struct super_block *sb, loff_t i_pos); --static int exfat_sync_inode(struct inode *inode); --static struct inode *exfat_build_inode(struct super_block *sb, -- struct file_id_t *fid, loff_t i_pos); --static int exfat_write_inode(struct inode *inode, -- struct writeback_control *wbc); --static void exfat_write_super(struct super_block *sb); -- --#define UNIX_SECS_1980 315532800L --#define UNIX_SECS_2108 4354819200L -- --/* Convert a FAT time/date pair to a UNIX date (seconds since 1 1 70). */ --static void exfat_time_fat2unix(struct timespec64 *ts, struct date_time_t *tp) --{ -- ts->tv_sec = mktime64(tp->Year + 1980, tp->Month + 1, tp->Day, -- tp->Hour, tp->Minute, tp->Second); -- -- ts->tv_nsec = tp->MilliSecond * NSEC_PER_MSEC; --} -- --/* Convert linear UNIX date to a FAT time/date pair. */ --static void exfat_time_unix2fat(struct timespec64 *ts, struct date_time_t *tp) --{ -- time64_t second = ts->tv_sec; -- struct tm tm; -- -- time64_to_tm(second, 0, &tm); -- -- if (second < UNIX_SECS_1980) { -- tp->MilliSecond = 0; -- tp->Second = 0; -- tp->Minute = 0; -- tp->Hour = 0; -- tp->Day = 1; -- tp->Month = 1; -- tp->Year = 0; -- return; -- } -- -- if (second >= UNIX_SECS_2108) { -- tp->MilliSecond = 999; -- tp->Second = 59; -- tp->Minute = 59; -- tp->Hour = 23; -- tp->Day = 31; -- tp->Month = 12; -- tp->Year = 127; -- return; -- } -- -- tp->MilliSecond = ts->tv_nsec / NSEC_PER_MSEC; -- tp->Second = tm.tm_sec; -- tp->Minute = tm.tm_min; -- tp->Hour = tm.tm_hour; -- tp->Day = tm.tm_mday; -- tp->Month = tm.tm_mon + 1; -- tp->Year = tm.tm_year + 1900 - 1980; --} -- --struct timestamp_t *tm_current(struct timestamp_t *tp) --{ -- time64_t second = ktime_get_real_seconds(); -- struct tm tm; -- -- time64_to_tm(second, 0, &tm); -- -- if (second < UNIX_SECS_1980) { -- tp->sec = 0; -- tp->min = 0; -- tp->hour = 0; -- tp->day = 1; -- tp->mon = 1; -- tp->year = 0; -- return tp; -- } -- -- if (second >= UNIX_SECS_2108) { -- tp->sec = 59; -- tp->min = 59; -- tp->hour = 23; -- tp->day = 31; -- tp->mon = 12; -- tp->year = 127; -- return tp; -- } -- -- tp->sec = tm.tm_sec; -- tp->min = tm.tm_min; -- tp->hour = tm.tm_hour; -- tp->day = tm.tm_mday; -- tp->mon = tm.tm_mon + 1; -- tp->year = tm.tm_year + 1900 - 1980; -- -- return tp; --} -- --static void __lock_super(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- mutex_lock(&sbi->s_lock); --} -- --static void __unlock_super(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- mutex_unlock(&sbi->s_lock); --} -- --static int __is_sb_dirty(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- return sbi->s_dirt; --} -- --static void __set_sb_clean(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- sbi->s_dirt = 0; --} -- --static int __exfat_revalidate(struct dentry *dentry) --{ -- return 0; --} -- --static int exfat_revalidate(struct dentry *dentry, unsigned int flags) --{ -- if (flags & LOOKUP_RCU) -- return -ECHILD; -- -- if (dentry->d_inode) -- return 1; -- return __exfat_revalidate(dentry); --} -- --static int exfat_revalidate_ci(struct dentry *dentry, unsigned int flags) --{ -- if (flags & LOOKUP_RCU) -- return -ECHILD; -- -- if (dentry->d_inode) -- return 1; -- -- if (!flags) -- return 0; -- -- if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET)) -- return 0; -- -- return __exfat_revalidate(dentry); --} -- --static unsigned int __exfat_striptail_len(unsigned int len, const char *name) --{ -- while (len && name[len - 1] == '.') -- len--; -- return len; --} -- --static unsigned int exfat_striptail_len(const struct qstr *qstr) --{ -- return __exfat_striptail_len(qstr->len, qstr->name); --} -- --static int exfat_d_hash(const struct dentry *dentry, struct qstr *qstr) --{ -- qstr->hash = full_name_hash(dentry, qstr->name, -- exfat_striptail_len(qstr)); -- return 0; --} -- --static int exfat_d_hashi(const struct dentry *dentry, struct qstr *qstr) --{ -- struct super_block *sb = dentry->d_sb; -- const unsigned char *name; -- unsigned int len; -- unsigned long hash; -- -- name = qstr->name; -- len = exfat_striptail_len(qstr); -- -- hash = init_name_hash(dentry); -- while (len--) -- hash = partial_name_hash(nls_upper(sb, *name++), hash); -- qstr->hash = end_name_hash(hash); -- -- return 0; --} -- --static int exfat_cmpi(const struct dentry *dentry, unsigned int len, -- const char *str, const struct qstr *name) --{ -- struct nls_table *t = EXFAT_SB(dentry->d_sb)->nls_io; -- unsigned int alen, blen; -- -- alen = exfat_striptail_len(name); -- blen = __exfat_striptail_len(len, str); -- if (alen == blen) { -- if (!t) { -- if (strncasecmp(name->name, str, alen) == 0) -- return 0; -- } else { -- if (nls_strnicmp(t, name->name, str, alen) == 0) -- return 0; -- } -- } -- return 1; --} -- --static int exfat_cmp(const struct dentry *dentry, unsigned int len, -- const char *str, const struct qstr *name) --{ -- unsigned int alen, blen; -- -- alen = exfat_striptail_len(name); -- blen = __exfat_striptail_len(len, str); -- if (alen == blen) { -- if (strncmp(name->name, str, alen) == 0) -- return 0; -- } -- return 1; --} -- --static const struct dentry_operations exfat_ci_dentry_ops = { -- .d_revalidate = exfat_revalidate_ci, -- .d_hash = exfat_d_hashi, -- .d_compare = exfat_cmpi, --}; -- --static const struct dentry_operations exfat_dentry_ops = { -- .d_revalidate = exfat_revalidate, -- .d_hash = exfat_d_hash, -- .d_compare = exfat_cmp, --}; -- --static DEFINE_MUTEX(z_mutex); -- --static inline void fs_sync(struct super_block *sb, bool do_sync) --{ -- if (do_sync) -- exfat_bdev_sync(sb); --} -- --/* -- * If ->i_mode can't hold S_IWUGO (i.e. ATTR_RO), we use ->i_attrs to -- * save ATTR_RO instead of ->i_mode. -- * -- * If it's directory and !sbi->options.rodir, ATTR_RO isn't read-only -- * bit, it's just used as flag for app. -- */ --static inline int exfat_mode_can_hold_ro(struct inode *inode) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -- -- if (S_ISDIR(inode->i_mode)) -- return 0; -- -- if ((~sbi->options.fs_fmask) & 0222) -- return 1; -- return 0; --} -- --/* Convert attribute bits and a mask to the UNIX mode. */ --static inline mode_t exfat_make_mode(struct exfat_sb_info *sbi, u32 attr, -- mode_t mode) --{ -- if ((attr & ATTR_READONLY) && !(attr & ATTR_SUBDIR)) -- mode &= ~0222; -- -- if (attr & ATTR_SUBDIR) -- return (mode & ~sbi->options.fs_dmask) | S_IFDIR; -- else if (attr & ATTR_SYMLINK) -- return (mode & ~sbi->options.fs_dmask) | S_IFLNK; -- else -- return (mode & ~sbi->options.fs_fmask) | S_IFREG; --} -- --/* Return the FAT attribute byte for this inode */ --static inline u32 exfat_make_attr(struct inode *inode) --{ -- if (exfat_mode_can_hold_ro(inode) && !(inode->i_mode & 0222)) -- return (EXFAT_I(inode)->fid.attr) | ATTR_READONLY; -- else -- return EXFAT_I(inode)->fid.attr; --} -- --static inline void exfat_save_attr(struct inode *inode, u32 attr) --{ -- if (exfat_mode_can_hold_ro(inode)) -- EXFAT_I(inode)->fid.attr = attr & ATTR_RWMASK; -- else -- EXFAT_I(inode)->fid.attr = attr & (ATTR_RWMASK | ATTR_READONLY); --} -- --static int ffsMountVol(struct super_block *sb) --{ -- int i, ret; -- struct pbr_sector_t *p_pbr; -- struct buffer_head *tmp_bh = NULL; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- pr_info("[EXFAT] trying to mount...\n"); -- -- mutex_lock(&z_mutex); -- -- exfat_buf_init(sb); -- -- mutex_init(&p_fs->v_mutex); -- p_fs->dev_ejected = 0; -- -- /* open the block device */ -- exfat_bdev_open(sb); -- -- if (p_bd->sector_size < sb->s_blocksize) { -- printk(KERN_INFO "EXFAT: mount failed - sector size %d less than blocksize %ld\n", -- p_bd->sector_size, sb->s_blocksize); -- ret = -EINVAL; -- goto out; -- } -- if (p_bd->sector_size > sb->s_blocksize) -- sb_set_blocksize(sb, p_bd->sector_size); -- -- /* read Sector 0 */ -- if (sector_read(sb, 0, &tmp_bh, 1) != 0) { -- ret = -EIO; -- goto out; -- } -- -- p_fs->PBR_sector = 0; -- -- p_pbr = (struct pbr_sector_t *)tmp_bh->b_data; -- -- /* check the validity of PBR */ -- if (GET16_A(p_pbr->signature) != PBR_SIGNATURE) { -- brelse(tmp_bh); -- exfat_bdev_close(sb); -- ret = -EFSCORRUPTED; -- goto out; -- } -- -- /* fill fs_struct */ -- for (i = 0; i < 53; i++) -- if (p_pbr->bpb[i]) -- break; -- -- if (i < 53) { -- /* Not sure how we'd get here, but complain if it does */ -- ret = -EINVAL; -- pr_info("EXFAT: Attempted to mount VFAT filesystem\n"); -- goto out; -- } else { -- ret = exfat_mount(sb, p_pbr); -- } -- -- brelse(tmp_bh); -- -- if (ret) { -- exfat_bdev_close(sb); -- goto out; -- } -- -- ret = load_alloc_bitmap(sb); -- if (ret) { -- exfat_bdev_close(sb); -- goto out; -- } -- ret = load_upcase_table(sb); -- if (ret) { -- free_alloc_bitmap(sb); -- exfat_bdev_close(sb); -- goto out; -- } -- -- if (p_fs->dev_ejected) { -- free_upcase_table(sb); -- free_alloc_bitmap(sb); -- exfat_bdev_close(sb); -- ret = -EIO; -- goto out; -- } -- -- pr_info("[EXFAT] mounted successfully\n"); -- --out: -- mutex_unlock(&z_mutex); -- -- return ret; --} -- --static int ffsUmountVol(struct super_block *sb) --{ -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- int err = 0; -- -- pr_info("[EXFAT] trying to unmount...\n"); -- -- mutex_lock(&z_mutex); -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); -- -- free_upcase_table(sb); -- free_alloc_bitmap(sb); -- -- exfat_fat_release_all(sb); -- exfat_buf_release_all(sb); -- -- /* close the block device */ -- exfat_bdev_close(sb); -- -- if (p_fs->dev_ejected) { -- pr_info("[EXFAT] unmounted with media errors. Device is already ejected.\n"); -- err = -EIO; -- } -- -- exfat_buf_shutdown(sb); -- -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- mutex_unlock(&z_mutex); -- -- pr_info("[EXFAT] unmounted successfully\n"); -- -- return err; --} -- --static int ffsGetVolInfo(struct super_block *sb, struct vol_info_t *info) --{ -- int err = 0; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- /* check the validity of pointer parameters */ -- if (!info) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- if (p_fs->used_clusters == UINT_MAX) -- p_fs->used_clusters = exfat_count_used_clusters(sb); -- -- info->FatType = p_fs->vol_type; -- info->ClusterSize = p_fs->cluster_size; -- info->NumClusters = p_fs->num_clusters - 2; /* clu 0 & 1 */ -- info->UsedClusters = p_fs->used_clusters; -- info->FreeClusters = info->NumClusters - info->UsedClusters; -- -- if (p_fs->dev_ejected) -- err = -EIO; -- -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return err; --} -- --static int ffsSyncVol(struct super_block *sb, bool do_sync) --{ -- int err = 0; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* synchronize the file system */ -- fs_sync(sb, do_sync); -- fs_set_vol_flags(sb, VOL_CLEAN); -- -- if (p_fs->dev_ejected) -- err = -EIO; -- -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return err; --} -- --/*----------------------------------------------------------------------*/ --/* File Operation Functions */ --/*----------------------------------------------------------------------*/ -- --static int ffsLookupFile(struct inode *inode, char *path, struct file_id_t *fid) --{ -- int ret, dentry, num_entries; -- struct chain_t dir; -- struct uni_name_t uni_name; -- struct dos_name_t dos_name; -- struct dentry_t *ep, *ep2; -- struct entry_set_cache_t *es = NULL; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- pr_debug("%s entered\n", __func__); -- -- /* check the validity of pointer parameters */ -- if (!fid || !path || (*path == '\0')) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* check the validity of directory name in the given pathname */ -- ret = resolve_path(inode, path, &dir, &uni_name); -- if (ret) -- goto out; -- -- ret = get_num_entries_and_dos_name(sb, &dir, &uni_name, &num_entries, -- &dos_name); -- if (ret) -- goto out; -- -- /* search the file name for directories */ -- dentry = exfat_find_dir_entry(sb, &dir, &uni_name, num_entries, -- &dos_name, TYPE_ALL); -- if (dentry < -1) { -- ret = -ENOENT; -- goto out; -- } -- -- fid->dir.dir = dir.dir; -- fid->dir.size = dir.size; -- fid->dir.flags = dir.flags; -- fid->entry = dentry; -- -- if (dentry == -1) { -- fid->type = TYPE_DIR; -- fid->rwoffset = 0; -- fid->hint_last_off = -1; -- -- fid->attr = ATTR_SUBDIR; -- fid->flags = 0x01; -- fid->size = 0; -- fid->start_clu = p_fs->root_dir; -- } else { -- es = get_entry_set_in_dir(sb, &dir, dentry, -- ES_2_ENTRIES, &ep); -- if (!es) { -- ret = -ENOENT; -- goto out; -- } -- ep2 = ep + 1; -- -- fid->type = exfat_get_entry_type(ep); -- fid->rwoffset = 0; -- fid->hint_last_off = -1; -- fid->attr = exfat_get_entry_attr(ep); -- -- fid->size = exfat_get_entry_size(ep2); -- if ((fid->type == TYPE_FILE) && (fid->size == 0)) { -- fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01; -- fid->start_clu = CLUSTER_32(~0); -- } else { -- fid->flags = exfat_get_entry_flag(ep2); -- fid->start_clu = exfat_get_entry_clu0(ep2); -- } -- -- release_entry_set(es); -- } -- -- if (p_fs->dev_ejected) -- ret = -EIO; --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static int ffsCreateFile(struct inode *inode, char *path, u8 mode, -- struct file_id_t *fid) --{ -- struct chain_t dir; -- struct uni_name_t uni_name; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- int ret = 0; -- -- /* check the validity of pointer parameters */ -- if (!fid || !path || (*path == '\0')) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* check the validity of directory name in the given pathname */ -- ret = resolve_path(inode, path, &dir, &uni_name); -- if (ret) -- goto out; -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- /* create a new file */ -- ret = create_file(inode, &dir, &uni_name, mode, fid); -- --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static int ffsReadFile(struct inode *inode, struct file_id_t *fid, void *buffer, -- u64 count, u64 *rcount) --{ -- s32 offset, sec_offset, clu_offset; -- u32 clu; -- int ret = 0; -- sector_t LogSector; -- u64 oneblkread, read_bytes; -- struct buffer_head *tmp_bh = NULL; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- /* check the validity of the given file id */ -- if (!fid) -- return -EINVAL; -- -- /* check the validity of pointer parameters */ -- if (!buffer) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* check if the given file ID is opened */ -- if (fid->type != TYPE_FILE) { -- ret = -EPERM; -- goto out; -- } -- -- if (fid->rwoffset > fid->size) -- fid->rwoffset = fid->size; -- -- if (count > (fid->size - fid->rwoffset)) -- count = fid->size - fid->rwoffset; -- -- if (count == 0) { -- if (rcount) -- *rcount = 0; -- ret = 0; -- goto out; -- } -- -- read_bytes = 0; -- -- while (count > 0) { -- clu_offset = (s32)(fid->rwoffset >> p_fs->cluster_size_bits); -- clu = fid->start_clu; -- -- if (fid->flags == 0x03) { -- clu += clu_offset; -- } else { -- /* hint information */ -- if ((clu_offset > 0) && (fid->hint_last_off > 0) && -- (clu_offset >= fid->hint_last_off)) { -- clu_offset -= fid->hint_last_off; -- clu = fid->hint_last_clu; -- } -- -- while (clu_offset > 0) { -- /* clu = exfat_fat_read(sb, clu); */ -- if (exfat_fat_read(sb, clu, &clu) == -1) { -- ret = -EIO; -- goto out; -- } -- -- clu_offset--; -- } -- } -- -- /* hint information */ -- fid->hint_last_off = (s32)(fid->rwoffset >> -- p_fs->cluster_size_bits); -- fid->hint_last_clu = clu; -- -- /* byte offset in cluster */ -- offset = (s32)(fid->rwoffset & (p_fs->cluster_size - 1)); -- -- /* sector offset in cluster */ -- sec_offset = offset >> p_bd->sector_size_bits; -- -- /* byte offset in sector */ -- offset &= p_bd->sector_size_mask; -- -- LogSector = START_SECTOR(clu) + sec_offset; -- -- oneblkread = (u64)(p_bd->sector_size - offset); -- if (oneblkread > count) -- oneblkread = count; -- -- if ((offset == 0) && (oneblkread == p_bd->sector_size)) { -- if (sector_read(sb, LogSector, &tmp_bh, 1) != -- 0) -- goto err_out; -- memcpy((char *)buffer + read_bytes, -- (char *)tmp_bh->b_data, (s32)oneblkread); -- } else { -- if (sector_read(sb, LogSector, &tmp_bh, 1) != -- 0) -- goto err_out; -- memcpy((char *)buffer + read_bytes, -- (char *)tmp_bh->b_data + offset, -- (s32)oneblkread); -- } -- count -= oneblkread; -- read_bytes += oneblkread; -- fid->rwoffset += oneblkread; -- } -- brelse(tmp_bh); -- --/* How did this ever work and not leak a brlse()?? */ --err_out: -- /* set the size of read bytes */ -- if (rcount) -- *rcount = read_bytes; -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static int ffsWriteFile(struct inode *inode, struct file_id_t *fid, -- void *buffer, u64 count, u64 *wcount) --{ -- bool modified = false; -- s32 offset, sec_offset, clu_offset; -- s32 num_clusters, num_alloc, num_alloced = (s32)~0; -- int ret = 0; -- u32 clu, last_clu; -- sector_t LogSector; -- u64 oneblkwrite, write_bytes; -- struct chain_t new_clu; -- struct timestamp_t tm; -- struct dentry_t *ep, *ep2; -- struct entry_set_cache_t *es = NULL; -- struct buffer_head *tmp_bh = NULL; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- -- /* check the validity of the given file id */ -- if (!fid) -- return -EINVAL; -- -- /* check the validity of pointer parameters */ -- if (!buffer) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* check if the given file ID is opened */ -- if (fid->type != TYPE_FILE) { -- ret = -EPERM; -- goto out; -- } -- -- if (fid->rwoffset > fid->size) -- fid->rwoffset = fid->size; -- -- if (count == 0) { -- if (wcount) -- *wcount = 0; -- ret = 0; -- goto out; -- } -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- if (fid->size == 0) -- num_clusters = 0; -- else -- num_clusters = (s32)((fid->size - 1) >> -- p_fs->cluster_size_bits) + 1; -- -- write_bytes = 0; -- -- while (count > 0) { -- clu_offset = (s32)(fid->rwoffset >> p_fs->cluster_size_bits); -- clu = fid->start_clu; -- last_clu = fid->start_clu; -- -- if (fid->flags == 0x03) { -- if ((clu_offset > 0) && (clu != CLUSTER_32(~0))) { -- last_clu += clu_offset - 1; -- -- if (clu_offset == num_clusters) -- clu = CLUSTER_32(~0); -- else -- clu += clu_offset; -- } -- } else { -- /* hint information */ -- if ((clu_offset > 0) && (fid->hint_last_off > 0) && -- (clu_offset >= fid->hint_last_off)) { -- clu_offset -= fid->hint_last_off; -- clu = fid->hint_last_clu; -- } -- -- while ((clu_offset > 0) && (clu != CLUSTER_32(~0))) { -- last_clu = clu; -- /* clu = exfat_fat_read(sb, clu); */ -- if (exfat_fat_read(sb, clu, &clu) == -1) { -- ret = -EIO; -- goto out; -- } -- clu_offset--; -- } -- } -- -- if (clu == CLUSTER_32(~0)) { -- num_alloc = (s32)((count - 1) >> -- p_fs->cluster_size_bits) + 1; -- new_clu.dir = (last_clu == CLUSTER_32(~0)) ? -- CLUSTER_32(~0) : last_clu + 1; -- new_clu.size = 0; -- new_clu.flags = fid->flags; -- -- /* (1) allocate a chain of clusters */ -- num_alloced = exfat_alloc_cluster(sb, -- num_alloc, -- &new_clu); -- if (num_alloced == 0) -- break; -- if (num_alloced < 0) { -- ret = num_alloced; -- goto out; -- } -- -- /* (2) append to the FAT chain */ -- if (last_clu == CLUSTER_32(~0)) { -- if (new_clu.flags == 0x01) -- fid->flags = 0x01; -- fid->start_clu = new_clu.dir; -- modified = true; -- } else { -- if (new_clu.flags != fid->flags) { -- exfat_chain_cont_cluster(sb, -- fid->start_clu, -- num_clusters); -- fid->flags = 0x01; -- modified = true; -- } -- if (new_clu.flags == 0x01) -- exfat_fat_write(sb, last_clu, new_clu.dir); -- } -- -- num_clusters += num_alloced; -- clu = new_clu.dir; -- } -- -- /* hint information */ -- fid->hint_last_off = (s32)(fid->rwoffset >> -- p_fs->cluster_size_bits); -- fid->hint_last_clu = clu; -- -- /* byte offset in cluster */ -- offset = (s32)(fid->rwoffset & (p_fs->cluster_size - 1)); -- -- /* sector offset in cluster */ -- sec_offset = offset >> p_bd->sector_size_bits; -- -- /* byte offset in sector */ -- offset &= p_bd->sector_size_mask; -- -- LogSector = START_SECTOR(clu) + sec_offset; -- -- oneblkwrite = (u64)(p_bd->sector_size - offset); -- if (oneblkwrite > count) -- oneblkwrite = count; -- -- if ((offset == 0) && (oneblkwrite == p_bd->sector_size)) { -- if (sector_read(sb, LogSector, &tmp_bh, 0) != -- 0) -- goto err_out; -- memcpy((char *)tmp_bh->b_data, -- (char *)buffer + write_bytes, (s32)oneblkwrite); -- if (sector_write(sb, LogSector, tmp_bh, 0) != -- 0) { -- brelse(tmp_bh); -- goto err_out; -- } -- } else { -- if ((offset > 0) || -- ((fid->rwoffset + oneblkwrite) < fid->size)) { -- if (sector_read(sb, LogSector, &tmp_bh, 1) != -- 0) -- goto err_out; -- } else { -- if (sector_read(sb, LogSector, &tmp_bh, 0) != -- 0) -- goto err_out; -- } -- -- memcpy((char *)tmp_bh->b_data + offset, -- (char *)buffer + write_bytes, (s32)oneblkwrite); -- if (sector_write(sb, LogSector, tmp_bh, 0) != -- 0) { -- brelse(tmp_bh); -- goto err_out; -- } -- } -- -- count -= oneblkwrite; -- write_bytes += oneblkwrite; -- fid->rwoffset += oneblkwrite; -- -- fid->attr |= ATTR_ARCHIVE; -- -- if (fid->size < fid->rwoffset) { -- fid->size = fid->rwoffset; -- modified = true; -- } -- } -- -- brelse(tmp_bh); -- -- /* (3) update the direcoty entry */ -- es = get_entry_set_in_dir(sb, &fid->dir, fid->entry, -- ES_ALL_ENTRIES, &ep); -- if (!es) -- goto err_out; -- ep2 = ep + 1; -- -- exfat_set_entry_time(ep, tm_current(&tm), TM_MODIFY); -- exfat_set_entry_attr(ep, fid->attr); -- -- if (modified) { -- if (exfat_get_entry_flag(ep2) != fid->flags) -- exfat_set_entry_flag(ep2, fid->flags); -- -- if (exfat_get_entry_size(ep2) != fid->size) -- exfat_set_entry_size(ep2, fid->size); -- -- if (exfat_get_entry_clu0(ep2) != fid->start_clu) -- exfat_set_entry_clu0(ep2, fid->start_clu); -- } -- -- update_dir_checksum_with_entry_set(sb, es); -- release_entry_set(es); -- --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- --err_out: -- /* set the size of written bytes */ -- if (wcount) -- *wcount = write_bytes; -- -- if (num_alloced == 0) -- ret = -ENOSPC; -- -- else if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static int ffsTruncateFile(struct inode *inode, u64 old_size, u64 new_size) --{ -- s32 num_clusters; -- u32 last_clu = CLUSTER_32(0); -- int ret = 0; -- struct chain_t clu; -- struct timestamp_t tm; -- struct dentry_t *ep, *ep2; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- struct entry_set_cache_t *es = NULL; -- -- pr_debug("%s entered (inode %p size %llu)\n", __func__, inode, -- new_size); -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* check if the given file ID is opened */ -- if (fid->type != TYPE_FILE) { -- ret = -EPERM; -- goto out; -- } -- -- if (fid->size != old_size) { -- pr_err("[EXFAT] truncate : can't skip it because of size-mismatch(old:%lld->fid:%lld).\n", -- old_size, fid->size); -- } -- -- if (old_size <= new_size) { -- ret = 0; -- goto out; -- } -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- clu.dir = fid->start_clu; -- clu.size = (s32)((old_size - 1) >> p_fs->cluster_size_bits) + 1; -- clu.flags = fid->flags; -- -- if (new_size > 0) { -- num_clusters = (s32)((new_size - 1) >> -- p_fs->cluster_size_bits) + 1; -- -- if (clu.flags == 0x03) { -- clu.dir += num_clusters; -- } else { -- while (num_clusters > 0) { -- last_clu = clu.dir; -- if (exfat_fat_read(sb, clu.dir, &clu.dir) == -1) { -- ret = -EIO; -- goto out; -- } -- num_clusters--; -- } -- } -- -- clu.size -= num_clusters; -- } -- -- fid->size = new_size; -- fid->attr |= ATTR_ARCHIVE; -- if (new_size == 0) { -- fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01; -- fid->start_clu = CLUSTER_32(~0); -- } -- -- /* (1) update the directory entry */ -- es = get_entry_set_in_dir(sb, &fid->dir, fid->entry, -- ES_ALL_ENTRIES, &ep); -- if (!es) { -- ret = -ENOENT; -- goto out; -- } -- ep2 = ep + 1; -- -- exfat_set_entry_time(ep, tm_current(&tm), TM_MODIFY); -- exfat_set_entry_attr(ep, fid->attr); -- -- exfat_set_entry_size(ep2, new_size); -- if (new_size == 0) { -- exfat_set_entry_flag(ep2, 0x01); -- exfat_set_entry_clu0(ep2, CLUSTER_32(0)); -- } -- -- update_dir_checksum_with_entry_set(sb, es); -- release_entry_set(es); -- -- /* (2) cut off from the FAT chain */ -- if (last_clu != CLUSTER_32(0)) { -- if (fid->flags == 0x01) -- exfat_fat_write(sb, last_clu, CLUSTER_32(~0)); -- } -- -- /* (3) free the clusters */ -- exfat_free_cluster(sb, &clu, 0); -- -- /* hint information */ -- fid->hint_last_off = -1; -- if (fid->rwoffset > fid->size) -- fid->rwoffset = fid->size; -- --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- pr_debug("%s exited (%d)\n", __func__, ret); -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static void update_parent_info(struct file_id_t *fid, -- struct inode *parent_inode) --{ -- struct fs_info_t *p_fs = &(EXFAT_SB(parent_inode->i_sb)->fs_info); -- struct file_id_t *parent_fid = &(EXFAT_I(parent_inode)->fid); -- -- if (unlikely((parent_fid->flags != fid->dir.flags) || -- (parent_fid->size != -- (fid->dir.size << p_fs->cluster_size_bits)) || -- (parent_fid->start_clu != fid->dir.dir))) { -- fid->dir.dir = parent_fid->start_clu; -- fid->dir.flags = parent_fid->flags; -- fid->dir.size = ((parent_fid->size + (p_fs->cluster_size - 1)) -- >> p_fs->cluster_size_bits); -- } --} -- --static int ffsMoveFile(struct inode *old_parent_inode, struct file_id_t *fid, -- struct inode *new_parent_inode, struct dentry *new_dentry) --{ -- s32 ret; -- s32 dentry; -- struct chain_t olddir, newdir; -- struct chain_t *p_dir = NULL; -- struct uni_name_t uni_name; -- struct dentry_t *ep; -- struct super_block *sb = old_parent_inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- u8 *new_path = (u8 *)new_dentry->d_name.name; -- struct inode *new_inode = new_dentry->d_inode; -- int num_entries; -- struct file_id_t *new_fid = NULL; -- s32 new_entry = 0; -- -- /* check the validity of the given file id */ -- if (!fid) -- return -EINVAL; -- -- /* check the validity of pointer parameters */ -- if (!new_path || (*new_path == '\0')) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- update_parent_info(fid, old_parent_inode); -- -- olddir.dir = fid->dir.dir; -- olddir.size = fid->dir.size; -- olddir.flags = fid->dir.flags; -- -- dentry = fid->entry; -- -- /* check if the old file is "." or ".." */ -- if (p_fs->vol_type != EXFAT) { -- if ((olddir.dir != p_fs->root_dir) && (dentry < 2)) { -- ret = -EPERM; -- goto out2; -- } -- } -- -- ep = get_entry_in_dir(sb, &olddir, dentry, NULL); -- if (!ep) { -- ret = -ENOENT; -- goto out2; -- } -- -- if (exfat_get_entry_attr(ep) & ATTR_READONLY) { -- ret = -EPERM; -- goto out2; -- } -- -- /* check whether new dir is existing directory and empty */ -- if (new_inode) { -- u32 entry_type; -- -- ret = -ENOENT; -- new_fid = &EXFAT_I(new_inode)->fid; -- -- update_parent_info(new_fid, new_parent_inode); -- -- p_dir = &new_fid->dir; -- new_entry = new_fid->entry; -- ep = get_entry_in_dir(sb, p_dir, new_entry, NULL); -- if (!ep) -- goto out; -- -- entry_type = exfat_get_entry_type(ep); -- -- if (entry_type == TYPE_DIR) { -- struct chain_t new_clu; -- -- new_clu.dir = new_fid->start_clu; -- new_clu.size = (s32)((new_fid->size - 1) >> -- p_fs->cluster_size_bits) + 1; -- new_clu.flags = new_fid->flags; -- -- if (!is_dir_empty(sb, &new_clu)) { -- ret = -EEXIST; -- goto out; -- } -- } -- } -- -- /* check the validity of directory name in the given new pathname */ -- ret = resolve_path(new_parent_inode, new_path, &newdir, &uni_name); -- if (ret) -- goto out2; -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- if (olddir.dir == newdir.dir) -- ret = exfat_rename_file(new_parent_inode, &olddir, dentry, -- &uni_name, fid); -- else -- ret = move_file(new_parent_inode, &olddir, dentry, &newdir, -- &uni_name, fid); -- -- if ((ret == 0) && new_inode) { -- /* delete entries of new_dir */ -- ep = get_entry_in_dir(sb, p_dir, new_entry, NULL); -- if (!ep) -- goto out; -- -- num_entries = exfat_count_ext_entries(sb, p_dir, -- new_entry, ep); -- if (num_entries < 0) -- goto out; -- exfat_delete_dir_entry(sb, p_dir, new_entry, 0, -- num_entries + 1); -- } --out: --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- -- if (p_fs->dev_ejected) -- ret = -EIO; --out2: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static int ffsRemoveFile(struct inode *inode, struct file_id_t *fid) --{ -- s32 dentry; -- int ret = 0; -- struct chain_t dir, clu_to_free; -- struct dentry_t *ep; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- /* check the validity of the given file id */ -- if (!fid) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- dir.dir = fid->dir.dir; -- dir.size = fid->dir.size; -- dir.flags = fid->dir.flags; -- -- dentry = fid->entry; -- -- ep = get_entry_in_dir(sb, &dir, dentry, NULL); -- if (!ep) { -- ret = -ENOENT; -- goto out; -- } -- -- if (exfat_get_entry_attr(ep) & ATTR_READONLY) { -- ret = -EPERM; -- goto out; -- } -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- /* (1) update the directory entry */ -- remove_file(inode, &dir, dentry); -- -- clu_to_free.dir = fid->start_clu; -- clu_to_free.size = (s32)((fid->size - 1) >> p_fs->cluster_size_bits) + 1; -- clu_to_free.flags = fid->flags; -- -- /* (2) free the clusters */ -- exfat_free_cluster(sb, &clu_to_free, 0); -- -- fid->size = 0; -- fid->start_clu = CLUSTER_32(~0); -- fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01; -- --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- -- if (p_fs->dev_ejected) -- ret = -EIO; --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --#if 0 --/* Not currently wired up */ --static int ffsSetAttr(struct inode *inode, u32 attr) --{ -- u32 type; -- int ret = 0; -- sector_t sector = 0; -- struct dentry_t *ep; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- u8 is_dir = (fid->type == TYPE_DIR) ? 1 : 0; -- struct entry_set_cache_t *es = NULL; -- -- if (fid->attr == attr) { -- if (p_fs->dev_ejected) -- return -EIO; -- return 0; -- } -- -- if (is_dir) { -- if ((fid->dir.dir == p_fs->root_dir) && -- (fid->entry == -1)) { -- if (p_fs->dev_ejected) -- return -EIO; -- return 0; -- } -- } -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* get the directory entry of given file */ -- es = get_entry_set_in_dir(sb, &fid->dir, fid->entry, -- ES_ALL_ENTRIES, &ep); -- if (!es) { -- ret = -ENOENT; -- goto out; -- } -- -- type = exfat_get_entry_type(ep); -- -- if (((type == TYPE_FILE) && (attr & ATTR_SUBDIR)) || -- ((type == TYPE_DIR) && (!(attr & ATTR_SUBDIR)))) { -- if (p_fs->dev_ejected) -- ret = -EIO; -- else -- ret = -EINVAL; -- -- release_entry_set(es); -- goto out; -- } -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- /* set the file attribute */ -- fid->attr = attr; -- exfat_set_entry_attr(ep, attr); -- -- update_dir_checksum_with_entry_set(sb, es); -- release_entry_set(es); -- --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- -- if (p_fs->dev_ejected) -- ret = -EIO; --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} --#endif -- --static int ffsReadStat(struct inode *inode, struct dir_entry_t *info) --{ -- s32 count; -- int ret = 0; -- struct chain_t dir; -- struct uni_name_t uni_name; -- struct timestamp_t tm; -- struct dentry_t *ep, *ep2; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- struct entry_set_cache_t *es = NULL; -- u8 is_dir = (fid->type == TYPE_DIR) ? 1 : 0; -- -- pr_debug("%s entered\n", __func__); -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- if (is_dir) { -- if ((fid->dir.dir == p_fs->root_dir) && -- (fid->entry == -1)) { -- info->Attr = ATTR_SUBDIR; -- memset((char *)&info->CreateTimestamp, 0, -- sizeof(struct date_time_t)); -- memset((char *)&info->ModifyTimestamp, 0, -- sizeof(struct date_time_t)); -- memset((char *)&info->AccessTimestamp, 0, -- sizeof(struct date_time_t)); -- strcpy(info->ShortName, "."); -- strcpy(info->Name, "."); -- -- dir.dir = p_fs->root_dir; -- dir.flags = 0x01; -- -- if (p_fs->root_dir == CLUSTER_32(0)) { -- /* FAT16 root_dir */ -- info->Size = p_fs->dentries_in_root << -- DENTRY_SIZE_BITS; -- } else { -- info->Size = count_num_clusters(sb, &dir) << -- p_fs->cluster_size_bits; -- } -- -- count = count_dos_name_entries(sb, &dir, TYPE_DIR); -- if (count < 0) { -- ret = count; /* propagate error upward */ -- goto out; -- } -- info->NumSubdirs = count; -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- goto out; -- } -- } -- -- /* get the directory entry of given file or directory */ -- es = get_entry_set_in_dir(sb, &fid->dir, fid->entry, -- ES_2_ENTRIES, &ep); -- if (!es) { -- ret = -ENOENT; -- goto out; -- } -- ep2 = ep + 1; -- -- /* set FILE_INFO structure using the acquired struct dentry_t */ -- info->Attr = exfat_get_entry_attr(ep); -- -- exfat_get_entry_time(ep, &tm, TM_CREATE); -- info->CreateTimestamp.Year = tm.year; -- info->CreateTimestamp.Month = tm.mon; -- info->CreateTimestamp.Day = tm.day; -- info->CreateTimestamp.Hour = tm.hour; -- info->CreateTimestamp.Minute = tm.min; -- info->CreateTimestamp.Second = tm.sec; -- info->CreateTimestamp.MilliSecond = 0; -- -- exfat_get_entry_time(ep, &tm, TM_MODIFY); -- info->ModifyTimestamp.Year = tm.year; -- info->ModifyTimestamp.Month = tm.mon; -- info->ModifyTimestamp.Day = tm.day; -- info->ModifyTimestamp.Hour = tm.hour; -- info->ModifyTimestamp.Minute = tm.min; -- info->ModifyTimestamp.Second = tm.sec; -- info->ModifyTimestamp.MilliSecond = 0; -- -- memset((char *)&info->AccessTimestamp, 0, sizeof(struct date_time_t)); -- -- *uni_name.name = 0x0; -- /* XXX this is very bad for exfat cuz name is already included in es. -- * API should be revised -- */ -- exfat_get_uni_name_from_ext_entry(sb, &fid->dir, fid->entry, -- uni_name.name); -- nls_uniname_to_cstring(sb, info->Name, &uni_name); -- -- info->NumSubdirs = 2; -- -- info->Size = exfat_get_entry_size(ep2); -- -- release_entry_set(es); -- -- if (is_dir) { -- dir.dir = fid->start_clu; -- dir.flags = 0x01; -- -- if (info->Size == 0) -- info->Size = (u64)count_num_clusters(sb, &dir) << -- p_fs->cluster_size_bits; -- -- count = count_dos_name_entries(sb, &dir, TYPE_DIR); -- if (count < 0) { -- ret = count; /* propagate error upward */ -- goto out; -- } -- info->NumSubdirs += count; -- } -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- pr_debug("%s exited successfully\n", __func__); -- return ret; --} -- --static int ffsWriteStat(struct inode *inode, struct dir_entry_t *info) --{ -- int ret = 0; -- struct timestamp_t tm; -- struct dentry_t *ep, *ep2; -- struct entry_set_cache_t *es = NULL; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- u8 is_dir = (fid->type == TYPE_DIR) ? 1 : 0; -- -- pr_debug("%s entered (inode %p info %p\n", __func__, inode, info); -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- if (is_dir) { -- if ((fid->dir.dir == p_fs->root_dir) && -- (fid->entry == -1)) { -- if (p_fs->dev_ejected) -- ret = -EIO; -- ret = 0; -- goto out; -- } -- } -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- /* get the directory entry of given file or directory */ -- es = get_entry_set_in_dir(sb, &fid->dir, fid->entry, -- ES_ALL_ENTRIES, &ep); -- if (!es) { -- ret = -ENOENT; -- goto out; -- } -- ep2 = ep + 1; -- -- exfat_set_entry_attr(ep, info->Attr); -- -- /* set FILE_INFO structure using the acquired struct dentry_t */ -- tm.sec = info->CreateTimestamp.Second; -- tm.min = info->CreateTimestamp.Minute; -- tm.hour = info->CreateTimestamp.Hour; -- tm.day = info->CreateTimestamp.Day; -- tm.mon = info->CreateTimestamp.Month; -- tm.year = info->CreateTimestamp.Year; -- exfat_set_entry_time(ep, &tm, TM_CREATE); -- -- tm.sec = info->ModifyTimestamp.Second; -- tm.min = info->ModifyTimestamp.Minute; -- tm.hour = info->ModifyTimestamp.Hour; -- tm.day = info->ModifyTimestamp.Day; -- tm.mon = info->ModifyTimestamp.Month; -- tm.year = info->ModifyTimestamp.Year; -- exfat_set_entry_time(ep, &tm, TM_MODIFY); -- -- exfat_set_entry_size(ep2, info->Size); -- -- update_dir_checksum_with_entry_set(sb, es); -- release_entry_set(es); -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- pr_debug("%s exited (%d)\n", __func__, ret); -- -- return ret; --} -- --static int ffsMapCluster(struct inode *inode, s32 clu_offset, u32 *clu) --{ -- s32 num_clusters, num_alloced; -- bool modified = false; -- u32 last_clu; -- int ret = 0; -- struct chain_t new_clu; -- struct dentry_t *ep; -- struct entry_set_cache_t *es = NULL; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- -- /* check the validity of pointer parameters */ -- if (!clu) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- fid->rwoffset = (s64)(clu_offset) << p_fs->cluster_size_bits; -- -- if (EXFAT_I(inode)->mmu_private == 0) -- num_clusters = 0; -- else -- num_clusters = (s32)((EXFAT_I(inode)->mmu_private - 1) >> -- p_fs->cluster_size_bits) + 1; -- -- *clu = last_clu = fid->start_clu; -- -- if (fid->flags == 0x03) { -- if ((clu_offset > 0) && (*clu != CLUSTER_32(~0))) { -- last_clu += clu_offset - 1; -- -- if (clu_offset == num_clusters) -- *clu = CLUSTER_32(~0); -- else -- *clu += clu_offset; -- } -- } else { -- /* hint information */ -- if ((clu_offset > 0) && (fid->hint_last_off > 0) && -- (clu_offset >= fid->hint_last_off)) { -- clu_offset -= fid->hint_last_off; -- *clu = fid->hint_last_clu; -- } -- -- while ((clu_offset > 0) && (*clu != CLUSTER_32(~0))) { -- last_clu = *clu; -- if (exfat_fat_read(sb, *clu, clu) == -1) { -- ret = -EIO; -- goto out; -- } -- clu_offset--; -- } -- } -- -- if (*clu == CLUSTER_32(~0)) { -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- new_clu.dir = (last_clu == CLUSTER_32(~0)) ? CLUSTER_32(~0) : -- last_clu + 1; -- new_clu.size = 0; -- new_clu.flags = fid->flags; -- -- /* (1) allocate a cluster */ -- num_alloced = exfat_alloc_cluster(sb, 1, &new_clu); -- if (num_alloced < 0) { -- ret = -EIO; -- goto out; -- } else if (num_alloced == 0) { -- ret = -ENOSPC; -- goto out; -- } -- -- /* (2) append to the FAT chain */ -- if (last_clu == CLUSTER_32(~0)) { -- if (new_clu.flags == 0x01) -- fid->flags = 0x01; -- fid->start_clu = new_clu.dir; -- modified = true; -- } else { -- if (new_clu.flags != fid->flags) { -- exfat_chain_cont_cluster(sb, fid->start_clu, -- num_clusters); -- fid->flags = 0x01; -- modified = true; -- } -- if (new_clu.flags == 0x01) -- exfat_fat_write(sb, last_clu, new_clu.dir); -- } -- -- num_clusters += num_alloced; -- *clu = new_clu.dir; -- -- es = get_entry_set_in_dir(sb, &fid->dir, fid->entry, -- ES_ALL_ENTRIES, &ep); -- if (!es) { -- ret = -ENOENT; -- goto out; -- } -- /* get stream entry */ -- ep++; -- -- /* (3) update directory entry */ -- if (modified) { -- if (exfat_get_entry_flag(ep) != fid->flags) -- exfat_set_entry_flag(ep, fid->flags); -- -- if (exfat_get_entry_clu0(ep) != fid->start_clu) -- exfat_set_entry_clu0(ep, fid->start_clu); -- } -- -- update_dir_checksum_with_entry_set(sb, es); -- release_entry_set(es); -- -- /* add number of new blocks to inode */ -- inode->i_blocks += num_alloced << (p_fs->cluster_size_bits - 9); -- } -- -- /* hint information */ -- fid->hint_last_off = (s32)(fid->rwoffset >> p_fs->cluster_size_bits); -- fid->hint_last_clu = *clu; -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --/*----------------------------------------------------------------------*/ --/* Directory Operation Functions */ --/*----------------------------------------------------------------------*/ -- --static int ffsCreateDir(struct inode *inode, char *path, struct file_id_t *fid) --{ -- int ret = 0; -- struct chain_t dir; -- struct uni_name_t uni_name; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- pr_debug("%s entered\n", __func__); -- -- /* check the validity of pointer parameters */ -- if (!fid || !path || (*path == '\0')) -- return -EINVAL; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- /* check the validity of directory name in the given old pathname */ -- ret = resolve_path(inode, path, &dir, &uni_name); -- if (ret) -- goto out; -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- ret = create_dir(inode, &dir, &uni_name, fid); -- --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- -- if (p_fs->dev_ejected) -- ret = -EIO; --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static int ffsReadDir(struct inode *inode, struct dir_entry_t *dir_entry) --{ -- int i, dentry, clu_offset; -- int ret = 0; -- s32 dentries_per_clu, dentries_per_clu_bits = 0; -- u32 type; -- sector_t sector; -- struct chain_t dir, clu; -- struct uni_name_t uni_name; -- struct timestamp_t tm; -- struct dentry_t *ep; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- -- /* check the validity of pointer parameters */ -- if (!dir_entry) -- return -EINVAL; -- -- /* check if the given file ID is opened */ -- if (fid->type != TYPE_DIR) -- return -ENOTDIR; -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- if (fid->entry == -1) { -- dir.dir = p_fs->root_dir; -- dir.flags = 0x01; -- } else { -- dir.dir = fid->start_clu; -- dir.size = (s32)(fid->size >> p_fs->cluster_size_bits); -- dir.flags = fid->flags; -- } -- -- dentry = (s32)fid->rwoffset; -- -- if (dir.dir == CLUSTER_32(0)) { -- /* FAT16 root_dir */ -- dentries_per_clu = p_fs->dentries_in_root; -- -- if (dentry == dentries_per_clu) { -- clu.dir = CLUSTER_32(~0); -- } else { -- clu.dir = dir.dir; -- clu.size = dir.size; -- clu.flags = dir.flags; -- } -- } else { -- dentries_per_clu = p_fs->dentries_per_clu; -- dentries_per_clu_bits = ilog2(dentries_per_clu); -- -- clu_offset = dentry >> dentries_per_clu_bits; -- clu.dir = dir.dir; -- clu.size = dir.size; -- clu.flags = dir.flags; -- -- if (clu.flags == 0x03) { -- clu.dir += clu_offset; -- clu.size -= clu_offset; -- } else { -- /* hint_information */ -- if ((clu_offset > 0) && (fid->hint_last_off > 0) && -- (clu_offset >= fid->hint_last_off)) { -- clu_offset -= fid->hint_last_off; -- clu.dir = fid->hint_last_clu; -- } -- -- while (clu_offset > 0) { -- /* clu.dir = exfat_fat_read(sb, clu.dir); */ -- if (exfat_fat_read(sb, clu.dir, &clu.dir) == -1) { -- ret = -EIO; -- goto out; -- } -- clu_offset--; -- } -- } -- } -- -- while (clu.dir != CLUSTER_32(~0)) { -- if (p_fs->dev_ejected) -- break; -- -- if (dir.dir == CLUSTER_32(0)) /* FAT16 root_dir */ -- i = dentry % dentries_per_clu; -- else -- i = dentry & (dentries_per_clu - 1); -- -- for ( ; i < dentries_per_clu; i++, dentry++) { -- ep = get_entry_in_dir(sb, &clu, i, §or); -- if (!ep) { -- ret = -ENOENT; -- goto out; -- } -- type = exfat_get_entry_type(ep); -- -- if (type == TYPE_UNUSED) -- break; -- -- if ((type != TYPE_FILE) && (type != TYPE_DIR)) -- continue; -- -- exfat_buf_lock(sb, sector); -- dir_entry->Attr = exfat_get_entry_attr(ep); -- -- exfat_get_entry_time(ep, &tm, TM_CREATE); -- dir_entry->CreateTimestamp.Year = tm.year; -- dir_entry->CreateTimestamp.Month = tm.mon; -- dir_entry->CreateTimestamp.Day = tm.day; -- dir_entry->CreateTimestamp.Hour = tm.hour; -- dir_entry->CreateTimestamp.Minute = tm.min; -- dir_entry->CreateTimestamp.Second = tm.sec; -- dir_entry->CreateTimestamp.MilliSecond = 0; -- -- exfat_get_entry_time(ep, &tm, TM_MODIFY); -- dir_entry->ModifyTimestamp.Year = tm.year; -- dir_entry->ModifyTimestamp.Month = tm.mon; -- dir_entry->ModifyTimestamp.Day = tm.day; -- dir_entry->ModifyTimestamp.Hour = tm.hour; -- dir_entry->ModifyTimestamp.Minute = tm.min; -- dir_entry->ModifyTimestamp.Second = tm.sec; -- dir_entry->ModifyTimestamp.MilliSecond = 0; -- -- memset((char *)&dir_entry->AccessTimestamp, 0, -- sizeof(struct date_time_t)); -- -- *uni_name.name = 0x0; -- exfat_get_uni_name_from_ext_entry(sb, &dir, dentry, -- uni_name.name); -- nls_uniname_to_cstring(sb, dir_entry->Name, &uni_name); -- exfat_buf_unlock(sb, sector); -- -- ep = get_entry_in_dir(sb, &clu, i + 1, NULL); -- if (!ep) { -- ret = -ENOENT; -- goto out; -- } -- -- dir_entry->Size = exfat_get_entry_size(ep); -- -- /* hint information */ -- if (dir.dir == CLUSTER_32(0)) { /* FAT16 root_dir */ -- } else { -- fid->hint_last_off = dentry >> -- dentries_per_clu_bits; -- fid->hint_last_clu = clu.dir; -- } -- -- fid->rwoffset = (s64)(++dentry); -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- goto out; -- } -- -- if (dir.dir == CLUSTER_32(0)) -- break; /* FAT16 root_dir */ -- -- if (clu.flags == 0x03) { -- if ((--clu.size) > 0) -- clu.dir++; -- else -- clu.dir = CLUSTER_32(~0); -- } else { -- /* clu.dir = exfat_fat_read(sb, clu.dir); */ -- if (exfat_fat_read(sb, clu.dir, &clu.dir) == -1) { -- ret = -EIO; -- goto out; -- } -- } -- } -- -- *dir_entry->Name = '\0'; -- -- fid->rwoffset = (s64)(++dentry); -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --static int ffsRemoveDir(struct inode *inode, struct file_id_t *fid) --{ -- s32 dentry; -- int ret = 0; -- struct chain_t dir, clu_to_free; -- struct super_block *sb = inode->i_sb; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- /* check the validity of the given file id */ -- if (!fid) -- return -EINVAL; -- -- dir.dir = fid->dir.dir; -- dir.size = fid->dir.size; -- dir.flags = fid->dir.flags; -- -- dentry = fid->entry; -- -- /* check if the file is "." or ".." */ -- if (p_fs->vol_type != EXFAT) { -- if ((dir.dir != p_fs->root_dir) && (dentry < 2)) -- return -EPERM; -- } -- -- /* acquire the lock for file system critical section */ -- mutex_lock(&p_fs->v_mutex); -- -- clu_to_free.dir = fid->start_clu; -- clu_to_free.size = (s32)((fid->size - 1) >> p_fs->cluster_size_bits) + 1; -- clu_to_free.flags = fid->flags; -- -- if (!is_dir_empty(sb, &clu_to_free)) { -- ret = -ENOTEMPTY; -- goto out; -- } -- -- fs_set_vol_flags(sb, VOL_DIRTY); -- -- /* (1) update the directory entry */ -- remove_file(inode, &dir, dentry); -- -- /* (2) free the clusters */ -- exfat_free_cluster(sb, &clu_to_free, 1); -- -- fid->size = 0; -- fid->start_clu = CLUSTER_32(~0); -- fid->flags = (p_fs->vol_type == EXFAT) ? 0x03 : 0x01; -- --#ifndef CONFIG_STAGING_EXFAT_DELAYED_SYNC -- fs_sync(sb, true); -- fs_set_vol_flags(sb, VOL_CLEAN); --#endif -- -- if (p_fs->dev_ejected) -- ret = -EIO; -- --out: -- /* release the lock for file system critical section */ -- mutex_unlock(&p_fs->v_mutex); -- -- return ret; --} -- --/*======================================================================*/ --/* Directory Entry Operations */ --/*======================================================================*/ -- --static int exfat_readdir(struct file *filp, struct dir_context *ctx) --{ -- struct inode *inode = file_inode(filp); -- struct super_block *sb = inode->i_sb; -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct fs_info_t *p_fs = &sbi->fs_info; -- struct bd_info_t *p_bd = &(EXFAT_SB(sb)->bd_info); -- struct dir_entry_t de; -- unsigned long inum; -- loff_t cpos; -- int err = 0; -- -- __lock_super(sb); -- -- cpos = ctx->pos; -- /* Fake . and .. for the root directory. */ -- if ((p_fs->vol_type == EXFAT) || (inode->i_ino == EXFAT_ROOT_INO)) { -- while (cpos < 2) { -- if (inode->i_ino == EXFAT_ROOT_INO) -- inum = EXFAT_ROOT_INO; -- else if (cpos == 0) -- inum = inode->i_ino; -- else /* (cpos == 1) */ -- inum = parent_ino(filp->f_path.dentry); -- -- if (!dir_emit_dots(filp, ctx)) -- goto out; -- cpos++; -- ctx->pos++; -- } -- if (cpos == 2) -- cpos = 0; -- } -- if (cpos & (DENTRY_SIZE - 1)) { -- err = -ENOENT; -- goto out; -- } -- --get_new: -- EXFAT_I(inode)->fid.size = i_size_read(inode); -- EXFAT_I(inode)->fid.rwoffset = cpos >> DENTRY_SIZE_BITS; -- -- err = ffsReadDir(inode, &de); -- if (err) { -- /* at least we tried to read a sector -- * move cpos to next sector position (should be aligned) -- */ -- if (err == -EIO) { -- cpos += 1 << p_bd->sector_size_bits; -- cpos &= ~((1 << p_bd->sector_size_bits) - 1); -- } -- -- goto end_of_dir; -- } -- -- cpos = EXFAT_I(inode)->fid.rwoffset << DENTRY_SIZE_BITS; -- -- if (!de.Name[0]) -- goto end_of_dir; -- -- if (!memcmp(de.ShortName, DOS_CUR_DIR_NAME, DOS_NAME_LENGTH)) { -- inum = inode->i_ino; -- } else if (!memcmp(de.ShortName, DOS_PAR_DIR_NAME, DOS_NAME_LENGTH)) { -- inum = parent_ino(filp->f_path.dentry); -- } else { -- loff_t i_pos = ((loff_t)EXFAT_I(inode)->fid.start_clu << 32) | -- ((EXFAT_I(inode)->fid.rwoffset - 1) & 0xffffffff); -- struct inode *tmp = exfat_iget(sb, i_pos); -- -- if (tmp) { -- inum = tmp->i_ino; -- iput(tmp); -- } else { -- inum = iunique(sb, EXFAT_ROOT_INO); -- } -- } -- -- if (!dir_emit(ctx, de.Name, strlen(de.Name), inum, -- (de.Attr & ATTR_SUBDIR) ? DT_DIR : DT_REG)) -- goto out; -- -- ctx->pos = cpos; -- goto get_new; -- --end_of_dir: -- ctx->pos = cpos; --out: -- __unlock_super(sb); -- return err; --} -- --static int exfat_ioctl_volume_id(struct inode *dir) --{ -- struct super_block *sb = dir->i_sb; -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct fs_info_t *p_fs = &sbi->fs_info; -- -- return p_fs->vol_id; --} -- --static long exfat_generic_ioctl(struct file *filp, unsigned int cmd, -- unsigned long arg) --{ -- struct inode *inode = filp->f_path.dentry->d_inode; --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- unsigned int flags; --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- -- switch (cmd) { -- case EXFAT_IOCTL_GET_VOLUME_ID: -- return exfat_ioctl_volume_id(inode); --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- case EXFAT_IOC_GET_DEBUGFLAGS: { -- struct super_block *sb = inode->i_sb; -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- flags = sbi->debug_flags; -- return put_user(flags, (int __user *)arg); -- } -- case EXFAT_IOC_SET_DEBUGFLAGS: { -- struct super_block *sb = inode->i_sb; -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- if (!capable(CAP_SYS_ADMIN)) -- return -EPERM; -- -- if (get_user(flags, (int __user *)arg)) -- return -EFAULT; -- -- __lock_super(sb); -- sbi->debug_flags = flags; -- __unlock_super(sb); -- -- return 0; -- } --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- default: -- return -ENOTTY; /* Inappropriate ioctl for device */ -- } --} -- --static const struct file_operations exfat_dir_operations = { -- .llseek = generic_file_llseek, -- .read = generic_read_dir, -- .iterate = exfat_readdir, -- .unlocked_ioctl = exfat_generic_ioctl, -- .fsync = generic_file_fsync, --}; -- --static int exfat_create(struct inode *dir, struct dentry *dentry, umode_t mode, -- bool excl) --{ -- struct super_block *sb = dir->i_sb; -- struct timespec64 curtime; -- struct inode *inode; -- struct file_id_t fid; -- loff_t i_pos; -- int err; -- -- __lock_super(sb); -- -- pr_debug("%s entered\n", __func__); -- -- err = ffsCreateFile(dir, (u8 *)dentry->d_name.name, FM_REGULAR, &fid); -- if (err) -- goto out; -- -- INC_IVERSION(dir); -- curtime = current_time(dir); -- dir->i_ctime = curtime; -- dir->i_mtime = curtime; -- dir->i_atime = curtime; -- if (IS_DIRSYNC(dir)) -- (void)exfat_sync_inode(dir); -- else -- mark_inode_dirty(dir); -- -- i_pos = ((loff_t)fid.dir.dir << 32) | (fid.entry & 0xffffffff); -- -- inode = exfat_build_inode(sb, &fid, i_pos); -- if (IS_ERR(inode)) { -- err = PTR_ERR(inode); -- goto out; -- } -- INC_IVERSION(inode); -- curtime = current_time(inode); -- inode->i_mtime = curtime; -- inode->i_atime = curtime; -- inode->i_ctime = curtime; -- /* -- * timestamp is already written, so mark_inode_dirty() is unnecessary. -- */ -- -- dentry->d_time = GET_IVERSION(dentry->d_parent->d_inode); -- d_instantiate(dentry, inode); -- --out: -- __unlock_super(sb); -- pr_debug("%s exited\n", __func__); -- return err; --} -- --static int exfat_find(struct inode *dir, struct qstr *qname, -- struct file_id_t *fid) --{ -- int err; -- -- if (qname->len == 0) -- return -ENOENT; -- -- err = ffsLookupFile(dir, (u8 *)qname->name, fid); -- if (err) -- return -ENOENT; -- -- return 0; --} -- --static int exfat_d_anon_disconn(struct dentry *dentry) --{ -- return IS_ROOT(dentry) && (dentry->d_flags & DCACHE_DISCONNECTED); --} -- --static struct dentry *exfat_lookup(struct inode *dir, struct dentry *dentry, -- unsigned int flags) --{ -- struct super_block *sb = dir->i_sb; -- struct inode *inode; -- struct dentry *alias; -- int err; -- struct file_id_t fid; -- loff_t i_pos; -- u64 ret; -- mode_t i_mode; -- -- __lock_super(sb); -- pr_debug("%s entered\n", __func__); -- err = exfat_find(dir, &dentry->d_name, &fid); -- if (err) { -- if (err == -ENOENT) { -- inode = NULL; -- goto out; -- } -- goto error; -- } -- -- i_pos = ((loff_t)fid.dir.dir << 32) | (fid.entry & 0xffffffff); -- inode = exfat_build_inode(sb, &fid, i_pos); -- if (IS_ERR(inode)) { -- err = PTR_ERR(inode); -- goto error; -- } -- -- i_mode = inode->i_mode; -- if (S_ISLNK(i_mode) && !EXFAT_I(inode)->target) { -- EXFAT_I(inode)->target = kmalloc(i_size_read(inode) + 1, -- GFP_KERNEL); -- if (!EXFAT_I(inode)->target) { -- err = -ENOMEM; -- goto error; -- } -- ffsReadFile(dir, &fid, EXFAT_I(inode)->target, -- i_size_read(inode), &ret); -- *(EXFAT_I(inode)->target + i_size_read(inode)) = '\0'; -- } -- -- alias = d_find_alias(inode); -- if (alias && !exfat_d_anon_disconn(alias)) { -- BUG_ON(d_unhashed(alias)); -- if (!S_ISDIR(i_mode)) -- d_move(alias, dentry); -- iput(inode); -- __unlock_super(sb); -- pr_debug("%s exited 1\n", __func__); -- return alias; -- } -- dput(alias); --out: -- __unlock_super(sb); -- dentry->d_time = GET_IVERSION(dentry->d_parent->d_inode); -- dentry = d_splice_alias(inode, dentry); -- if (dentry) -- dentry->d_time = GET_IVERSION(dentry->d_parent->d_inode); -- pr_debug("%s exited 2\n", __func__); -- return dentry; -- --error: -- __unlock_super(sb); -- pr_debug("%s exited 3\n", __func__); -- return ERR_PTR(err); --} -- --static inline unsigned long exfat_hash(loff_t i_pos) --{ -- return hash_32(i_pos, EXFAT_HASH_BITS); --} -- --static void exfat_attach(struct inode *inode, loff_t i_pos) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -- struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos); -- -- spin_lock(&sbi->inode_hash_lock); -- EXFAT_I(inode)->i_pos = i_pos; -- hlist_add_head(&EXFAT_I(inode)->i_hash_fat, head); -- spin_unlock(&sbi->inode_hash_lock); --} -- --static void exfat_detach(struct inode *inode) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -- -- spin_lock(&sbi->inode_hash_lock); -- hlist_del_init(&EXFAT_I(inode)->i_hash_fat); -- EXFAT_I(inode)->i_pos = 0; -- spin_unlock(&sbi->inode_hash_lock); --} -- --static int exfat_unlink(struct inode *dir, struct dentry *dentry) --{ -- struct inode *inode = dentry->d_inode; -- struct super_block *sb = dir->i_sb; -- struct timespec64 curtime; -- int err; -- -- __lock_super(sb); -- -- pr_debug("%s entered\n", __func__); -- -- EXFAT_I(inode)->fid.size = i_size_read(inode); -- -- err = ffsRemoveFile(dir, &(EXFAT_I(inode)->fid)); -- if (err) -- goto out; -- -- INC_IVERSION(dir); -- curtime = current_time(dir); -- dir->i_mtime = curtime; -- dir->i_atime = curtime; -- if (IS_DIRSYNC(dir)) -- (void)exfat_sync_inode(dir); -- else -- mark_inode_dirty(dir); -- -- clear_nlink(inode); -- curtime = current_time(inode); -- inode->i_mtime = curtime; -- inode->i_atime = curtime; -- exfat_detach(inode); -- remove_inode_hash(inode); -- --out: -- __unlock_super(sb); -- pr_debug("%s exited\n", __func__); -- return err; --} -- --static int exfat_symlink(struct inode *dir, struct dentry *dentry, -- const char *target) --{ -- struct super_block *sb = dir->i_sb; -- struct timespec64 curtime; -- struct inode *inode; -- struct file_id_t fid; -- loff_t i_pos; -- int err; -- u64 len = (u64)strlen(target); -- u64 ret; -- -- __lock_super(sb); -- -- pr_debug("%s entered\n", __func__); -- -- err = ffsCreateFile(dir, (u8 *)dentry->d_name.name, FM_SYMLINK, &fid); -- if (err) -- goto out; -- -- -- err = ffsWriteFile(dir, &fid, (char *)target, len, &ret); -- -- if (err) { -- ffsRemoveFile(dir, &fid); -- goto out; -- } -- -- INC_IVERSION(dir); -- curtime = current_time(dir); -- dir->i_ctime = curtime; -- dir->i_mtime = curtime; -- dir->i_atime = curtime; -- if (IS_DIRSYNC(dir)) -- (void)exfat_sync_inode(dir); -- else -- mark_inode_dirty(dir); -- -- i_pos = ((loff_t)fid.dir.dir << 32) | (fid.entry & 0xffffffff); -- -- inode = exfat_build_inode(sb, &fid, i_pos); -- if (IS_ERR(inode)) { -- err = PTR_ERR(inode); -- goto out; -- } -- INC_IVERSION(inode); -- curtime = current_time(inode); -- inode->i_mtime = curtime; -- inode->i_atime = curtime; -- inode->i_ctime = curtime; -- /* timestamp is already written, so mark_inode_dirty() is unneeded. */ -- -- EXFAT_I(inode)->target = kmemdup(target, len + 1, GFP_KERNEL); -- if (!EXFAT_I(inode)->target) { -- err = -ENOMEM; -- goto out; -- } -- -- dentry->d_time = GET_IVERSION(dentry->d_parent->d_inode); -- d_instantiate(dentry, inode); -- --out: -- __unlock_super(sb); -- pr_debug("%s exited\n", __func__); -- return err; --} -- --static int exfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) --{ -- struct super_block *sb = dir->i_sb; -- struct timespec64 curtime; -- struct inode *inode; -- struct file_id_t fid; -- loff_t i_pos; -- int err; -- -- __lock_super(sb); -- -- pr_debug("%s entered\n", __func__); -- -- err = ffsCreateDir(dir, (u8 *)dentry->d_name.name, &fid); -- if (err) -- goto out; -- -- INC_IVERSION(dir); -- curtime = current_time(dir); -- dir->i_ctime = curtime; -- dir->i_mtime = curtime; -- dir->i_atime = curtime; -- if (IS_DIRSYNC(dir)) -- (void)exfat_sync_inode(dir); -- else -- mark_inode_dirty(dir); -- inc_nlink(dir); -- -- i_pos = ((loff_t)fid.dir.dir << 32) | (fid.entry & 0xffffffff); -- -- inode = exfat_build_inode(sb, &fid, i_pos); -- if (IS_ERR(inode)) { -- err = PTR_ERR(inode); -- goto out; -- } -- INC_IVERSION(inode); -- curtime = current_time(inode); -- inode->i_mtime = curtime; -- inode->i_atime = curtime; -- inode->i_ctime = curtime; -- /* timestamp is already written, so mark_inode_dirty() is unneeded. */ -- -- dentry->d_time = GET_IVERSION(dentry->d_parent->d_inode); -- d_instantiate(dentry, inode); -- --out: -- __unlock_super(sb); -- pr_debug("%s exited\n", __func__); -- return err; --} -- --static int exfat_rmdir(struct inode *dir, struct dentry *dentry) --{ -- struct inode *inode = dentry->d_inode; -- struct super_block *sb = dir->i_sb; -- struct timespec64 curtime; -- int err; -- -- __lock_super(sb); -- -- pr_debug("%s entered\n", __func__); -- -- EXFAT_I(inode)->fid.size = i_size_read(inode); -- -- err = ffsRemoveDir(dir, &(EXFAT_I(inode)->fid)); -- if (err) -- goto out; -- -- INC_IVERSION(dir); -- curtime = current_time(dir); -- dir->i_mtime = curtime; -- dir->i_atime = curtime; -- if (IS_DIRSYNC(dir)) -- (void)exfat_sync_inode(dir); -- else -- mark_inode_dirty(dir); -- drop_nlink(dir); -- -- clear_nlink(inode); -- curtime = current_time(inode); -- inode->i_mtime = curtime; -- inode->i_atime = curtime; -- exfat_detach(inode); -- remove_inode_hash(inode); -- --out: -- __unlock_super(sb); -- pr_debug("%s exited\n", __func__); -- return err; --} -- --static int exfat_rename(struct inode *old_dir, struct dentry *old_dentry, -- struct inode *new_dir, struct dentry *new_dentry, -- unsigned int flags) --{ -- struct inode *old_inode, *new_inode; -- struct super_block *sb = old_dir->i_sb; -- struct timespec64 curtime; -- loff_t i_pos; -- int err; -- -- if (flags) -- return -EINVAL; -- -- __lock_super(sb); -- -- pr_debug("%s entered\n", __func__); -- -- old_inode = old_dentry->d_inode; -- new_inode = new_dentry->d_inode; -- -- EXFAT_I(old_inode)->fid.size = i_size_read(old_inode); -- -- err = ffsMoveFile(old_dir, &(EXFAT_I(old_inode)->fid), new_dir, -- new_dentry); -- if (err) -- goto out; -- -- INC_IVERSION(new_dir); -- curtime = current_time(new_dir); -- new_dir->i_ctime = curtime; -- new_dir->i_mtime = curtime; -- new_dir->i_atime = curtime; -- -- if (IS_DIRSYNC(new_dir)) -- (void)exfat_sync_inode(new_dir); -- else -- mark_inode_dirty(new_dir); -- -- i_pos = ((loff_t)EXFAT_I(old_inode)->fid.dir.dir << 32) | -- (EXFAT_I(old_inode)->fid.entry & 0xffffffff); -- -- exfat_detach(old_inode); -- exfat_attach(old_inode, i_pos); -- if (IS_DIRSYNC(new_dir)) -- (void)exfat_sync_inode(old_inode); -- else -- mark_inode_dirty(old_inode); -- -- if ((S_ISDIR(old_inode->i_mode)) && (old_dir != new_dir)) { -- drop_nlink(old_dir); -- if (!new_inode) -- inc_nlink(new_dir); -- } -- INC_IVERSION(old_dir); -- curtime = current_time(old_dir); -- old_dir->i_ctime = curtime; -- old_dir->i_mtime = curtime; -- if (IS_DIRSYNC(old_dir)) -- (void)exfat_sync_inode(old_dir); -- else -- mark_inode_dirty(old_dir); -- -- if (new_inode) { -- exfat_detach(new_inode); -- drop_nlink(new_inode); -- if (S_ISDIR(new_inode->i_mode)) -- drop_nlink(new_inode); -- new_inode->i_ctime = current_time(new_inode); -- } -- --out: -- __unlock_super(sb); -- pr_debug("%s exited\n", __func__); -- return err; --} -- --static int exfat_cont_expand(struct inode *inode, loff_t size) --{ -- struct address_space *mapping = inode->i_mapping; -- loff_t start = i_size_read(inode), count = size - i_size_read(inode); -- struct timespec64 curtime; -- int err, err2; -- -- err = generic_cont_expand_simple(inode, size); -- if (err != 0) -- return err; -- -- curtime = current_time(inode); -- inode->i_ctime = curtime; -- inode->i_mtime = curtime; -- mark_inode_dirty(inode); -- -- if (IS_SYNC(inode)) { -- err = filemap_fdatawrite_range(mapping, start, -- start + count - 1); -- err2 = sync_mapping_buffers(mapping); -- err = (err) ? (err) : (err2); -- err2 = write_inode_now(inode, 1); -- err = (err) ? (err) : (err2); -- if (!err) -- err = filemap_fdatawait_range(mapping, start, -- start + count - 1); -- } -- return err; --} -- --static int exfat_allow_set_time(struct exfat_sb_info *sbi, struct inode *inode) --{ -- mode_t allow_utime = sbi->options.allow_utime; -- -- if (!uid_eq(current_fsuid(), inode->i_uid)) { -- if (in_group_p(inode->i_gid)) -- allow_utime >>= 3; -- if (allow_utime & MAY_WRITE) -- return 1; -- } -- -- /* use a default check */ -- return 0; --} -- --static int exfat_sanitize_mode(const struct exfat_sb_info *sbi, -- struct inode *inode, umode_t *mode_ptr) --{ -- mode_t i_mode, mask, perm; -- -- i_mode = inode->i_mode; -- -- if (S_ISREG(i_mode) || S_ISLNK(i_mode)) -- mask = sbi->options.fs_fmask; -- else -- mask = sbi->options.fs_dmask; -- -- perm = *mode_ptr & ~(S_IFMT | mask); -- -- /* Of the r and x bits, all (subject to umask) must be present.*/ -- if ((perm & 0555) != (i_mode & 0555)) -- return -EPERM; -- -- if (exfat_mode_can_hold_ro(inode)) { -- /* -- * Of the w bits, either all (subject to umask) or none must be -- * present. -- */ -- if ((perm & 0222) && ((perm & 0222) != (0222 & ~mask))) -- return -EPERM; -- } else { -- /* -- * If exfat_mode_can_hold_ro(inode) is false, can't change w -- * bits. -- */ -- if ((perm & 0222) != (0222 & ~mask)) -- return -EPERM; -- } -- -- *mode_ptr &= S_IFMT | perm; -- -- return 0; --} -- --static void exfat_truncate(struct inode *inode, loff_t old_size) --{ -- struct super_block *sb = inode->i_sb; -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct fs_info_t *p_fs = &sbi->fs_info; -- struct timespec64 curtime; -- int err; -- -- __lock_super(sb); -- -- /* -- * This protects against truncating a file bigger than it was then -- * trying to write into the hole. -- */ -- if (EXFAT_I(inode)->mmu_private > i_size_read(inode)) -- EXFAT_I(inode)->mmu_private = i_size_read(inode); -- -- if (EXFAT_I(inode)->fid.start_clu == 0) -- goto out; -- -- err = ffsTruncateFile(inode, old_size, i_size_read(inode)); -- if (err) -- goto out; -- -- curtime = current_time(inode); -- inode->i_ctime = curtime; -- inode->i_mtime = curtime; -- if (IS_DIRSYNC(inode)) -- (void)exfat_sync_inode(inode); -- else -- mark_inode_dirty(inode); -- -- inode->i_blocks = ((i_size_read(inode) + (p_fs->cluster_size - 1)) & -- ~((loff_t)p_fs->cluster_size - 1)) >> 9; --out: -- __unlock_super(sb); --} -- --static int exfat_setattr(struct dentry *dentry, struct iattr *attr) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(dentry->d_sb); -- struct inode *inode = dentry->d_inode; -- unsigned int ia_valid; -- int error; -- loff_t old_size; -- -- pr_debug("%s entered\n", __func__); -- -- if ((attr->ia_valid & ATTR_SIZE) && -- attr->ia_size > i_size_read(inode)) { -- error = exfat_cont_expand(inode, attr->ia_size); -- if (error || attr->ia_valid == ATTR_SIZE) -- return error; -- attr->ia_valid &= ~ATTR_SIZE; -- } -- -- ia_valid = attr->ia_valid; -- -- if ((ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) && -- exfat_allow_set_time(sbi, inode)) { -- attr->ia_valid &= ~(ATTR_MTIME_SET | -- ATTR_ATIME_SET | -- ATTR_TIMES_SET); -- } -- -- error = setattr_prepare(dentry, attr); -- attr->ia_valid = ia_valid; -- if (error) -- return error; -- -- if (((attr->ia_valid & ATTR_UID) && -- (!uid_eq(attr->ia_uid, sbi->options.fs_uid))) || -- ((attr->ia_valid & ATTR_GID) && -- (!gid_eq(attr->ia_gid, sbi->options.fs_gid))) || -- ((attr->ia_valid & ATTR_MODE) && -- (attr->ia_mode & ~(S_IFREG | S_IFLNK | S_IFDIR | 0777)))) { -- return -EPERM; -- } -- -- /* -- * We don't return -EPERM here. Yes, strange, but this is too -- * old behavior. -- */ -- if (attr->ia_valid & ATTR_MODE) { -- if (exfat_sanitize_mode(sbi, inode, &attr->ia_mode) < 0) -- attr->ia_valid &= ~ATTR_MODE; -- } -- -- EXFAT_I(inode)->fid.size = i_size_read(inode); -- -- if (attr->ia_valid & ATTR_SIZE) { -- old_size = i_size_read(inode); -- down_write(&EXFAT_I(inode)->truncate_lock); -- truncate_setsize(inode, attr->ia_size); -- exfat_truncate(inode, old_size); -- up_write(&EXFAT_I(inode)->truncate_lock); -- } -- setattr_copy(inode, attr); -- mark_inode_dirty(inode); -- -- pr_debug("%s exited\n", __func__); -- return error; --} -- --static int exfat_getattr(const struct path *path, struct kstat *stat, -- u32 request_mask, unsigned int flags) --{ -- struct inode *inode = path->dentry->d_inode; -- -- pr_debug("%s entered\n", __func__); -- -- generic_fillattr(inode, stat); -- stat->blksize = EXFAT_SB(inode->i_sb)->fs_info.cluster_size; -- -- pr_debug("%s exited\n", __func__); -- return 0; --} -- --static const struct inode_operations exfat_dir_inode_operations = { -- .create = exfat_create, -- .lookup = exfat_lookup, -- .unlink = exfat_unlink, -- .symlink = exfat_symlink, -- .mkdir = exfat_mkdir, -- .rmdir = exfat_rmdir, -- .rename = exfat_rename, -- .setattr = exfat_setattr, -- .getattr = exfat_getattr, --}; -- --/*======================================================================*/ --/* File Operations */ --/*======================================================================*/ --static const char *exfat_get_link(struct dentry *dentry, struct inode *inode, -- struct delayed_call *done) --{ -- struct exfat_inode_info *ei = EXFAT_I(inode); -- -- if (ei->target) { -- char *cookie = ei->target; -- -- if (cookie) -- return (char *)(ei->target); -- } -- return NULL; --} -- --static const struct inode_operations exfat_symlink_inode_operations = { -- .get_link = exfat_get_link, --}; -- --static int exfat_file_release(struct inode *inode, struct file *filp) --{ -- struct super_block *sb = inode->i_sb; -- -- EXFAT_I(inode)->fid.size = i_size_read(inode); -- ffsSyncVol(sb, false); -- return 0; --} -- --static const struct file_operations exfat_file_operations = { -- .llseek = generic_file_llseek, -- .read_iter = generic_file_read_iter, -- .write_iter = generic_file_write_iter, -- .mmap = generic_file_mmap, -- .release = exfat_file_release, -- .unlocked_ioctl = exfat_generic_ioctl, -- .fsync = generic_file_fsync, -- .splice_read = generic_file_splice_read, --}; -- --static const struct inode_operations exfat_file_inode_operations = { -- .setattr = exfat_setattr, -- .getattr = exfat_getattr, --}; -- --/*======================================================================*/ --/* Address Space Operations */ --/*======================================================================*/ -- --static int exfat_bmap(struct inode *inode, sector_t sector, sector_t *phys, -- unsigned long *mapped_blocks, int *create) --{ -- struct super_block *sb = inode->i_sb; -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct fs_info_t *p_fs = &sbi->fs_info; -- const unsigned long blocksize = sb->s_blocksize; -- const unsigned char blocksize_bits = sb->s_blocksize_bits; -- sector_t last_block; -- int err, clu_offset, sec_offset; -- unsigned int cluster; -- -- *phys = 0; -- *mapped_blocks = 0; -- -- last_block = (i_size_read(inode) + (blocksize - 1)) >> blocksize_bits; -- if (sector >= last_block) { -- if (*create == 0) -- return 0; -- } else { -- *create = 0; -- } -- -- /* cluster offset */ -- clu_offset = sector >> p_fs->sectors_per_clu_bits; -- -- /* sector offset in cluster */ -- sec_offset = sector & (p_fs->sectors_per_clu - 1); -- -- EXFAT_I(inode)->fid.size = i_size_read(inode); -- -- err = ffsMapCluster(inode, clu_offset, &cluster); -- -- if (!err && (cluster != CLUSTER_32(~0))) { -- *phys = START_SECTOR(cluster) + sec_offset; -- *mapped_blocks = p_fs->sectors_per_clu - sec_offset; -- } -- -- return 0; --} -- --static int exfat_get_block(struct inode *inode, sector_t iblock, -- struct buffer_head *bh_result, int create) --{ -- struct super_block *sb = inode->i_sb; -- unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits; -- int err; -- unsigned long mapped_blocks; -- sector_t phys; -- -- __lock_super(sb); -- -- err = exfat_bmap(inode, iblock, &phys, &mapped_blocks, &create); -- if (err) { -- __unlock_super(sb); -- return err; -- } -- -- if (phys) { -- max_blocks = min(mapped_blocks, max_blocks); -- if (create) { -- EXFAT_I(inode)->mmu_private += max_blocks << -- sb->s_blocksize_bits; -- set_buffer_new(bh_result); -- } -- map_bh(bh_result, sb, phys); -- } -- -- bh_result->b_size = max_blocks << sb->s_blocksize_bits; -- __unlock_super(sb); -- -- return 0; --} -- --static int exfat_readpage(struct file *file, struct page *page) --{ -- return mpage_readpage(page, exfat_get_block); --} -- --static int exfat_readpages(struct file *file, struct address_space *mapping, -- struct list_head *pages, unsigned int nr_pages) --{ -- return mpage_readpages(mapping, pages, nr_pages, exfat_get_block); --} -- --static int exfat_writepage(struct page *page, struct writeback_control *wbc) --{ -- return block_write_full_page(page, exfat_get_block, wbc); --} -- --static int exfat_writepages(struct address_space *mapping, -- struct writeback_control *wbc) --{ -- return mpage_writepages(mapping, wbc, exfat_get_block); --} -- --static void exfat_write_failed(struct address_space *mapping, loff_t to) --{ -- struct inode *inode = mapping->host; -- -- if (to > i_size_read(inode)) { -- truncate_pagecache(inode, i_size_read(inode)); -- EXFAT_I(inode)->fid.size = i_size_read(inode); -- exfat_truncate(inode, i_size_read(inode)); -- } --} -- --static int exfat_write_begin(struct file *file, struct address_space *mapping, -- loff_t pos, unsigned int len, unsigned int flags, -- struct page **pagep, void **fsdata) --{ -- int ret; -- -- *pagep = NULL; -- ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata, -- exfat_get_block, -- &EXFAT_I(mapping->host)->mmu_private); -- -- if (ret < 0) -- exfat_write_failed(mapping, pos + len); -- return ret; --} -- --static int exfat_write_end(struct file *file, struct address_space *mapping, -- loff_t pos, unsigned int len, unsigned int copied, -- struct page *pagep, void *fsdata) --{ -- struct inode *inode = mapping->host; -- struct file_id_t *fid = &(EXFAT_I(inode)->fid); -- struct timespec64 curtime; -- int err; -- -- err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata); -- -- if (err < len) -- exfat_write_failed(mapping, pos + len); -- -- if (!(err < 0) && !(fid->attr & ATTR_ARCHIVE)) { -- curtime = current_time(inode); -- inode->i_mtime = curtime; -- inode->i_ctime = curtime; -- fid->attr |= ATTR_ARCHIVE; -- mark_inode_dirty(inode); -- } -- return err; --} -- --static ssize_t exfat_direct_IO(struct kiocb *iocb, struct iov_iter *iter) --{ -- struct inode *inode = iocb->ki_filp->f_mapping->host; -- struct address_space *mapping = iocb->ki_filp->f_mapping; -- ssize_t ret; -- int rw; -- -- rw = iov_iter_rw(iter); -- -- if (rw == WRITE) { -- if (EXFAT_I(inode)->mmu_private < iov_iter_count(iter)) -- return 0; -- } -- ret = blockdev_direct_IO(iocb, inode, iter, exfat_get_block); -- -- if ((ret < 0) && (rw & WRITE)) -- exfat_write_failed(mapping, iov_iter_count(iter)); -- return ret; --} -- --static sector_t _exfat_bmap(struct address_space *mapping, sector_t block) --{ -- sector_t blocknr; -- -- /* exfat_get_cluster() assumes the requested blocknr isn't truncated. */ -- down_read(&EXFAT_I(mapping->host)->truncate_lock); -- blocknr = generic_block_bmap(mapping, block, exfat_get_block); -- up_read(&EXFAT_I(mapping->host)->truncate_lock); -- -- return blocknr; --} -- --static const struct address_space_operations exfat_aops = { -- .readpage = exfat_readpage, -- .readpages = exfat_readpages, -- .writepage = exfat_writepage, -- .writepages = exfat_writepages, -- .write_begin = exfat_write_begin, -- .write_end = exfat_write_end, -- .direct_IO = exfat_direct_IO, -- .bmap = _exfat_bmap --}; -- --/*======================================================================*/ --/* Super Operations */ --/*======================================================================*/ -- --static struct inode *exfat_iget(struct super_block *sb, loff_t i_pos) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct exfat_inode_info *info; -- struct hlist_head *head = sbi->inode_hashtable + exfat_hash(i_pos); -- struct inode *inode = NULL; -- -- spin_lock(&sbi->inode_hash_lock); -- hlist_for_each_entry(info, head, i_hash_fat) { -- BUG_ON(info->vfs_inode.i_sb != sb); -- -- if (i_pos != info->i_pos) -- continue; -- inode = igrab(&info->vfs_inode); -- if (inode) -- break; -- } -- spin_unlock(&sbi->inode_hash_lock); -- return inode; --} -- --/* doesn't deal with root inode */ --static int exfat_fill_inode(struct inode *inode, struct file_id_t *fid) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(inode->i_sb); -- struct fs_info_t *p_fs = &sbi->fs_info; -- struct dir_entry_t info; -- -- memcpy(&(EXFAT_I(inode)->fid), fid, sizeof(struct file_id_t)); -- -- ffsReadStat(inode, &info); -- -- EXFAT_I(inode)->i_pos = 0; -- EXFAT_I(inode)->target = NULL; -- inode->i_uid = sbi->options.fs_uid; -- inode->i_gid = sbi->options.fs_gid; -- INC_IVERSION(inode); -- inode->i_generation = prandom_u32(); -- -- if (info.Attr & ATTR_SUBDIR) { /* directory */ -- inode->i_generation &= ~1; -- inode->i_mode = exfat_make_mode(sbi, info.Attr, 0777); -- inode->i_op = &exfat_dir_inode_operations; -- inode->i_fop = &exfat_dir_operations; -- -- i_size_write(inode, info.Size); -- EXFAT_I(inode)->mmu_private = i_size_read(inode); -- set_nlink(inode, info.NumSubdirs); -- } else if (info.Attr & ATTR_SYMLINK) { /* symbolic link */ -- inode->i_generation |= 1; -- inode->i_mode = exfat_make_mode(sbi, info.Attr, 0777); -- inode->i_op = &exfat_symlink_inode_operations; -- -- i_size_write(inode, info.Size); -- EXFAT_I(inode)->mmu_private = i_size_read(inode); -- } else { /* regular file */ -- inode->i_generation |= 1; -- inode->i_mode = exfat_make_mode(sbi, info.Attr, 0777); -- inode->i_op = &exfat_file_inode_operations; -- inode->i_fop = &exfat_file_operations; -- inode->i_mapping->a_ops = &exfat_aops; -- inode->i_mapping->nrpages = 0; -- -- i_size_write(inode, info.Size); -- EXFAT_I(inode)->mmu_private = i_size_read(inode); -- } -- exfat_save_attr(inode, info.Attr); -- -- inode->i_blocks = ((i_size_read(inode) + (p_fs->cluster_size - 1)) -- & ~((loff_t)p_fs->cluster_size - 1)) >> 9; -- -- exfat_time_fat2unix(&inode->i_mtime, &info.ModifyTimestamp); -- exfat_time_fat2unix(&inode->i_ctime, &info.CreateTimestamp); -- exfat_time_fat2unix(&inode->i_atime, &info.AccessTimestamp); -- -- return 0; --} -- --static struct inode *exfat_build_inode(struct super_block *sb, -- struct file_id_t *fid, loff_t i_pos) --{ -- struct inode *inode; -- int err; -- -- inode = exfat_iget(sb, i_pos); -- if (inode) -- goto out; -- inode = new_inode(sb); -- if (!inode) { -- inode = ERR_PTR(-ENOMEM); -- goto out; -- } -- inode->i_ino = iunique(sb, EXFAT_ROOT_INO); -- SET_IVERSION(inode, 1); -- err = exfat_fill_inode(inode, fid); -- if (err) { -- iput(inode); -- inode = ERR_PTR(err); -- goto out; -- } -- exfat_attach(inode, i_pos); -- insert_inode_hash(inode); --out: -- return inode; --} -- --static int exfat_sync_inode(struct inode *inode) --{ -- return exfat_write_inode(inode, NULL); --} -- --static struct inode *exfat_alloc_inode(struct super_block *sb) --{ -- struct exfat_inode_info *ei; -- -- ei = kmem_cache_alloc(exfat_inode_cachep, GFP_NOFS); -- if (!ei) -- return NULL; -- -- init_rwsem(&ei->truncate_lock); -- -- return &ei->vfs_inode; --} -- --static void exfat_destroy_inode(struct inode *inode) --{ -- kfree(EXFAT_I(inode)->target); -- EXFAT_I(inode)->target = NULL; -- -- kmem_cache_free(exfat_inode_cachep, EXFAT_I(inode)); --} -- --static int exfat_write_inode(struct inode *inode, struct writeback_control *wbc) --{ -- struct dir_entry_t info; -- -- if (inode->i_ino == EXFAT_ROOT_INO) -- return 0; -- -- info.Attr = exfat_make_attr(inode); -- info.Size = i_size_read(inode); -- -- exfat_time_unix2fat(&inode->i_mtime, &info.ModifyTimestamp); -- exfat_time_unix2fat(&inode->i_ctime, &info.CreateTimestamp); -- exfat_time_unix2fat(&inode->i_atime, &info.AccessTimestamp); -- -- ffsWriteStat(inode, &info); -- -- return 0; --} -- --static void exfat_evict_inode(struct inode *inode) --{ -- truncate_inode_pages(&inode->i_data, 0); -- -- if (!inode->i_nlink) -- i_size_write(inode, 0); -- invalidate_inode_buffers(inode); -- clear_inode(inode); -- exfat_detach(inode); -- -- remove_inode_hash(inode); --} -- --static void exfat_free_super(struct exfat_sb_info *sbi) --{ -- if (sbi->nls_disk) -- unload_nls(sbi->nls_disk); -- if (sbi->nls_io) -- unload_nls(sbi->nls_io); -- if (sbi->options.iocharset != exfat_default_iocharset) -- kfree(sbi->options.iocharset); -- /* mutex_init is in exfat_fill_super function. only for 3.7+ */ -- mutex_destroy(&sbi->s_lock); -- kvfree(sbi); --} -- --static void exfat_put_super(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- -- if (__is_sb_dirty(sb)) -- exfat_write_super(sb); -- -- ffsUmountVol(sb); -- -- sb->s_fs_info = NULL; -- exfat_free_super(sbi); --} -- --static void exfat_write_super(struct super_block *sb) --{ -- __lock_super(sb); -- -- __set_sb_clean(sb); -- -- if (!sb_rdonly(sb)) -- ffsSyncVol(sb, true); -- -- __unlock_super(sb); --} -- --static int exfat_sync_fs(struct super_block *sb, int wait) --{ -- int err = 0; -- -- if (__is_sb_dirty(sb)) { -- __lock_super(sb); -- __set_sb_clean(sb); -- err = ffsSyncVol(sb, true); -- __unlock_super(sb); -- } -- -- return err; --} -- --static int exfat_statfs(struct dentry *dentry, struct kstatfs *buf) --{ -- struct super_block *sb = dentry->d_sb; -- u64 id = huge_encode_dev(sb->s_bdev->bd_dev); -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- struct vol_info_t info; -- -- if (p_fs->used_clusters == UINT_MAX) { -- if (ffsGetVolInfo(sb, &info) == -EIO) -- return -EIO; -- -- } else { -- info.FatType = p_fs->vol_type; -- info.ClusterSize = p_fs->cluster_size; -- info.NumClusters = p_fs->num_clusters - 2; -- info.UsedClusters = p_fs->used_clusters; -- info.FreeClusters = info.NumClusters - info.UsedClusters; -- -- if (p_fs->dev_ejected) -- pr_info("[EXFAT] statfs on device that is ejected\n"); -- } -- -- buf->f_type = sb->s_magic; -- buf->f_bsize = info.ClusterSize; -- buf->f_blocks = info.NumClusters; -- buf->f_bfree = info.FreeClusters; -- buf->f_bavail = info.FreeClusters; -- buf->f_fsid.val[0] = (u32)id; -- buf->f_fsid.val[1] = (u32)(id >> 32); -- buf->f_namelen = 260; -- -- return 0; --} -- --static int exfat_remount(struct super_block *sb, int *flags, char *data) --{ -- *flags |= SB_NODIRATIME; -- return 0; --} -- --static int exfat_show_options(struct seq_file *m, struct dentry *root) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(root->d_sb); -- struct exfat_mount_options *opts = &sbi->options; -- -- if (__kuid_val(opts->fs_uid)) -- seq_printf(m, ",uid=%u", __kuid_val(opts->fs_uid)); -- if (__kgid_val(opts->fs_gid)) -- seq_printf(m, ",gid=%u", __kgid_val(opts->fs_gid)); -- seq_printf(m, ",fmask=%04o", opts->fs_fmask); -- seq_printf(m, ",dmask=%04o", opts->fs_dmask); -- if (opts->allow_utime) -- seq_printf(m, ",allow_utime=%04o", opts->allow_utime); -- if (sbi->nls_disk) -- seq_printf(m, ",codepage=%s", sbi->nls_disk->charset); -- if (sbi->nls_io) -- seq_printf(m, ",iocharset=%s", sbi->nls_io->charset); -- seq_printf(m, ",namecase=%u", opts->casesensitive); -- if (opts->errors == EXFAT_ERRORS_CONT) -- seq_puts(m, ",errors=continue"); -- else if (opts->errors == EXFAT_ERRORS_PANIC) -- seq_puts(m, ",errors=panic"); -- else -- seq_puts(m, ",errors=remount-ro"); --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- if (opts->discard) -- seq_puts(m, ",discard"); --#endif -- return 0; --} -- --static const struct super_operations exfat_sops = { -- .alloc_inode = exfat_alloc_inode, -- .destroy_inode = exfat_destroy_inode, -- .write_inode = exfat_write_inode, -- .evict_inode = exfat_evict_inode, -- .put_super = exfat_put_super, -- .sync_fs = exfat_sync_fs, -- .statfs = exfat_statfs, -- .remount_fs = exfat_remount, -- .show_options = exfat_show_options, --}; -- --/*======================================================================*/ --/* Export Operations */ --/*======================================================================*/ -- --static struct inode *exfat_nfs_get_inode(struct super_block *sb, u64 ino, -- u32 generation) --{ -- struct inode *inode = NULL; -- -- if (ino < EXFAT_ROOT_INO) -- return inode; -- inode = ilookup(sb, ino); -- -- if (inode && generation && (inode->i_generation != generation)) { -- iput(inode); -- inode = NULL; -- } -- -- return inode; --} -- --static struct dentry *exfat_fh_to_dentry(struct super_block *sb, -- struct fid *fid, int fh_len, -- int fh_type) --{ -- return generic_fh_to_dentry(sb, fid, fh_len, fh_type, -- exfat_nfs_get_inode); --} -- --static struct dentry *exfat_fh_to_parent(struct super_block *sb, -- struct fid *fid, int fh_len, -- int fh_type) --{ -- return generic_fh_to_parent(sb, fid, fh_len, fh_type, -- exfat_nfs_get_inode); --} -- --static const struct export_operations exfat_export_ops = { -- .fh_to_dentry = exfat_fh_to_dentry, -- .fh_to_parent = exfat_fh_to_parent, --}; -- --/*======================================================================*/ --/* Super Block Read Operations */ --/*======================================================================*/ -- --enum { -- Opt_uid, -- Opt_gid, -- Opt_umask, -- Opt_dmask, -- Opt_fmask, -- Opt_allow_utime, -- Opt_codepage, -- Opt_charset, -- Opt_namecase, -- Opt_debug, -- Opt_err_cont, -- Opt_err_panic, -- Opt_err_ro, -- Opt_utf8_hack, -- Opt_err, --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- Opt_discard, --#endif /* EXFAT_CONFIG_DISCARD */ --}; -- --static const match_table_t exfat_tokens = { -- {Opt_uid, "uid=%u"}, -- {Opt_gid, "gid=%u"}, -- {Opt_umask, "umask=%o"}, -- {Opt_dmask, "dmask=%o"}, -- {Opt_fmask, "fmask=%o"}, -- {Opt_allow_utime, "allow_utime=%o"}, -- {Opt_codepage, "codepage=%u"}, -- {Opt_charset, "iocharset=%s"}, -- {Opt_namecase, "namecase=%u"}, -- {Opt_debug, "debug"}, -- {Opt_err_cont, "errors=continue"}, -- {Opt_err_panic, "errors=panic"}, -- {Opt_err_ro, "errors=remount-ro"}, -- {Opt_utf8_hack, "utf8"}, --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- {Opt_discard, "discard"}, --#endif /* CONFIG_STAGING_EXFAT_DISCARD */ -- {Opt_err, NULL} --}; -- --static int parse_options(char *options, int silent, int *debug, -- struct exfat_mount_options *opts) --{ -- char *p; -- substring_t args[MAX_OPT_ARGS]; -- int option; -- char *iocharset; -- -- opts->fs_uid = current_uid(); -- opts->fs_gid = current_gid(); -- opts->fs_fmask = current->fs->umask; -- opts->fs_dmask = current->fs->umask; -- opts->allow_utime = U16_MAX; -- opts->codepage = exfat_default_codepage; -- opts->iocharset = exfat_default_iocharset; -- opts->casesensitive = 0; -- opts->errors = EXFAT_ERRORS_RO; --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- opts->discard = 0; --#endif -- *debug = 0; -- -- if (!options) -- goto out; -- -- while ((p = strsep(&options, ","))) { -- int token; -- -- if (!*p) -- continue; -- -- token = match_token(p, exfat_tokens, args); -- switch (token) { -- case Opt_uid: -- if (match_int(&args[0], &option)) -- return 0; -- opts->fs_uid = KUIDT_INIT(option); -- break; -- case Opt_gid: -- if (match_int(&args[0], &option)) -- return 0; -- opts->fs_gid = KGIDT_INIT(option); -- break; -- case Opt_umask: -- case Opt_dmask: -- case Opt_fmask: -- if (match_octal(&args[0], &option)) -- return 0; -- if (token != Opt_dmask) -- opts->fs_fmask = option; -- if (token != Opt_fmask) -- opts->fs_dmask = option; -- break; -- case Opt_allow_utime: -- if (match_octal(&args[0], &option)) -- return 0; -- opts->allow_utime = option & 0022; -- break; -- case Opt_codepage: -- if (match_int(&args[0], &option)) -- return 0; -- opts->codepage = option; -- break; -- case Opt_charset: -- if (opts->iocharset != exfat_default_iocharset) -- kfree(opts->iocharset); -- iocharset = match_strdup(&args[0]); -- if (!iocharset) -- return -ENOMEM; -- opts->iocharset = iocharset; -- break; -- case Opt_namecase: -- if (match_int(&args[0], &option)) -- return 0; -- opts->casesensitive = option; -- break; -- case Opt_err_cont: -- opts->errors = EXFAT_ERRORS_CONT; -- break; -- case Opt_err_panic: -- opts->errors = EXFAT_ERRORS_PANIC; -- break; -- case Opt_err_ro: -- opts->errors = EXFAT_ERRORS_RO; -- break; -- case Opt_debug: -- *debug = 1; -- break; --#ifdef CONFIG_STAGING_EXFAT_DISCARD -- case Opt_discard: -- opts->discard = 1; -- break; --#endif /* CONFIG_STAGING_EXFAT_DISCARD */ -- case Opt_utf8_hack: -- break; -- default: -- if (!silent) -- pr_err("[EXFAT] Unrecognized mount option %s or missing value\n", -- p); -- return -EINVAL; -- } -- } -- --out: -- if (opts->allow_utime == U16_MAX) -- opts->allow_utime = ~opts->fs_dmask & 0022; -- -- return 0; --} -- --static void exfat_hash_init(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- int i; -- -- spin_lock_init(&sbi->inode_hash_lock); -- for (i = 0; i < EXFAT_HASH_SIZE; i++) -- INIT_HLIST_HEAD(&sbi->inode_hashtable[i]); --} -- --static int exfat_read_root(struct inode *inode) --{ -- struct super_block *sb = inode->i_sb; -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct fs_info_t *p_fs = &sbi->fs_info; -- struct timespec64 curtime; -- struct dir_entry_t info; -- -- EXFAT_I(inode)->fid.dir.dir = p_fs->root_dir; -- EXFAT_I(inode)->fid.dir.flags = 0x01; -- EXFAT_I(inode)->fid.entry = -1; -- EXFAT_I(inode)->fid.start_clu = p_fs->root_dir; -- EXFAT_I(inode)->fid.flags = 0x01; -- EXFAT_I(inode)->fid.type = TYPE_DIR; -- EXFAT_I(inode)->fid.rwoffset = 0; -- EXFAT_I(inode)->fid.hint_last_off = -1; -- -- EXFAT_I(inode)->target = NULL; -- -- ffsReadStat(inode, &info); -- -- inode->i_uid = sbi->options.fs_uid; -- inode->i_gid = sbi->options.fs_gid; -- INC_IVERSION(inode); -- inode->i_generation = 0; -- inode->i_mode = exfat_make_mode(sbi, ATTR_SUBDIR, 0777); -- inode->i_op = &exfat_dir_inode_operations; -- inode->i_fop = &exfat_dir_operations; -- -- i_size_write(inode, info.Size); -- inode->i_blocks = ((i_size_read(inode) + (p_fs->cluster_size - 1)) -- & ~((loff_t)p_fs->cluster_size - 1)) >> 9; -- EXFAT_I(inode)->i_pos = ((loff_t)p_fs->root_dir << 32) | 0xffffffff; -- EXFAT_I(inode)->mmu_private = i_size_read(inode); -- -- exfat_save_attr(inode, ATTR_SUBDIR); -- curtime = current_time(inode); -- inode->i_mtime = curtime; -- inode->i_atime = curtime; -- inode->i_ctime = curtime; -- set_nlink(inode, info.NumSubdirs + 2); -- -- return 0; --} -- --static void setup_dops(struct super_block *sb) --{ -- if (EXFAT_SB(sb)->options.casesensitive == 0) -- sb->s_d_op = &exfat_ci_dentry_ops; -- else -- sb->s_d_op = &exfat_dentry_ops; --} -- --static int exfat_fill_super(struct super_block *sb, void *data, int silent) --{ -- struct inode *root_inode = NULL; -- struct exfat_sb_info *sbi; -- int debug, ret; -- long error; -- -- /* -- * GFP_KERNEL is ok here, because while we do hold the -- * supeblock lock, memory pressure can't call back into -- * the filesystem, since we're only just about to mount -- * it and have no inodes etc active! -- */ -- sbi = kvzalloc(sizeof(*sbi), GFP_KERNEL); -- if (!sbi) -- return -ENOMEM; -- mutex_init(&sbi->s_lock); -- sb->s_fs_info = sbi; -- sb->s_flags |= SB_NODIRATIME; -- sb->s_magic = EXFAT_SUPER_MAGIC; -- sb->s_op = &exfat_sops; -- sb->s_export_op = &exfat_export_ops; -- -- error = parse_options(data, silent, &debug, &sbi->options); -- if (error) -- goto out_fail; -- -- setup_dops(sb); -- -- error = -EIO; -- sb_min_blocksize(sb, 512); -- sb->s_maxbytes = 0x7fffffffffffffffLL; /* maximum file size */ -- -- ret = ffsMountVol(sb); -- if (ret) { -- if (!silent) -- pr_err("[EXFAT] ffsMountVol failed\n"); -- -- goto out_fail; -- } -- -- /* set up enough so that it can read an inode */ -- exfat_hash_init(sb); -- -- /* -- * The low byte of FAT's first entry must have same value with -- * media-field. But in real world, too many devices is -- * writing wrong value. So, removed that validity check. -- * -- * if (FAT_FIRST_ENT(sb, media) != first) -- */ -- -- sbi->nls_io = load_nls(sbi->options.iocharset); -- -- error = -ENOMEM; -- root_inode = new_inode(sb); -- if (!root_inode) -- goto out_fail2; -- root_inode->i_ino = EXFAT_ROOT_INO; -- SET_IVERSION(root_inode, 1); -- -- error = exfat_read_root(root_inode); -- if (error < 0) -- goto out_fail2; -- error = -ENOMEM; -- exfat_attach(root_inode, EXFAT_I(root_inode)->i_pos); -- insert_inode_hash(root_inode); -- sb->s_root = d_make_root(root_inode); -- if (!sb->s_root) { -- pr_err("[EXFAT] Getting the root inode failed\n"); -- goto out_fail2; -- } -- -- return 0; -- --out_fail2: -- ffsUmountVol(sb); --out_fail: -- if (root_inode) -- iput(root_inode); -- sb->s_fs_info = NULL; -- exfat_free_super(sbi); -- return error; --} -- --static struct dentry *exfat_fs_mount(struct file_system_type *fs_type, -- int flags, const char *dev_name, -- void *data) --{ -- return mount_bdev(fs_type, flags, dev_name, data, exfat_fill_super); --} -- --static void init_once(void *foo) --{ -- struct exfat_inode_info *ei = (struct exfat_inode_info *)foo; -- -- INIT_HLIST_NODE(&ei->i_hash_fat); -- inode_init_once(&ei->vfs_inode); --} -- --static int __init exfat_init_inodecache(void) --{ -- exfat_inode_cachep = kmem_cache_create("exfat_inode_cache", -- sizeof(struct exfat_inode_info), -- 0, -- (SLAB_RECLAIM_ACCOUNT | -- SLAB_MEM_SPREAD), -- init_once); -- if (!exfat_inode_cachep) -- return -ENOMEM; -- return 0; --} -- --static void __exit exfat_destroy_inodecache(void) --{ -- /* -- * Make sure all delayed rcu free inodes are flushed before we -- * destroy cache. -- */ -- rcu_barrier(); -- kmem_cache_destroy(exfat_inode_cachep); --} -- --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG --static void exfat_debug_kill_sb(struct super_block *sb) --{ -- struct exfat_sb_info *sbi = EXFAT_SB(sb); -- struct block_device *bdev = sb->s_bdev; -- struct fs_info_t *p_fs = &(EXFAT_SB(sb)->fs_info); -- -- long flags; -- -- if (sbi) { -- flags = sbi->debug_flags; -- -- if (flags & EXFAT_DEBUGFLAGS_INVALID_UMOUNT) { -- /* -- * invalidate_bdev drops all device cache include -- * dirty. We use this to simulate device removal. -- */ -- mutex_lock(&p_fs->v_mutex); -- exfat_fat_release_all(sb); -- exfat_buf_release_all(sb); -- mutex_unlock(&p_fs->v_mutex); -- -- invalidate_bdev(bdev); -- } -- } -- -- kill_block_super(sb); --} --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- --static struct file_system_type exfat_fs_type = { -- .owner = THIS_MODULE, -- .name = "exfat", -- .mount = exfat_fs_mount, --#ifdef CONFIG_STAGING_EXFAT_KERNEL_DEBUG -- .kill_sb = exfat_debug_kill_sb, --#else -- .kill_sb = kill_block_super, --#endif /* CONFIG_STAGING_EXFAT_KERNEL_DEBUG */ -- .fs_flags = FS_REQUIRES_DEV, --}; -- --static int __init init_exfat(void) --{ -- int err; -- -- BUILD_BUG_ON(sizeof(struct dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct dos_dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct ext_dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct file_dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct strm_dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct name_dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct bmap_dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct case_dentry_t) != DENTRY_SIZE); -- BUILD_BUG_ON(sizeof(struct volm_dentry_t) != DENTRY_SIZE); -- -- pr_info("exFAT: Version %s\n", EXFAT_VERSION); -- -- err = exfat_init_inodecache(); -- if (err) -- return err; -- -- err = register_filesystem(&exfat_fs_type); -- if (err) -- return err; -- -- return 0; --} -- --static void __exit exit_exfat(void) --{ -- exfat_destroy_inodecache(); -- unregister_filesystem(&exfat_fs_type); --} -- --module_init(init_exfat); --module_exit(exit_exfat); -- --MODULE_LICENSE("GPL"); --MODULE_DESCRIPTION("exFAT Filesystem Driver"); --MODULE_ALIAS_FS("exfat"); -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/exfat_upcase.c linux-5.6.3/drivers/staging/exfat/exfat_upcase.c ---- linux-5.6.3.orig/drivers/staging/exfat/exfat_upcase.c 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/exfat_upcase.c 1970-01-01 02:00:00.000000000 +0200 -@@ -1,740 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-or-later --/* -- * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd. -- */ -- --#include --#include "exfat.h" -- --const u8 uni_upcase[NUM_UPCASE << 1] = { -- 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, -- 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, -- 0x08, 0x00, 0x09, 0x00, 0x0A, 0x00, 0x0B, 0x00, -- 0x0C, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0F, 0x00, -- 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, -- 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, -- 0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00, -- 0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, -- 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, -- 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, -- 0x28, 0x00, 0x29, 0x00, 0x2A, 0x00, 0x2B, 0x00, -- 0x2C, 0x00, 0x2D, 0x00, 0x2E, 0x00, 0x2F, 0x00, -- 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, -- 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, -- 0x38, 0x00, 0x39, 0x00, 0x3A, 0x00, 0x3B, 0x00, -- 0x3C, 0x00, 0x3D, 0x00, 0x3E, 0x00, 0x3F, 0x00, -- 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, -- 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, -- 0x48, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, -- 0x4C, 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, -- 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, -- 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, -- 0x58, 0x00, 0x59, 0x00, 0x5A, 0x00, 0x5B, 0x00, -- 0x5C, 0x00, 0x5D, 0x00, 0x5E, 0x00, 0x5F, 0x00, -- 0x60, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, -- 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, -- 0x48, 0x00, 0x49, 0x00, 0x4A, 0x00, 0x4B, 0x00, -- 0x4C, 0x00, 0x4D, 0x00, 0x4E, 0x00, 0x4F, 0x00, -- 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, -- 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, -- 0x58, 0x00, 0x59, 0x00, 0x5A, 0x00, 0x7B, 0x00, -- 0x7C, 0x00, 0x7D, 0x00, 0x7E, 0x00, 0x7F, 0x00, -- 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, -- 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, -- 0x88, 0x00, 0x89, 0x00, 0x8A, 0x00, 0x8B, 0x00, -- 0x8C, 0x00, 0x8D, 0x00, 0x8E, 0x00, 0x8F, 0x00, -- 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, -- 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, -- 0x98, 0x00, 0x99, 0x00, 0x9A, 0x00, 0x9B, 0x00, -- 0x9C, 0x00, 0x9D, 0x00, 0x9E, 0x00, 0x9F, 0x00, -- 0xA0, 0x00, 0xA1, 0x00, 0xA2, 0x00, 0xA3, 0x00, -- 0xA4, 0x00, 0xA5, 0x00, 0xA6, 0x00, 0xA7, 0x00, -- 0xA8, 0x00, 0xA9, 0x00, 0xAA, 0x00, 0xAB, 0x00, -- 0xAC, 0x00, 0xAD, 0x00, 0xAE, 0x00, 0xAF, 0x00, -- 0xB0, 0x00, 0xB1, 0x00, 0xB2, 0x00, 0xB3, 0x00, -- 0xB4, 0x00, 0xB5, 0x00, 0xB6, 0x00, 0xB7, 0x00, -- 0xB8, 0x00, 0xB9, 0x00, 0xBA, 0x00, 0xBB, 0x00, -- 0xBC, 0x00, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0x00, -- 0xC0, 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, -- 0xC4, 0x00, 0xC5, 0x00, 0xC6, 0x00, 0xC7, 0x00, -- 0xC8, 0x00, 0xC9, 0x00, 0xCA, 0x00, 0xCB, 0x00, -- 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, -- 0xD0, 0x00, 0xD1, 0x00, 0xD2, 0x00, 0xD3, 0x00, -- 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xD7, 0x00, -- 0xD8, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, 0x00, -- 0xDC, 0x00, 0xDD, 0x00, 0xDE, 0x00, 0xDF, 0x00, -- 0xC0, 0x00, 0xC1, 0x00, 0xC2, 0x00, 0xC3, 0x00, -- 0xC4, 0x00, 0xC5, 0x00, 0xC6, 0x00, 0xC7, 0x00, -- 0xC8, 0x00, 0xC9, 0x00, 0xCA, 0x00, 0xCB, 0x00, -- 0xCC, 0x00, 0xCD, 0x00, 0xCE, 0x00, 0xCF, 0x00, -- 0xD0, 0x00, 0xD1, 0x00, 0xD2, 0x00, 0xD3, 0x00, -- 0xD4, 0x00, 0xD5, 0x00, 0xD6, 0x00, 0xF7, 0x00, -- 0xD8, 0x00, 0xD9, 0x00, 0xDA, 0x00, 0xDB, 0x00, -- 0xDC, 0x00, 0xDD, 0x00, 0xDE, 0x00, 0x78, 0x01, -- 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, -- 0x04, 0x01, 0x04, 0x01, 0x06, 0x01, 0x06, 0x01, -- 0x08, 0x01, 0x08, 0x01, 0x0A, 0x01, 0x0A, 0x01, -- 0x0C, 0x01, 0x0C, 0x01, 0x0E, 0x01, 0x0E, 0x01, -- 0x10, 0x01, 0x10, 0x01, 0x12, 0x01, 0x12, 0x01, -- 0x14, 0x01, 0x14, 0x01, 0x16, 0x01, 0x16, 0x01, -- 0x18, 0x01, 0x18, 0x01, 0x1A, 0x01, 0x1A, 0x01, -- 0x1C, 0x01, 0x1C, 0x01, 0x1E, 0x01, 0x1E, 0x01, -- 0x20, 0x01, 0x20, 0x01, 0x22, 0x01, 0x22, 0x01, -- 0x24, 0x01, 0x24, 0x01, 0x26, 0x01, 0x26, 0x01, -- 0x28, 0x01, 0x28, 0x01, 0x2A, 0x01, 0x2A, 0x01, -- 0x2C, 0x01, 0x2C, 0x01, 0x2E, 0x01, 0x2E, 0x01, -- 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x32, 0x01, -- 0x34, 0x01, 0x34, 0x01, 0x36, 0x01, 0x36, 0x01, -- 0x38, 0x01, 0x39, 0x01, 0x39, 0x01, 0x3B, 0x01, -- 0x3B, 0x01, 0x3D, 0x01, 0x3D, 0x01, 0x3F, 0x01, -- 0x3F, 0x01, 0x41, 0x01, 0x41, 0x01, 0x43, 0x01, -- 0x43, 0x01, 0x45, 0x01, 0x45, 0x01, 0x47, 0x01, -- 0x47, 0x01, 0x49, 0x01, 0x4A, 0x01, 0x4A, 0x01, -- 0x4C, 0x01, 0x4C, 0x01, 0x4E, 0x01, 0x4E, 0x01, -- 0x50, 0x01, 0x50, 0x01, 0x52, 0x01, 0x52, 0x01, -- 0x54, 0x01, 0x54, 0x01, 0x56, 0x01, 0x56, 0x01, -- 0x58, 0x01, 0x58, 0x01, 0x5A, 0x01, 0x5A, 0x01, -- 0x5C, 0x01, 0x5C, 0x01, 0x5E, 0x01, 0x5E, 0x01, -- 0x60, 0x01, 0x60, 0x01, 0x62, 0x01, 0x62, 0x01, -- 0x64, 0x01, 0x64, 0x01, 0x66, 0x01, 0x66, 0x01, -- 0x68, 0x01, 0x68, 0x01, 0x6A, 0x01, 0x6A, 0x01, -- 0x6C, 0x01, 0x6C, 0x01, 0x6E, 0x01, 0x6E, 0x01, -- 0x70, 0x01, 0x70, 0x01, 0x72, 0x01, 0x72, 0x01, -- 0x74, 0x01, 0x74, 0x01, 0x76, 0x01, 0x76, 0x01, -- 0x78, 0x01, 0x79, 0x01, 0x79, 0x01, 0x7B, 0x01, -- 0x7B, 0x01, 0x7D, 0x01, 0x7D, 0x01, 0x7F, 0x01, -- 0x43, 0x02, 0x81, 0x01, 0x82, 0x01, 0x82, 0x01, -- 0x84, 0x01, 0x84, 0x01, 0x86, 0x01, 0x87, 0x01, -- 0x87, 0x01, 0x89, 0x01, 0x8A, 0x01, 0x8B, 0x01, -- 0x8B, 0x01, 0x8D, 0x01, 0x8E, 0x01, 0x8F, 0x01, -- 0x90, 0x01, 0x91, 0x01, 0x91, 0x01, 0x93, 0x01, -- 0x94, 0x01, 0xF6, 0x01, 0x96, 0x01, 0x97, 0x01, -- 0x98, 0x01, 0x98, 0x01, 0x3D, 0x02, 0x9B, 0x01, -- 0x9C, 0x01, 0x9D, 0x01, 0x20, 0x02, 0x9F, 0x01, -- 0xA0, 0x01, 0xA0, 0x01, 0xA2, 0x01, 0xA2, 0x01, -- 0xA4, 0x01, 0xA4, 0x01, 0xA6, 0x01, 0xA7, 0x01, -- 0xA7, 0x01, 0xA9, 0x01, 0xAA, 0x01, 0xAB, 0x01, -- 0xAC, 0x01, 0xAC, 0x01, 0xAE, 0x01, 0xAF, 0x01, -- 0xAF, 0x01, 0xB1, 0x01, 0xB2, 0x01, 0xB3, 0x01, -- 0xB3, 0x01, 0xB5, 0x01, 0xB5, 0x01, 0xB7, 0x01, -- 0xB8, 0x01, 0xB8, 0x01, 0xBA, 0x01, 0xBB, 0x01, -- 0xBC, 0x01, 0xBC, 0x01, 0xBE, 0x01, 0xF7, 0x01, -- 0xC0, 0x01, 0xC1, 0x01, 0xC2, 0x01, 0xC3, 0x01, -- 0xC4, 0x01, 0xC5, 0x01, 0xC4, 0x01, 0xC7, 0x01, -- 0xC8, 0x01, 0xC7, 0x01, 0xCA, 0x01, 0xCB, 0x01, -- 0xCA, 0x01, 0xCD, 0x01, 0xCD, 0x01, 0xCF, 0x01, -- 0xCF, 0x01, 0xD1, 0x01, 0xD1, 0x01, 0xD3, 0x01, -- 0xD3, 0x01, 0xD5, 0x01, 0xD5, 0x01, 0xD7, 0x01, -- 0xD7, 0x01, 0xD9, 0x01, 0xD9, 0x01, 0xDB, 0x01, -- 0xDB, 0x01, 0x8E, 0x01, 0xDE, 0x01, 0xDE, 0x01, -- 0xE0, 0x01, 0xE0, 0x01, 0xE2, 0x01, 0xE2, 0x01, -- 0xE4, 0x01, 0xE4, 0x01, 0xE6, 0x01, 0xE6, 0x01, -- 0xE8, 0x01, 0xE8, 0x01, 0xEA, 0x01, 0xEA, 0x01, -- 0xEC, 0x01, 0xEC, 0x01, 0xEE, 0x01, 0xEE, 0x01, -- 0xF0, 0x01, 0xF1, 0x01, 0xF2, 0x01, 0xF1, 0x01, -- 0xF4, 0x01, 0xF4, 0x01, 0xF6, 0x01, 0xF7, 0x01, -- 0xF8, 0x01, 0xF8, 0x01, 0xFA, 0x01, 0xFA, 0x01, -- 0xFC, 0x01, 0xFC, 0x01, 0xFE, 0x01, 0xFE, 0x01, -- 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, -- 0x04, 0x02, 0x04, 0x02, 0x06, 0x02, 0x06, 0x02, -- 0x08, 0x02, 0x08, 0x02, 0x0A, 0x02, 0x0A, 0x02, -- 0x0C, 0x02, 0x0C, 0x02, 0x0E, 0x02, 0x0E, 0x02, -- 0x10, 0x02, 0x10, 0x02, 0x12, 0x02, 0x12, 0x02, -- 0x14, 0x02, 0x14, 0x02, 0x16, 0x02, 0x16, 0x02, -- 0x18, 0x02, 0x18, 0x02, 0x1A, 0x02, 0x1A, 0x02, -- 0x1C, 0x02, 0x1C, 0x02, 0x1E, 0x02, 0x1E, 0x02, -- 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x22, 0x02, -- 0x24, 0x02, 0x24, 0x02, 0x26, 0x02, 0x26, 0x02, -- 0x28, 0x02, 0x28, 0x02, 0x2A, 0x02, 0x2A, 0x02, -- 0x2C, 0x02, 0x2C, 0x02, 0x2E, 0x02, 0x2E, 0x02, -- 0x30, 0x02, 0x30, 0x02, 0x32, 0x02, 0x32, 0x02, -- 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, -- 0x38, 0x02, 0x39, 0x02, 0x65, 0x2C, 0x3B, 0x02, -- 0x3B, 0x02, 0x3D, 0x02, 0x66, 0x2C, 0x3F, 0x02, -- 0x40, 0x02, 0x41, 0x02, 0x41, 0x02, 0x43, 0x02, -- 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x46, 0x02, -- 0x48, 0x02, 0x48, 0x02, 0x4A, 0x02, 0x4A, 0x02, -- 0x4C, 0x02, 0x4C, 0x02, 0x4E, 0x02, 0x4E, 0x02, -- 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x81, 0x01, -- 0x86, 0x01, 0x55, 0x02, 0x89, 0x01, 0x8A, 0x01, -- 0x58, 0x02, 0x8F, 0x01, 0x5A, 0x02, 0x90, 0x01, -- 0x5C, 0x02, 0x5D, 0x02, 0x5E, 0x02, 0x5F, 0x02, -- 0x93, 0x01, 0x61, 0x02, 0x62, 0x02, 0x94, 0x01, -- 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, -- 0x97, 0x01, 0x96, 0x01, 0x6A, 0x02, 0x62, 0x2C, -- 0x6C, 0x02, 0x6D, 0x02, 0x6E, 0x02, 0x9C, 0x01, -- 0x70, 0x02, 0x71, 0x02, 0x9D, 0x01, 0x73, 0x02, -- 0x74, 0x02, 0x9F, 0x01, 0x76, 0x02, 0x77, 0x02, -- 0x78, 0x02, 0x79, 0x02, 0x7A, 0x02, 0x7B, 0x02, -- 0x7C, 0x02, 0x64, 0x2C, 0x7E, 0x02, 0x7F, 0x02, -- 0xA6, 0x01, 0x81, 0x02, 0x82, 0x02, 0xA9, 0x01, -- 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, -- 0xAE, 0x01, 0x44, 0x02, 0xB1, 0x01, 0xB2, 0x01, -- 0x45, 0x02, 0x8D, 0x02, 0x8E, 0x02, 0x8F, 0x02, -- 0x90, 0x02, 0x91, 0x02, 0xB7, 0x01, 0x93, 0x02, -- 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, -- 0x98, 0x02, 0x99, 0x02, 0x9A, 0x02, 0x9B, 0x02, -- 0x9C, 0x02, 0x9D, 0x02, 0x9E, 0x02, 0x9F, 0x02, -- 0xA0, 0x02, 0xA1, 0x02, 0xA2, 0x02, 0xA3, 0x02, -- 0xA4, 0x02, 0xA5, 0x02, 0xA6, 0x02, 0xA7, 0x02, -- 0xA8, 0x02, 0xA9, 0x02, 0xAA, 0x02, 0xAB, 0x02, -- 0xAC, 0x02, 0xAD, 0x02, 0xAE, 0x02, 0xAF, 0x02, -- 0xB0, 0x02, 0xB1, 0x02, 0xB2, 0x02, 0xB3, 0x02, -- 0xB4, 0x02, 0xB5, 0x02, 0xB6, 0x02, 0xB7, 0x02, -- 0xB8, 0x02, 0xB9, 0x02, 0xBA, 0x02, 0xBB, 0x02, -- 0xBC, 0x02, 0xBD, 0x02, 0xBE, 0x02, 0xBF, 0x02, -- 0xC0, 0x02, 0xC1, 0x02, 0xC2, 0x02, 0xC3, 0x02, -- 0xC4, 0x02, 0xC5, 0x02, 0xC6, 0x02, 0xC7, 0x02, -- 0xC8, 0x02, 0xC9, 0x02, 0xCA, 0x02, 0xCB, 0x02, -- 0xCC, 0x02, 0xCD, 0x02, 0xCE, 0x02, 0xCF, 0x02, -- 0xD0, 0x02, 0xD1, 0x02, 0xD2, 0x02, 0xD3, 0x02, -- 0xD4, 0x02, 0xD5, 0x02, 0xD6, 0x02, 0xD7, 0x02, -- 0xD8, 0x02, 0xD9, 0x02, 0xDA, 0x02, 0xDB, 0x02, -- 0xDC, 0x02, 0xDD, 0x02, 0xDE, 0x02, 0xDF, 0x02, -- 0xE0, 0x02, 0xE1, 0x02, 0xE2, 0x02, 0xE3, 0x02, -- 0xE4, 0x02, 0xE5, 0x02, 0xE6, 0x02, 0xE7, 0x02, -- 0xE8, 0x02, 0xE9, 0x02, 0xEA, 0x02, 0xEB, 0x02, -- 0xEC, 0x02, 0xED, 0x02, 0xEE, 0x02, 0xEF, 0x02, -- 0xF0, 0x02, 0xF1, 0x02, 0xF2, 0x02, 0xF3, 0x02, -- 0xF4, 0x02, 0xF5, 0x02, 0xF6, 0x02, 0xF7, 0x02, -- 0xF8, 0x02, 0xF9, 0x02, 0xFA, 0x02, 0xFB, 0x02, -- 0xFC, 0x02, 0xFD, 0x02, 0xFE, 0x02, 0xFF, 0x02, -- 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, -- 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, -- 0x08, 0x03, 0x09, 0x03, 0x0A, 0x03, 0x0B, 0x03, -- 0x0C, 0x03, 0x0D, 0x03, 0x0E, 0x03, 0x0F, 0x03, -- 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, -- 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, -- 0x18, 0x03, 0x19, 0x03, 0x1A, 0x03, 0x1B, 0x03, -- 0x1C, 0x03, 0x1D, 0x03, 0x1E, 0x03, 0x1F, 0x03, -- 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, -- 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, -- 0x28, 0x03, 0x29, 0x03, 0x2A, 0x03, 0x2B, 0x03, -- 0x2C, 0x03, 0x2D, 0x03, 0x2E, 0x03, 0x2F, 0x03, -- 0x30, 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, -- 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, -- 0x38, 0x03, 0x39, 0x03, 0x3A, 0x03, 0x3B, 0x03, -- 0x3C, 0x03, 0x3D, 0x03, 0x3E, 0x03, 0x3F, 0x03, -- 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, -- 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, -- 0x48, 0x03, 0x49, 0x03, 0x4A, 0x03, 0x4B, 0x03, -- 0x4C, 0x03, 0x4D, 0x03, 0x4E, 0x03, 0x4F, 0x03, -- 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, -- 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, -- 0x58, 0x03, 0x59, 0x03, 0x5A, 0x03, 0x5B, 0x03, -- 0x5C, 0x03, 0x5D, 0x03, 0x5E, 0x03, 0x5F, 0x03, -- 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, -- 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, -- 0x68, 0x03, 0x69, 0x03, 0x6A, 0x03, 0x6B, 0x03, -- 0x6C, 0x03, 0x6D, 0x03, 0x6E, 0x03, 0x6F, 0x03, -- 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, -- 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, -- 0x78, 0x03, 0x79, 0x03, 0x7A, 0x03, 0xFD, 0x03, -- 0xFE, 0x03, 0xFF, 0x03, 0x7E, 0x03, 0x7F, 0x03, -- 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, -- 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, -- 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, 0x8B, 0x03, -- 0x8C, 0x03, 0x8D, 0x03, 0x8E, 0x03, 0x8F, 0x03, -- 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, -- 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, -- 0x98, 0x03, 0x99, 0x03, 0x9A, 0x03, 0x9B, 0x03, -- 0x9C, 0x03, 0x9D, 0x03, 0x9E, 0x03, 0x9F, 0x03, -- 0xA0, 0x03, 0xA1, 0x03, 0xA2, 0x03, 0xA3, 0x03, -- 0xA4, 0x03, 0xA5, 0x03, 0xA6, 0x03, 0xA7, 0x03, -- 0xA8, 0x03, 0xA9, 0x03, 0xAA, 0x03, 0xAB, 0x03, -- 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8A, 0x03, -- 0xB0, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, -- 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, -- 0x98, 0x03, 0x99, 0x03, 0x9A, 0x03, 0x9B, 0x03, -- 0x9C, 0x03, 0x9D, 0x03, 0x9E, 0x03, 0x9F, 0x03, -- 0xA0, 0x03, 0xA1, 0x03, 0xA3, 0x03, 0xA3, 0x03, -- 0xA4, 0x03, 0xA5, 0x03, 0xA6, 0x03, 0xA7, 0x03, -- 0xA8, 0x03, 0xA9, 0x03, 0xAA, 0x03, 0xAB, 0x03, -- 0x8C, 0x03, 0x8E, 0x03, 0x8F, 0x03, 0xCF, 0x03, -- 0xD0, 0x03, 0xD1, 0x03, 0xD2, 0x03, 0xD3, 0x03, -- 0xD4, 0x03, 0xD5, 0x03, 0xD6, 0x03, 0xD7, 0x03, -- 0xD8, 0x03, 0xD8, 0x03, 0xDA, 0x03, 0xDA, 0x03, -- 0xDC, 0x03, 0xDC, 0x03, 0xDE, 0x03, 0xDE, 0x03, -- 0xE0, 0x03, 0xE0, 0x03, 0xE2, 0x03, 0xE2, 0x03, -- 0xE4, 0x03, 0xE4, 0x03, 0xE6, 0x03, 0xE6, 0x03, -- 0xE8, 0x03, 0xE8, 0x03, 0xEA, 0x03, 0xEA, 0x03, -- 0xEC, 0x03, 0xEC, 0x03, 0xEE, 0x03, 0xEE, 0x03, -- 0xF0, 0x03, 0xF1, 0x03, 0xF9, 0x03, 0xF3, 0x03, -- 0xF4, 0x03, 0xF5, 0x03, 0xF6, 0x03, 0xF7, 0x03, -- 0xF7, 0x03, 0xF9, 0x03, 0xFA, 0x03, 0xFA, 0x03, -- 0xFC, 0x03, 0xFD, 0x03, 0xFE, 0x03, 0xFF, 0x03, -- 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, -- 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, -- 0x08, 0x04, 0x09, 0x04, 0x0A, 0x04, 0x0B, 0x04, -- 0x0C, 0x04, 0x0D, 0x04, 0x0E, 0x04, 0x0F, 0x04, -- 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, -- 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, -- 0x18, 0x04, 0x19, 0x04, 0x1A, 0x04, 0x1B, 0x04, -- 0x1C, 0x04, 0x1D, 0x04, 0x1E, 0x04, 0x1F, 0x04, -- 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, -- 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, -- 0x28, 0x04, 0x29, 0x04, 0x2A, 0x04, 0x2B, 0x04, -- 0x2C, 0x04, 0x2D, 0x04, 0x2E, 0x04, 0x2F, 0x04, -- 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, -- 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, -- 0x18, 0x04, 0x19, 0x04, 0x1A, 0x04, 0x1B, 0x04, -- 0x1C, 0x04, 0x1D, 0x04, 0x1E, 0x04, 0x1F, 0x04, -- 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, -- 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, -- 0x28, 0x04, 0x29, 0x04, 0x2A, 0x04, 0x2B, 0x04, -- 0x2C, 0x04, 0x2D, 0x04, 0x2E, 0x04, 0x2F, 0x04, -- 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, -- 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, -- 0x08, 0x04, 0x09, 0x04, 0x0A, 0x04, 0x0B, 0x04, -- 0x0C, 0x04, 0x0D, 0x04, 0x0E, 0x04, 0x0F, 0x04, -- 0x60, 0x04, 0x60, 0x04, 0x62, 0x04, 0x62, 0x04, -- 0x64, 0x04, 0x64, 0x04, 0x66, 0x04, 0x66, 0x04, -- 0x68, 0x04, 0x68, 0x04, 0x6A, 0x04, 0x6A, 0x04, -- 0x6C, 0x04, 0x6C, 0x04, 0x6E, 0x04, 0x6E, 0x04, -- 0x70, 0x04, 0x70, 0x04, 0x72, 0x04, 0x72, 0x04, -- 0x74, 0x04, 0x74, 0x04, 0x76, 0x04, 0x76, 0x04, -- 0x78, 0x04, 0x78, 0x04, 0x7A, 0x04, 0x7A, 0x04, -- 0x7C, 0x04, 0x7C, 0x04, 0x7E, 0x04, 0x7E, 0x04, -- 0x80, 0x04, 0x80, 0x04, 0x82, 0x04, 0x83, 0x04, -- 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, 0x04, -- 0x88, 0x04, 0x89, 0x04, 0x8A, 0x04, 0x8A, 0x04, -- 0x8C, 0x04, 0x8C, 0x04, 0x8E, 0x04, 0x8E, 0x04, -- 0x90, 0x04, 0x90, 0x04, 0x92, 0x04, 0x92, 0x04, -- 0x94, 0x04, 0x94, 0x04, 0x96, 0x04, 0x96, 0x04, -- 0x98, 0x04, 0x98, 0x04, 0x9A, 0x04, 0x9A, 0x04, -- 0x9C, 0x04, 0x9C, 0x04, 0x9E, 0x04, 0x9E, 0x04, -- 0xA0, 0x04, 0xA0, 0x04, 0xA2, 0x04, 0xA2, 0x04, -- 0xA4, 0x04, 0xA4, 0x04, 0xA6, 0x04, 0xA6, 0x04, -- 0xA8, 0x04, 0xA8, 0x04, 0xAA, 0x04, 0xAA, 0x04, -- 0xAC, 0x04, 0xAC, 0x04, 0xAE, 0x04, 0xAE, 0x04, -- 0xB0, 0x04, 0xB0, 0x04, 0xB2, 0x04, 0xB2, 0x04, -- 0xB4, 0x04, 0xB4, 0x04, 0xB6, 0x04, 0xB6, 0x04, -- 0xB8, 0x04, 0xB8, 0x04, 0xBA, 0x04, 0xBA, 0x04, -- 0xBC, 0x04, 0xBC, 0x04, 0xBE, 0x04, 0xBE, 0x04, -- 0xC0, 0x04, 0xC1, 0x04, 0xC1, 0x04, 0xC3, 0x04, -- 0xC3, 0x04, 0xC5, 0x04, 0xC5, 0x04, 0xC7, 0x04, -- 0xC7, 0x04, 0xC9, 0x04, 0xC9, 0x04, 0xCB, 0x04, -- 0xCB, 0x04, 0xCD, 0x04, 0xCD, 0x04, 0xC0, 0x04, -- 0xD0, 0x04, 0xD0, 0x04, 0xD2, 0x04, 0xD2, 0x04, -- 0xD4, 0x04, 0xD4, 0x04, 0xD6, 0x04, 0xD6, 0x04, -- 0xD8, 0x04, 0xD8, 0x04, 0xDA, 0x04, 0xDA, 0x04, -- 0xDC, 0x04, 0xDC, 0x04, 0xDE, 0x04, 0xDE, 0x04, -- 0xE0, 0x04, 0xE0, 0x04, 0xE2, 0x04, 0xE2, 0x04, -- 0xE4, 0x04, 0xE4, 0x04, 0xE6, 0x04, 0xE6, 0x04, -- 0xE8, 0x04, 0xE8, 0x04, 0xEA, 0x04, 0xEA, 0x04, -- 0xEC, 0x04, 0xEC, 0x04, 0xEE, 0x04, 0xEE, 0x04, -- 0xF0, 0x04, 0xF0, 0x04, 0xF2, 0x04, 0xF2, 0x04, -- 0xF4, 0x04, 0xF4, 0x04, 0xF6, 0x04, 0xF6, 0x04, -- 0xF8, 0x04, 0xF8, 0x04, 0xFA, 0x04, 0xFA, 0x04, -- 0xFC, 0x04, 0xFC, 0x04, 0xFE, 0x04, 0xFE, 0x04, -- 0x00, 0x05, 0x00, 0x05, 0x02, 0x05, 0x02, 0x05, -- 0x04, 0x05, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, -- 0x08, 0x05, 0x08, 0x05, 0x0A, 0x05, 0x0A, 0x05, -- 0x0C, 0x05, 0x0C, 0x05, 0x0E, 0x05, 0x0E, 0x05, -- 0x10, 0x05, 0x10, 0x05, 0x12, 0x05, 0x12, 0x05, -- 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, 0x05, -- 0x18, 0x05, 0x19, 0x05, 0x1A, 0x05, 0x1B, 0x05, -- 0x1C, 0x05, 0x1D, 0x05, 0x1E, 0x05, 0x1F, 0x05, -- 0x20, 0x05, 0x21, 0x05, 0x22, 0x05, 0x23, 0x05, -- 0x24, 0x05, 0x25, 0x05, 0x26, 0x05, 0x27, 0x05, -- 0x28, 0x05, 0x29, 0x05, 0x2A, 0x05, 0x2B, 0x05, -- 0x2C, 0x05, 0x2D, 0x05, 0x2E, 0x05, 0x2F, 0x05, -- 0x30, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, -- 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, -- 0x38, 0x05, 0x39, 0x05, 0x3A, 0x05, 0x3B, 0x05, -- 0x3C, 0x05, 0x3D, 0x05, 0x3E, 0x05, 0x3F, 0x05, -- 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, -- 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, -- 0x48, 0x05, 0x49, 0x05, 0x4A, 0x05, 0x4B, 0x05, -- 0x4C, 0x05, 0x4D, 0x05, 0x4E, 0x05, 0x4F, 0x05, -- 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, -- 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0x57, 0x05, -- 0x58, 0x05, 0x59, 0x05, 0x5A, 0x05, 0x5B, 0x05, -- 0x5C, 0x05, 0x5D, 0x05, 0x5E, 0x05, 0x5F, 0x05, -- 0x60, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, -- 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, -- 0x38, 0x05, 0x39, 0x05, 0x3A, 0x05, 0x3B, 0x05, -- 0x3C, 0x05, 0x3D, 0x05, 0x3E, 0x05, 0x3F, 0x05, -- 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, -- 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, -- 0x48, 0x05, 0x49, 0x05, 0x4A, 0x05, 0x4B, 0x05, -- 0x4C, 0x05, 0x4D, 0x05, 0x4E, 0x05, 0x4F, 0x05, -- 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, -- 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0xFF, 0xFF, -- 0xF6, 0x17, 0x63, 0x2C, 0x7E, 0x1D, 0x7F, 0x1D, -- 0x80, 0x1D, 0x81, 0x1D, 0x82, 0x1D, 0x83, 0x1D, -- 0x84, 0x1D, 0x85, 0x1D, 0x86, 0x1D, 0x87, 0x1D, -- 0x88, 0x1D, 0x89, 0x1D, 0x8A, 0x1D, 0x8B, 0x1D, -- 0x8C, 0x1D, 0x8D, 0x1D, 0x8E, 0x1D, 0x8F, 0x1D, -- 0x90, 0x1D, 0x91, 0x1D, 0x92, 0x1D, 0x93, 0x1D, -- 0x94, 0x1D, 0x95, 0x1D, 0x96, 0x1D, 0x97, 0x1D, -- 0x98, 0x1D, 0x99, 0x1D, 0x9A, 0x1D, 0x9B, 0x1D, -- 0x9C, 0x1D, 0x9D, 0x1D, 0x9E, 0x1D, 0x9F, 0x1D, -- 0xA0, 0x1D, 0xA1, 0x1D, 0xA2, 0x1D, 0xA3, 0x1D, -- 0xA4, 0x1D, 0xA5, 0x1D, 0xA6, 0x1D, 0xA7, 0x1D, -- 0xA8, 0x1D, 0xA9, 0x1D, 0xAA, 0x1D, 0xAB, 0x1D, -- 0xAC, 0x1D, 0xAD, 0x1D, 0xAE, 0x1D, 0xAF, 0x1D, -- 0xB0, 0x1D, 0xB1, 0x1D, 0xB2, 0x1D, 0xB3, 0x1D, -- 0xB4, 0x1D, 0xB5, 0x1D, 0xB6, 0x1D, 0xB7, 0x1D, -- 0xB8, 0x1D, 0xB9, 0x1D, 0xBA, 0x1D, 0xBB, 0x1D, -- 0xBC, 0x1D, 0xBD, 0x1D, 0xBE, 0x1D, 0xBF, 0x1D, -- 0xC0, 0x1D, 0xC1, 0x1D, 0xC2, 0x1D, 0xC3, 0x1D, -- 0xC4, 0x1D, 0xC5, 0x1D, 0xC6, 0x1D, 0xC7, 0x1D, -- 0xC8, 0x1D, 0xC9, 0x1D, 0xCA, 0x1D, 0xCB, 0x1D, -- 0xCC, 0x1D, 0xCD, 0x1D, 0xCE, 0x1D, 0xCF, 0x1D, -- 0xD0, 0x1D, 0xD1, 0x1D, 0xD2, 0x1D, 0xD3, 0x1D, -- 0xD4, 0x1D, 0xD5, 0x1D, 0xD6, 0x1D, 0xD7, 0x1D, -- 0xD8, 0x1D, 0xD9, 0x1D, 0xDA, 0x1D, 0xDB, 0x1D, -- 0xDC, 0x1D, 0xDD, 0x1D, 0xDE, 0x1D, 0xDF, 0x1D, -- 0xE0, 0x1D, 0xE1, 0x1D, 0xE2, 0x1D, 0xE3, 0x1D, -- 0xE4, 0x1D, 0xE5, 0x1D, 0xE6, 0x1D, 0xE7, 0x1D, -- 0xE8, 0x1D, 0xE9, 0x1D, 0xEA, 0x1D, 0xEB, 0x1D, -- 0xEC, 0x1D, 0xED, 0x1D, 0xEE, 0x1D, 0xEF, 0x1D, -- 0xF0, 0x1D, 0xF1, 0x1D, 0xF2, 0x1D, 0xF3, 0x1D, -- 0xF4, 0x1D, 0xF5, 0x1D, 0xF6, 0x1D, 0xF7, 0x1D, -- 0xF8, 0x1D, 0xF9, 0x1D, 0xFA, 0x1D, 0xFB, 0x1D, -- 0xFC, 0x1D, 0xFD, 0x1D, 0xFE, 0x1D, 0xFF, 0x1D, -- 0x00, 0x1E, 0x00, 0x1E, 0x02, 0x1E, 0x02, 0x1E, -- 0x04, 0x1E, 0x04, 0x1E, 0x06, 0x1E, 0x06, 0x1E, -- 0x08, 0x1E, 0x08, 0x1E, 0x0A, 0x1E, 0x0A, 0x1E, -- 0x0C, 0x1E, 0x0C, 0x1E, 0x0E, 0x1E, 0x0E, 0x1E, -- 0x10, 0x1E, 0x10, 0x1E, 0x12, 0x1E, 0x12, 0x1E, -- 0x14, 0x1E, 0x14, 0x1E, 0x16, 0x1E, 0x16, 0x1E, -- 0x18, 0x1E, 0x18, 0x1E, 0x1A, 0x1E, 0x1A, 0x1E, -- 0x1C, 0x1E, 0x1C, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, -- 0x20, 0x1E, 0x20, 0x1E, 0x22, 0x1E, 0x22, 0x1E, -- 0x24, 0x1E, 0x24, 0x1E, 0x26, 0x1E, 0x26, 0x1E, -- 0x28, 0x1E, 0x28, 0x1E, 0x2A, 0x1E, 0x2A, 0x1E, -- 0x2C, 0x1E, 0x2C, 0x1E, 0x2E, 0x1E, 0x2E, 0x1E, -- 0x30, 0x1E, 0x30, 0x1E, 0x32, 0x1E, 0x32, 0x1E, -- 0x34, 0x1E, 0x34, 0x1E, 0x36, 0x1E, 0x36, 0x1E, -- 0x38, 0x1E, 0x38, 0x1E, 0x3A, 0x1E, 0x3A, 0x1E, -- 0x3C, 0x1E, 0x3C, 0x1E, 0x3E, 0x1E, 0x3E, 0x1E, -- 0x40, 0x1E, 0x40, 0x1E, 0x42, 0x1E, 0x42, 0x1E, -- 0x44, 0x1E, 0x44, 0x1E, 0x46, 0x1E, 0x46, 0x1E, -- 0x48, 0x1E, 0x48, 0x1E, 0x4A, 0x1E, 0x4A, 0x1E, -- 0x4C, 0x1E, 0x4C, 0x1E, 0x4E, 0x1E, 0x4E, 0x1E, -- 0x50, 0x1E, 0x50, 0x1E, 0x52, 0x1E, 0x52, 0x1E, -- 0x54, 0x1E, 0x54, 0x1E, 0x56, 0x1E, 0x56, 0x1E, -- 0x58, 0x1E, 0x58, 0x1E, 0x5A, 0x1E, 0x5A, 0x1E, -- 0x5C, 0x1E, 0x5C, 0x1E, 0x5E, 0x1E, 0x5E, 0x1E, -- 0x60, 0x1E, 0x60, 0x1E, 0x62, 0x1E, 0x62, 0x1E, -- 0x64, 0x1E, 0x64, 0x1E, 0x66, 0x1E, 0x66, 0x1E, -- 0x68, 0x1E, 0x68, 0x1E, 0x6A, 0x1E, 0x6A, 0x1E, -- 0x6C, 0x1E, 0x6C, 0x1E, 0x6E, 0x1E, 0x6E, 0x1E, -- 0x70, 0x1E, 0x70, 0x1E, 0x72, 0x1E, 0x72, 0x1E, -- 0x74, 0x1E, 0x74, 0x1E, 0x76, 0x1E, 0x76, 0x1E, -- 0x78, 0x1E, 0x78, 0x1E, 0x7A, 0x1E, 0x7A, 0x1E, -- 0x7C, 0x1E, 0x7C, 0x1E, 0x7E, 0x1E, 0x7E, 0x1E, -- 0x80, 0x1E, 0x80, 0x1E, 0x82, 0x1E, 0x82, 0x1E, -- 0x84, 0x1E, 0x84, 0x1E, 0x86, 0x1E, 0x86, 0x1E, -- 0x88, 0x1E, 0x88, 0x1E, 0x8A, 0x1E, 0x8A, 0x1E, -- 0x8C, 0x1E, 0x8C, 0x1E, 0x8E, 0x1E, 0x8E, 0x1E, -- 0x90, 0x1E, 0x90, 0x1E, 0x92, 0x1E, 0x92, 0x1E, -- 0x94, 0x1E, 0x94, 0x1E, 0x96, 0x1E, 0x97, 0x1E, -- 0x98, 0x1E, 0x99, 0x1E, 0x9A, 0x1E, 0x9B, 0x1E, -- 0x9C, 0x1E, 0x9D, 0x1E, 0x9E, 0x1E, 0x9F, 0x1E, -- 0xA0, 0x1E, 0xA0, 0x1E, 0xA2, 0x1E, 0xA2, 0x1E, -- 0xA4, 0x1E, 0xA4, 0x1E, 0xA6, 0x1E, 0xA6, 0x1E, -- 0xA8, 0x1E, 0xA8, 0x1E, 0xAA, 0x1E, 0xAA, 0x1E, -- 0xAC, 0x1E, 0xAC, 0x1E, 0xAE, 0x1E, 0xAE, 0x1E, -- 0xB0, 0x1E, 0xB0, 0x1E, 0xB2, 0x1E, 0xB2, 0x1E, -- 0xB4, 0x1E, 0xB4, 0x1E, 0xB6, 0x1E, 0xB6, 0x1E, -- 0xB8, 0x1E, 0xB8, 0x1E, 0xBA, 0x1E, 0xBA, 0x1E, -- 0xBC, 0x1E, 0xBC, 0x1E, 0xBE, 0x1E, 0xBE, 0x1E, -- 0xC0, 0x1E, 0xC0, 0x1E, 0xC2, 0x1E, 0xC2, 0x1E, -- 0xC4, 0x1E, 0xC4, 0x1E, 0xC6, 0x1E, 0xC6, 0x1E, -- 0xC8, 0x1E, 0xC8, 0x1E, 0xCA, 0x1E, 0xCA, 0x1E, -- 0xCC, 0x1E, 0xCC, 0x1E, 0xCE, 0x1E, 0xCE, 0x1E, -- 0xD0, 0x1E, 0xD0, 0x1E, 0xD2, 0x1E, 0xD2, 0x1E, -- 0xD4, 0x1E, 0xD4, 0x1E, 0xD6, 0x1E, 0xD6, 0x1E, -- 0xD8, 0x1E, 0xD8, 0x1E, 0xDA, 0x1E, 0xDA, 0x1E, -- 0xDC, 0x1E, 0xDC, 0x1E, 0xDE, 0x1E, 0xDE, 0x1E, -- 0xE0, 0x1E, 0xE0, 0x1E, 0xE2, 0x1E, 0xE2, 0x1E, -- 0xE4, 0x1E, 0xE4, 0x1E, 0xE6, 0x1E, 0xE6, 0x1E, -- 0xE8, 0x1E, 0xE8, 0x1E, 0xEA, 0x1E, 0xEA, 0x1E, -- 0xEC, 0x1E, 0xEC, 0x1E, 0xEE, 0x1E, 0xEE, 0x1E, -- 0xF0, 0x1E, 0xF0, 0x1E, 0xF2, 0x1E, 0xF2, 0x1E, -- 0xF4, 0x1E, 0xF4, 0x1E, 0xF6, 0x1E, 0xF6, 0x1E, -- 0xF8, 0x1E, 0xF8, 0x1E, 0xFA, 0x1E, 0xFB, 0x1E, -- 0xFC, 0x1E, 0xFD, 0x1E, 0xFE, 0x1E, 0xFF, 0x1E, -- 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, -- 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, -- 0x08, 0x1F, 0x09, 0x1F, 0x0A, 0x1F, 0x0B, 0x1F, -- 0x0C, 0x1F, 0x0D, 0x1F, 0x0E, 0x1F, 0x0F, 0x1F, -- 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, -- 0x1C, 0x1F, 0x1D, 0x1F, 0x16, 0x1F, 0x17, 0x1F, -- 0x18, 0x1F, 0x19, 0x1F, 0x1A, 0x1F, 0x1B, 0x1F, -- 0x1C, 0x1F, 0x1D, 0x1F, 0x1E, 0x1F, 0x1F, 0x1F, -- 0x28, 0x1F, 0x29, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, -- 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, -- 0x28, 0x1F, 0x29, 0x1F, 0x2A, 0x1F, 0x2B, 0x1F, -- 0x2C, 0x1F, 0x2D, 0x1F, 0x2E, 0x1F, 0x2F, 0x1F, -- 0x38, 0x1F, 0x39, 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, -- 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, -- 0x38, 0x1F, 0x39, 0x1F, 0x3A, 0x1F, 0x3B, 0x1F, -- 0x3C, 0x1F, 0x3D, 0x1F, 0x3E, 0x1F, 0x3F, 0x1F, -- 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, -- 0x4C, 0x1F, 0x4D, 0x1F, 0x46, 0x1F, 0x47, 0x1F, -- 0x48, 0x1F, 0x49, 0x1F, 0x4A, 0x1F, 0x4B, 0x1F, -- 0x4C, 0x1F, 0x4D, 0x1F, 0x4E, 0x1F, 0x4F, 0x1F, -- 0x50, 0x1F, 0x59, 0x1F, 0x52, 0x1F, 0x5B, 0x1F, -- 0x54, 0x1F, 0x5D, 0x1F, 0x56, 0x1F, 0x5F, 0x1F, -- 0x58, 0x1F, 0x59, 0x1F, 0x5A, 0x1F, 0x5B, 0x1F, -- 0x5C, 0x1F, 0x5D, 0x1F, 0x5E, 0x1F, 0x5F, 0x1F, -- 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, -- 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, -- 0x68, 0x1F, 0x69, 0x1F, 0x6A, 0x1F, 0x6B, 0x1F, -- 0x6C, 0x1F, 0x6D, 0x1F, 0x6E, 0x1F, 0x6F, 0x1F, -- 0xBA, 0x1F, 0xBB, 0x1F, 0xC8, 0x1F, 0xC9, 0x1F, -- 0xCA, 0x1F, 0xCB, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, -- 0xF8, 0x1F, 0xF9, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, -- 0xFA, 0x1F, 0xFB, 0x1F, 0x7E, 0x1F, 0x7F, 0x1F, -- 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, -- 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, -- 0x88, 0x1F, 0x89, 0x1F, 0x8A, 0x1F, 0x8B, 0x1F, -- 0x8C, 0x1F, 0x8D, 0x1F, 0x8E, 0x1F, 0x8F, 0x1F, -- 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, -- 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, -- 0x98, 0x1F, 0x99, 0x1F, 0x9A, 0x1F, 0x9B, 0x1F, -- 0x9C, 0x1F, 0x9D, 0x1F, 0x9E, 0x1F, 0x9F, 0x1F, -- 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, -- 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, -- 0xA8, 0x1F, 0xA9, 0x1F, 0xAA, 0x1F, 0xAB, 0x1F, -- 0xAC, 0x1F, 0xAD, 0x1F, 0xAE, 0x1F, 0xAF, 0x1F, -- 0xB8, 0x1F, 0xB9, 0x1F, 0xB2, 0x1F, 0xBC, 0x1F, -- 0xB4, 0x1F, 0xB5, 0x1F, 0xB6, 0x1F, 0xB7, 0x1F, -- 0xB8, 0x1F, 0xB9, 0x1F, 0xBA, 0x1F, 0xBB, 0x1F, -- 0xBC, 0x1F, 0xBD, 0x1F, 0xBE, 0x1F, 0xBF, 0x1F, -- 0xC0, 0x1F, 0xC1, 0x1F, 0xC2, 0x1F, 0xC3, 0x1F, -- 0xC4, 0x1F, 0xC5, 0x1F, 0xC6, 0x1F, 0xC7, 0x1F, -- 0xC8, 0x1F, 0xC9, 0x1F, 0xCA, 0x1F, 0xCB, 0x1F, -- 0xC3, 0x1F, 0xCD, 0x1F, 0xCE, 0x1F, 0xCF, 0x1F, -- 0xD8, 0x1F, 0xD9, 0x1F, 0xD2, 0x1F, 0xD3, 0x1F, -- 0xD4, 0x1F, 0xD5, 0x1F, 0xD6, 0x1F, 0xD7, 0x1F, -- 0xD8, 0x1F, 0xD9, 0x1F, 0xDA, 0x1F, 0xDB, 0x1F, -- 0xDC, 0x1F, 0xDD, 0x1F, 0xDE, 0x1F, 0xDF, 0x1F, -- 0xE8, 0x1F, 0xE9, 0x1F, 0xE2, 0x1F, 0xE3, 0x1F, -- 0xE4, 0x1F, 0xEC, 0x1F, 0xE6, 0x1F, 0xE7, 0x1F, -- 0xE8, 0x1F, 0xE9, 0x1F, 0xEA, 0x1F, 0xEB, 0x1F, -- 0xEC, 0x1F, 0xED, 0x1F, 0xEE, 0x1F, 0xEF, 0x1F, -- 0xF0, 0x1F, 0xF1, 0x1F, 0xF2, 0x1F, 0xF3, 0x1F, -- 0xF4, 0x1F, 0xF5, 0x1F, 0xF6, 0x1F, 0xF7, 0x1F, -- 0xF8, 0x1F, 0xF9, 0x1F, 0xFA, 0x1F, 0xFB, 0x1F, -- 0xF3, 0x1F, 0xFD, 0x1F, 0xFE, 0x1F, 0xFF, 0x1F, -- 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x20, -- 0x04, 0x20, 0x05, 0x20, 0x06, 0x20, 0x07, 0x20, -- 0x08, 0x20, 0x09, 0x20, 0x0A, 0x20, 0x0B, 0x20, -- 0x0C, 0x20, 0x0D, 0x20, 0x0E, 0x20, 0x0F, 0x20, -- 0x10, 0x20, 0x11, 0x20, 0x12, 0x20, 0x13, 0x20, -- 0x14, 0x20, 0x15, 0x20, 0x16, 0x20, 0x17, 0x20, -- 0x18, 0x20, 0x19, 0x20, 0x1A, 0x20, 0x1B, 0x20, -- 0x1C, 0x20, 0x1D, 0x20, 0x1E, 0x20, 0x1F, 0x20, -- 0x20, 0x20, 0x21, 0x20, 0x22, 0x20, 0x23, 0x20, -- 0x24, 0x20, 0x25, 0x20, 0x26, 0x20, 0x27, 0x20, -- 0x28, 0x20, 0x29, 0x20, 0x2A, 0x20, 0x2B, 0x20, -- 0x2C, 0x20, 0x2D, 0x20, 0x2E, 0x20, 0x2F, 0x20, -- 0x30, 0x20, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, -- 0x34, 0x20, 0x35, 0x20, 0x36, 0x20, 0x37, 0x20, -- 0x38, 0x20, 0x39, 0x20, 0x3A, 0x20, 0x3B, 0x20, -- 0x3C, 0x20, 0x3D, 0x20, 0x3E, 0x20, 0x3F, 0x20, -- 0x40, 0x20, 0x41, 0x20, 0x42, 0x20, 0x43, 0x20, -- 0x44, 0x20, 0x45, 0x20, 0x46, 0x20, 0x47, 0x20, -- 0x48, 0x20, 0x49, 0x20, 0x4A, 0x20, 0x4B, 0x20, -- 0x4C, 0x20, 0x4D, 0x20, 0x4E, 0x20, 0x4F, 0x20, -- 0x50, 0x20, 0x51, 0x20, 0x52, 0x20, 0x53, 0x20, -- 0x54, 0x20, 0x55, 0x20, 0x56, 0x20, 0x57, 0x20, -- 0x58, 0x20, 0x59, 0x20, 0x5A, 0x20, 0x5B, 0x20, -- 0x5C, 0x20, 0x5D, 0x20, 0x5E, 0x20, 0x5F, 0x20, -- 0x60, 0x20, 0x61, 0x20, 0x62, 0x20, 0x63, 0x20, -- 0x64, 0x20, 0x65, 0x20, 0x66, 0x20, 0x67, 0x20, -- 0x68, 0x20, 0x69, 0x20, 0x6A, 0x20, 0x6B, 0x20, -- 0x6C, 0x20, 0x6D, 0x20, 0x6E, 0x20, 0x6F, 0x20, -- 0x70, 0x20, 0x71, 0x20, 0x72, 0x20, 0x73, 0x20, -- 0x74, 0x20, 0x75, 0x20, 0x76, 0x20, 0x77, 0x20, -- 0x78, 0x20, 0x79, 0x20, 0x7A, 0x20, 0x7B, 0x20, -- 0x7C, 0x20, 0x7D, 0x20, 0x7E, 0x20, 0x7F, 0x20, -- 0x80, 0x20, 0x81, 0x20, 0x82, 0x20, 0x83, 0x20, -- 0x84, 0x20, 0x85, 0x20, 0x86, 0x20, 0x87, 0x20, -- 0x88, 0x20, 0x89, 0x20, 0x8A, 0x20, 0x8B, 0x20, -- 0x8C, 0x20, 0x8D, 0x20, 0x8E, 0x20, 0x8F, 0x20, -- 0x90, 0x20, 0x91, 0x20, 0x92, 0x20, 0x93, 0x20, -- 0x94, 0x20, 0x95, 0x20, 0x96, 0x20, 0x97, 0x20, -- 0x98, 0x20, 0x99, 0x20, 0x9A, 0x20, 0x9B, 0x20, -- 0x9C, 0x20, 0x9D, 0x20, 0x9E, 0x20, 0x9F, 0x20, -- 0xA0, 0x20, 0xA1, 0x20, 0xA2, 0x20, 0xA3, 0x20, -- 0xA4, 0x20, 0xA5, 0x20, 0xA6, 0x20, 0xA7, 0x20, -- 0xA8, 0x20, 0xA9, 0x20, 0xAA, 0x20, 0xAB, 0x20, -- 0xAC, 0x20, 0xAD, 0x20, 0xAE, 0x20, 0xAF, 0x20, -- 0xB0, 0x20, 0xB1, 0x20, 0xB2, 0x20, 0xB3, 0x20, -- 0xB4, 0x20, 0xB5, 0x20, 0xB6, 0x20, 0xB7, 0x20, -- 0xB8, 0x20, 0xB9, 0x20, 0xBA, 0x20, 0xBB, 0x20, -- 0xBC, 0x20, 0xBD, 0x20, 0xBE, 0x20, 0xBF, 0x20, -- 0xC0, 0x20, 0xC1, 0x20, 0xC2, 0x20, 0xC3, 0x20, -- 0xC4, 0x20, 0xC5, 0x20, 0xC6, 0x20, 0xC7, 0x20, -- 0xC8, 0x20, 0xC9, 0x20, 0xCA, 0x20, 0xCB, 0x20, -- 0xCC, 0x20, 0xCD, 0x20, 0xCE, 0x20, 0xCF, 0x20, -- 0xD0, 0x20, 0xD1, 0x20, 0xD2, 0x20, 0xD3, 0x20, -- 0xD4, 0x20, 0xD5, 0x20, 0xD6, 0x20, 0xD7, 0x20, -- 0xD8, 0x20, 0xD9, 0x20, 0xDA, 0x20, 0xDB, 0x20, -- 0xDC, 0x20, 0xDD, 0x20, 0xDE, 0x20, 0xDF, 0x20, -- 0xE0, 0x20, 0xE1, 0x20, 0xE2, 0x20, 0xE3, 0x20, -- 0xE4, 0x20, 0xE5, 0x20, 0xE6, 0x20, 0xE7, 0x20, -- 0xE8, 0x20, 0xE9, 0x20, 0xEA, 0x20, 0xEB, 0x20, -- 0xEC, 0x20, 0xED, 0x20, 0xEE, 0x20, 0xEF, 0x20, -- 0xF0, 0x20, 0xF1, 0x20, 0xF2, 0x20, 0xF3, 0x20, -- 0xF4, 0x20, 0xF5, 0x20, 0xF6, 0x20, 0xF7, 0x20, -- 0xF8, 0x20, 0xF9, 0x20, 0xFA, 0x20, 0xFB, 0x20, -- 0xFC, 0x20, 0xFD, 0x20, 0xFE, 0x20, 0xFF, 0x20, -- 0x00, 0x21, 0x01, 0x21, 0x02, 0x21, 0x03, 0x21, -- 0x04, 0x21, 0x05, 0x21, 0x06, 0x21, 0x07, 0x21, -- 0x08, 0x21, 0x09, 0x21, 0x0A, 0x21, 0x0B, 0x21, -- 0x0C, 0x21, 0x0D, 0x21, 0x0E, 0x21, 0x0F, 0x21, -- 0x10, 0x21, 0x11, 0x21, 0x12, 0x21, 0x13, 0x21, -- 0x14, 0x21, 0x15, 0x21, 0x16, 0x21, 0x17, 0x21, -- 0x18, 0x21, 0x19, 0x21, 0x1A, 0x21, 0x1B, 0x21, -- 0x1C, 0x21, 0x1D, 0x21, 0x1E, 0x21, 0x1F, 0x21, -- 0x20, 0x21, 0x21, 0x21, 0x22, 0x21, 0x23, 0x21, -- 0x24, 0x21, 0x25, 0x21, 0x26, 0x21, 0x27, 0x21, -- 0x28, 0x21, 0x29, 0x21, 0x2A, 0x21, 0x2B, 0x21, -- 0x2C, 0x21, 0x2D, 0x21, 0x2E, 0x21, 0x2F, 0x21, -- 0x30, 0x21, 0x31, 0x21, 0x32, 0x21, 0x33, 0x21, -- 0x34, 0x21, 0x35, 0x21, 0x36, 0x21, 0x37, 0x21, -- 0x38, 0x21, 0x39, 0x21, 0x3A, 0x21, 0x3B, 0x21, -- 0x3C, 0x21, 0x3D, 0x21, 0x3E, 0x21, 0x3F, 0x21, -- 0x40, 0x21, 0x41, 0x21, 0x42, 0x21, 0x43, 0x21, -- 0x44, 0x21, 0x45, 0x21, 0x46, 0x21, 0x47, 0x21, -- 0x48, 0x21, 0x49, 0x21, 0x4A, 0x21, 0x4B, 0x21, -- 0x4C, 0x21, 0x4D, 0x21, 0x32, 0x21, 0x4F, 0x21, -- 0x50, 0x21, 0x51, 0x21, 0x52, 0x21, 0x53, 0x21, -- 0x54, 0x21, 0x55, 0x21, 0x56, 0x21, 0x57, 0x21, -- 0x58, 0x21, 0x59, 0x21, 0x5A, 0x21, 0x5B, 0x21, -- 0x5C, 0x21, 0x5D, 0x21, 0x5E, 0x21, 0x5F, 0x21, -- 0x60, 0x21, 0x61, 0x21, 0x62, 0x21, 0x63, 0x21, -- 0x64, 0x21, 0x65, 0x21, 0x66, 0x21, 0x67, 0x21, -- 0x68, 0x21, 0x69, 0x21, 0x6A, 0x21, 0x6B, 0x21, -- 0x6C, 0x21, 0x6D, 0x21, 0x6E, 0x21, 0x6F, 0x21, -- 0x60, 0x21, 0x61, 0x21, 0x62, 0x21, 0x63, 0x21, -- 0x64, 0x21, 0x65, 0x21, 0x66, 0x21, 0x67, 0x21, -- 0x68, 0x21, 0x69, 0x21, 0x6A, 0x21, 0x6B, 0x21, -- 0x6C, 0x21, 0x6D, 0x21, 0x6E, 0x21, 0x6F, 0x21, -- 0x80, 0x21, 0x81, 0x21, 0x82, 0x21, 0x83, 0x21, -- 0x83, 0x21, 0xFF, 0xFF, 0x4B, 0x03, 0xB6, 0x24, -- 0xB7, 0x24, 0xB8, 0x24, 0xB9, 0x24, 0xBA, 0x24, -- 0xBB, 0x24, 0xBC, 0x24, 0xBD, 0x24, 0xBE, 0x24, -- 0xBF, 0x24, 0xC0, 0x24, 0xC1, 0x24, 0xC2, 0x24, -- 0xC3, 0x24, 0xC4, 0x24, 0xC5, 0x24, 0xC6, 0x24, -- 0xC7, 0x24, 0xC8, 0x24, 0xC9, 0x24, 0xCA, 0x24, -- 0xCB, 0x24, 0xCC, 0x24, 0xCD, 0x24, 0xCE, 0x24, -- 0xCF, 0x24, 0xFF, 0xFF, 0x46, 0x07, 0x00, 0x2C, -- 0x01, 0x2C, 0x02, 0x2C, 0x03, 0x2C, 0x04, 0x2C, -- 0x05, 0x2C, 0x06, 0x2C, 0x07, 0x2C, 0x08, 0x2C, -- 0x09, 0x2C, 0x0A, 0x2C, 0x0B, 0x2C, 0x0C, 0x2C, -- 0x0D, 0x2C, 0x0E, 0x2C, 0x0F, 0x2C, 0x10, 0x2C, -- 0x11, 0x2C, 0x12, 0x2C, 0x13, 0x2C, 0x14, 0x2C, -- 0x15, 0x2C, 0x16, 0x2C, 0x17, 0x2C, 0x18, 0x2C, -- 0x19, 0x2C, 0x1A, 0x2C, 0x1B, 0x2C, 0x1C, 0x2C, -- 0x1D, 0x2C, 0x1E, 0x2C, 0x1F, 0x2C, 0x20, 0x2C, -- 0x21, 0x2C, 0x22, 0x2C, 0x23, 0x2C, 0x24, 0x2C, -- 0x25, 0x2C, 0x26, 0x2C, 0x27, 0x2C, 0x28, 0x2C, -- 0x29, 0x2C, 0x2A, 0x2C, 0x2B, 0x2C, 0x2C, 0x2C, -- 0x2D, 0x2C, 0x2E, 0x2C, 0x5F, 0x2C, 0x60, 0x2C, -- 0x60, 0x2C, 0x62, 0x2C, 0x63, 0x2C, 0x64, 0x2C, -- 0x65, 0x2C, 0x66, 0x2C, 0x67, 0x2C, 0x67, 0x2C, -- 0x69, 0x2C, 0x69, 0x2C, 0x6B, 0x2C, 0x6B, 0x2C, -- 0x6D, 0x2C, 0x6E, 0x2C, 0x6F, 0x2C, 0x70, 0x2C, -- 0x71, 0x2C, 0x72, 0x2C, 0x73, 0x2C, 0x74, 0x2C, -- 0x75, 0x2C, 0x75, 0x2C, 0x77, 0x2C, 0x78, 0x2C, -- 0x79, 0x2C, 0x7A, 0x2C, 0x7B, 0x2C, 0x7C, 0x2C, -- 0x7D, 0x2C, 0x7E, 0x2C, 0x7F, 0x2C, 0x80, 0x2C, -- 0x80, 0x2C, 0x82, 0x2C, 0x82, 0x2C, 0x84, 0x2C, -- 0x84, 0x2C, 0x86, 0x2C, 0x86, 0x2C, 0x88, 0x2C, -- 0x88, 0x2C, 0x8A, 0x2C, 0x8A, 0x2C, 0x8C, 0x2C, -- 0x8C, 0x2C, 0x8E, 0x2C, 0x8E, 0x2C, 0x90, 0x2C, -- 0x90, 0x2C, 0x92, 0x2C, 0x92, 0x2C, 0x94, 0x2C, -- 0x94, 0x2C, 0x96, 0x2C, 0x96, 0x2C, 0x98, 0x2C, -- 0x98, 0x2C, 0x9A, 0x2C, 0x9A, 0x2C, 0x9C, 0x2C, -- 0x9C, 0x2C, 0x9E, 0x2C, 0x9E, 0x2C, 0xA0, 0x2C, -- 0xA0, 0x2C, 0xA2, 0x2C, 0xA2, 0x2C, 0xA4, 0x2C, -- 0xA4, 0x2C, 0xA6, 0x2C, 0xA6, 0x2C, 0xA8, 0x2C, -- 0xA8, 0x2C, 0xAA, 0x2C, 0xAA, 0x2C, 0xAC, 0x2C, -- 0xAC, 0x2C, 0xAE, 0x2C, 0xAE, 0x2C, 0xB0, 0x2C, -- 0xB0, 0x2C, 0xB2, 0x2C, 0xB2, 0x2C, 0xB4, 0x2C, -- 0xB4, 0x2C, 0xB6, 0x2C, 0xB6, 0x2C, 0xB8, 0x2C, -- 0xB8, 0x2C, 0xBA, 0x2C, 0xBA, 0x2C, 0xBC, 0x2C, -- 0xBC, 0x2C, 0xBE, 0x2C, 0xBE, 0x2C, 0xC0, 0x2C, -- 0xC0, 0x2C, 0xC2, 0x2C, 0xC2, 0x2C, 0xC4, 0x2C, -- 0xC4, 0x2C, 0xC6, 0x2C, 0xC6, 0x2C, 0xC8, 0x2C, -- 0xC8, 0x2C, 0xCA, 0x2C, 0xCA, 0x2C, 0xCC, 0x2C, -- 0xCC, 0x2C, 0xCE, 0x2C, 0xCE, 0x2C, 0xD0, 0x2C, -- 0xD0, 0x2C, 0xD2, 0x2C, 0xD2, 0x2C, 0xD4, 0x2C, -- 0xD4, 0x2C, 0xD6, 0x2C, 0xD6, 0x2C, 0xD8, 0x2C, -- 0xD8, 0x2C, 0xDA, 0x2C, 0xDA, 0x2C, 0xDC, 0x2C, -- 0xDC, 0x2C, 0xDE, 0x2C, 0xDE, 0x2C, 0xE0, 0x2C, -- 0xE0, 0x2C, 0xE2, 0x2C, 0xE2, 0x2C, 0xE4, 0x2C, -- 0xE5, 0x2C, 0xE6, 0x2C, 0xE7, 0x2C, 0xE8, 0x2C, -- 0xE9, 0x2C, 0xEA, 0x2C, 0xEB, 0x2C, 0xEC, 0x2C, -- 0xED, 0x2C, 0xEE, 0x2C, 0xEF, 0x2C, 0xF0, 0x2C, -- 0xF1, 0x2C, 0xF2, 0x2C, 0xF3, 0x2C, 0xF4, 0x2C, -- 0xF5, 0x2C, 0xF6, 0x2C, 0xF7, 0x2C, 0xF8, 0x2C, -- 0xF9, 0x2C, 0xFA, 0x2C, 0xFB, 0x2C, 0xFC, 0x2C, -- 0xFD, 0x2C, 0xFE, 0x2C, 0xFF, 0x2C, 0xA0, 0x10, -- 0xA1, 0x10, 0xA2, 0x10, 0xA3, 0x10, 0xA4, 0x10, -- 0xA5, 0x10, 0xA6, 0x10, 0xA7, 0x10, 0xA8, 0x10, -- 0xA9, 0x10, 0xAA, 0x10, 0xAB, 0x10, 0xAC, 0x10, -- 0xAD, 0x10, 0xAE, 0x10, 0xAF, 0x10, 0xB0, 0x10, -- 0xB1, 0x10, 0xB2, 0x10, 0xB3, 0x10, 0xB4, 0x10, -- 0xB5, 0x10, 0xB6, 0x10, 0xB7, 0x10, 0xB8, 0x10, -- 0xB9, 0x10, 0xBA, 0x10, 0xBB, 0x10, 0xBC, 0x10, -- 0xBD, 0x10, 0xBE, 0x10, 0xBF, 0x10, 0xC0, 0x10, -- 0xC1, 0x10, 0xC2, 0x10, 0xC3, 0x10, 0xC4, 0x10, -- 0xC5, 0x10, 0xFF, 0xFF, 0x1B, 0xD2, 0x21, 0xFF, -- 0x22, 0xFF, 0x23, 0xFF, 0x24, 0xFF, 0x25, 0xFF, -- 0x26, 0xFF, 0x27, 0xFF, 0x28, 0xFF, 0x29, 0xFF, -- 0x2A, 0xFF, 0x2B, 0xFF, 0x2C, 0xFF, 0x2D, 0xFF, -- 0x2E, 0xFF, 0x2F, 0xFF, 0x30, 0xFF, 0x31, 0xFF, -- 0x32, 0xFF, 0x33, 0xFF, 0x34, 0xFF, 0x35, 0xFF, -- 0x36, 0xFF, 0x37, 0xFF, 0x38, 0xFF, 0x39, 0xFF, -- 0x3A, 0xFF, 0x5B, 0xFF, 0x5C, 0xFF, 0x5D, 0xFF, -- 0x5E, 0xFF, 0x5F, 0xFF, 0x60, 0xFF, 0x61, 0xFF, -- 0x62, 0xFF, 0x63, 0xFF, 0x64, 0xFF, 0x65, 0xFF, -- 0x66, 0xFF, 0x67, 0xFF, 0x68, 0xFF, 0x69, 0xFF, -- 0x6A, 0xFF, 0x6B, 0xFF, 0x6C, 0xFF, 0x6D, 0xFF, -- 0x6E, 0xFF, 0x6F, 0xFF, 0x70, 0xFF, 0x71, 0xFF, -- 0x72, 0xFF, 0x73, 0xFF, 0x74, 0xFF, 0x75, 0xFF, -- 0x76, 0xFF, 0x77, 0xFF, 0x78, 0xFF, 0x79, 0xFF, -- 0x7A, 0xFF, 0x7B, 0xFF, 0x7C, 0xFF, 0x7D, 0xFF, -- 0x7E, 0xFF, 0x7F, 0xFF, 0x80, 0xFF, 0x81, 0xFF, -- 0x82, 0xFF, 0x83, 0xFF, 0x84, 0xFF, 0x85, 0xFF, -- 0x86, 0xFF, 0x87, 0xFF, 0x88, 0xFF, 0x89, 0xFF, -- 0x8A, 0xFF, 0x8B, 0xFF, 0x8C, 0xFF, 0x8D, 0xFF, -- 0x8E, 0xFF, 0x8F, 0xFF, 0x90, 0xFF, 0x91, 0xFF, -- 0x92, 0xFF, 0x93, 0xFF, 0x94, 0xFF, 0x95, 0xFF, -- 0x96, 0xFF, 0x97, 0xFF, 0x98, 0xFF, 0x99, 0xFF, -- 0x9A, 0xFF, 0x9B, 0xFF, 0x9C, 0xFF, 0x9D, 0xFF, -- 0x9E, 0xFF, 0x9F, 0xFF, 0xA0, 0xFF, 0xA1, 0xFF, -- 0xA2, 0xFF, 0xA3, 0xFF, 0xA4, 0xFF, 0xA5, 0xFF, -- 0xA6, 0xFF, 0xA7, 0xFF, 0xA8, 0xFF, 0xA9, 0xFF, -- 0xAA, 0xFF, 0xAB, 0xFF, 0xAC, 0xFF, 0xAD, 0xFF, -- 0xAE, 0xFF, 0xAF, 0xFF, 0xB0, 0xFF, 0xB1, 0xFF, -- 0xB2, 0xFF, 0xB3, 0xFF, 0xB4, 0xFF, 0xB5, 0xFF, -- 0xB6, 0xFF, 0xB7, 0xFF, 0xB8, 0xFF, 0xB9, 0xFF, -- 0xBA, 0xFF, 0xBB, 0xFF, 0xBC, 0xFF, 0xBD, 0xFF, -- 0xBE, 0xFF, 0xBF, 0xFF, 0xC0, 0xFF, 0xC1, 0xFF, -- 0xC2, 0xFF, 0xC3, 0xFF, 0xC4, 0xFF, 0xC5, 0xFF, -- 0xC6, 0xFF, 0xC7, 0xFF, 0xC8, 0xFF, 0xC9, 0xFF, -- 0xCA, 0xFF, 0xCB, 0xFF, 0xCC, 0xFF, 0xCD, 0xFF, -- 0xCE, 0xFF, 0xCF, 0xFF, 0xD0, 0xFF, 0xD1, 0xFF, -- 0xD2, 0xFF, 0xD3, 0xFF, 0xD4, 0xFF, 0xD5, 0xFF, -- 0xD6, 0xFF, 0xD7, 0xFF, 0xD8, 0xFF, 0xD9, 0xFF, -- 0xDA, 0xFF, 0xDB, 0xFF, 0xDC, 0xFF, 0xDD, 0xFF, -- 0xDE, 0xFF, 0xDF, 0xFF, 0xE0, 0xFF, 0xE1, 0xFF, -- 0xE2, 0xFF, 0xE3, 0xFF, 0xE4, 0xFF, 0xE5, 0xFF, -- 0xE6, 0xFF, 0xE7, 0xFF, 0xE8, 0xFF, 0xE9, 0xFF, -- 0xEA, 0xFF, 0xEB, 0xFF, 0xEC, 0xFF, 0xED, 0xFF, -- 0xEE, 0xFF, 0xEF, 0xFF, 0xF0, 0xFF, 0xF1, 0xFF, -- 0xF2, 0xFF, 0xF3, 0xFF, 0xF4, 0xFF, 0xF5, 0xFF, -- 0xF6, 0xFF, 0xF7, 0xFF, 0xF8, 0xFF, 0xF9, 0xFF, -- 0xFA, 0xFF, 0xFB, 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, -- 0xFE, 0xFF, 0xFF, 0xFF --}; -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/Kconfig linux-5.6.3/drivers/staging/exfat/Kconfig ---- linux-5.6.3.orig/drivers/staging/exfat/Kconfig 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/Kconfig 1970-01-01 02:00:00.000000000 +0200 -@@ -1,41 +0,0 @@ --# SPDX-License-Identifier: GPL-2.0 --config STAGING_EXFAT_FS -- tristate "exFAT fs support" -- depends on BLOCK -- select NLS -- help -- This adds support for the exFAT file system. -- --config STAGING_EXFAT_DISCARD -- bool "enable discard support" -- depends on STAGING_EXFAT_FS -- default y -- --config STAGING_EXFAT_DELAYED_SYNC -- bool "enable delayed sync" -- depends on STAGING_EXFAT_FS -- default n -- --config STAGING_EXFAT_KERNEL_DEBUG -- bool "enable kernel debug features via ioctl" -- depends on STAGING_EXFAT_FS -- default n -- --config STAGING_EXFAT_DEBUG_MSG -- bool "print debug messages" -- depends on STAGING_EXFAT_FS -- default n -- --config STAGING_EXFAT_DEFAULT_CODEPAGE -- int "Default codepage for exFAT" -- default 437 -- depends on STAGING_EXFAT_FS -- help -- This option should be set to the codepage of your exFAT filesystems. -- --config STAGING_EXFAT_DEFAULT_IOCHARSET -- string "Default iocharset for exFAT" -- default "utf8" -- depends on STAGING_EXFAT_FS -- help -- Set this to the default input/output character set you'd like exFAT to use. -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/Makefile linux-5.6.3/drivers/staging/exfat/Makefile ---- linux-5.6.3.orig/drivers/staging/exfat/Makefile 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/Makefile 1970-01-01 02:00:00.000000000 +0200 -@@ -1,10 +0,0 @@ --# SPDX-License-Identifier: GPL-2.0-or-later -- --obj-$(CONFIG_STAGING_EXFAT_FS) += exfat.o -- --exfat-y := exfat_core.o \ -- exfat_super.o \ -- exfat_blkdev.o \ -- exfat_cache.o \ -- exfat_nls.o \ -- exfat_upcase.o -diff -Nurp linux-5.6.3.orig/drivers/staging/exfat/TODO linux-5.6.3/drivers/staging/exfat/TODO ---- linux-5.6.3.orig/drivers/staging/exfat/TODO 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/exfat/TODO 1970-01-01 02:00:00.000000000 +0200 -@@ -1,69 +0,0 @@ --A laundry list of things that need looking at, most of which will --require more work than the average checkpatch cleanup... -- --Note that some of these entries may not be bugs - they're things --that need to be looked at, and *possibly* fixed. -- --Clean up the ffsCamelCase function names. -- --Fix (thing)->flags to not use magic numbers - multiple offenders -- --Sort out all the s32/u32/u8 nonsense - most of these should be plain int. -- --exfat_core.c - ffsReadFile - the goto err_out seem to leak a brelse(). --same for ffsWriteFile. -- --All the calls to fs_sync() need to be looked at, particularly in the --context of EXFAT_DELAYED_SYNC. Currently, if that's defined, we only --flush to disk when sync() gets called. We should be doing at least --metadata flushes at appropriate times. -- --ffsTruncateFile - if (old_size <= new_size) { --That doesn't look right. How did it ever work? Are they relying on lazy --block allocation when actual writes happen? If nothing else, it never --does the 'fid->size = new_size' and do the inode update.... -- --ffsSetAttr() is just dangling in the breeze, not wired up at all... -- --Convert global mutexes to a per-superblock mutex. -- --Right now, we load exactly one UTF-8 table. Check to see --if that plays nice with different codepage and iocharset values --for simultanous mounts of different devices -- --exfat_rmdir() checks for -EBUSY but ffsRemoveDir() doesn't return it. --In fact, there's a complete lack of -EBUSY testing anywhere. -- --There's probably a few missing checks for -EEXIST -- --check return codes of sync_dirty_buffer() -- --Why is remove_file doing a num_entries++?? -- --Double check a lot of can't-happen parameter checks (for null pointers for --things that have only one call site and can't pass a null, etc). -- --All the DEBUG stuff can probably be tossed, including the ioctl(). Either --that, or convert to a proper fault-injection system. -- --exfat_remount does exactly one thing. Fix to actually deal with remount --options, particularly handling R/O correctly. For that matter, allow --R/O mounts in the first place. -- --Figure out why the VFAT code used multi_sector_(read|write) but the --exfat code doesn't use it. The difference matters on SSDs with wear leveling. -- --exfat_fat_sync(), exfat_buf_sync(), and sync_alloc_bitmap() --aren't called anyplace.... -- --Create helper function for exfat_set_entry_time() and exfat_set_entry_type() --because it's sort of ugly to be calling the same functionn directly and --other code calling through the fs_func struc ponters... -- --clean up the remaining vol_type checks, which are of two types: --some are ?: operators with magic numbers, and the rest are places --where we're doing stuff with '.' and '..'. -- --Patches to: -- Greg Kroah-Hartman -- Valdis Kletnieks -diff -Nurp linux-5.6.3.orig/drivers/staging/Kconfig linux-5.6.3/drivers/staging/Kconfig ---- linux-5.6.3.orig/drivers/staging/Kconfig 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/Kconfig 2020-04-10 13:23:50.104394573 +0300 -@@ -115,8 +115,6 @@ source "drivers/staging/kpc2000/Kconfig" - source "drivers/staging/wusbcore/Kconfig" - source "drivers/staging/uwb/Kconfig" - --source "drivers/staging/exfat/Kconfig" -- - source "drivers/staging/qlge/Kconfig" - - source "drivers/staging/hp/Kconfig" -diff -Nurp linux-5.6.3.orig/drivers/staging/Makefile linux-5.6.3/drivers/staging/Makefile ---- linux-5.6.3.orig/drivers/staging/Makefile 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/drivers/staging/Makefile 2020-04-10 13:23:55.703656045 +0300 -@@ -48,7 +48,6 @@ obj-$(CONFIG_FIELDBUS_DEV) += fieldb - obj-$(CONFIG_KPC2000) += kpc2000/ - obj-$(CONFIG_UWB) += uwb/ - obj-$(CONFIG_USB_WUSB) += wusbcore/ --obj-$(CONFIG_STAGING_EXFAT_FS) += exfat/ - obj-$(CONFIG_QLGE) += qlge/ - obj-$(CONFIG_NET_VENDOR_HP) += hp/ - obj-$(CONFIG_WFX) += wfx/ -diff -Nurp linux-5.6.3.orig/MAINTAINERS linux-5.6.3/MAINTAINERS ---- linux-5.6.3.orig/MAINTAINERS 2020-03-30 01:25:41.000000000 +0300 -+++ linux-5.6.3/MAINTAINERS 2020-04-10 13:23:25.806260135 +0300 -@@ -6304,12 +6304,6 @@ F: include/trace/events/mdio.h - F: include/uapi/linux/mdio.h - F: include/uapi/linux/mii.h - --EXFAT FILE SYSTEM --M: Valdis Kletnieks --L: linux-fsdevel@vger.kernel.org --S: Maintained --F: drivers/staging/exfat/ -- - EXT2 FILE SYSTEM - M: Jan Kara - L: linux-ext4@vger.kernel.org diff --git a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-update-file-system-parameter-handling.patch b/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-update-file-system-parameter-handling.patch deleted file mode 100644 index 9e07cd45..00000000 --- a/kernel/tools/cpupowertools/files/patches/mageia/fs-exfat-update-file-system-parameter-handling.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 9acd0d53800c55c6e2186e29b6433daf24617451 Mon Sep 17 00:00:00 2001 -From: Valdis Kletnieks -Date: Mon, 2 Mar 2020 15:21:45 +0900 -Subject: [PATCH] exfat: update file system parameter handling - -Al Viro recently reworked the way file system parameters are handled -Update super.c to work with it in linux-next 20200203. - -Signed-off-by: Valdis Kletnieks -Reviewed-by: Christoph Hellwig -Acked-by: Namjae Jeon -Signed-off-by: Al Viro ---- - fs/exfat/super.c | 28 +++++++++++----------------- - 1 file changed, 11 insertions(+), 17 deletions(-) - -diff --git a/fs/exfat/super.c b/fs/exfat/super.c -index f06e0b53e393..16ed202ef527 100644 ---- a/fs/exfat/super.c -+++ b/fs/exfat/super.c -@@ -214,7 +214,14 @@ enum { - Opt_time_offset, - }; - --static const struct fs_parameter_spec exfat_param_specs[] = { -+static const struct constant_table exfat_param_enums[] = { -+ { "continue", EXFAT_ERRORS_CONT }, -+ { "panic", EXFAT_ERRORS_PANIC }, -+ { "remount-ro", EXFAT_ERRORS_RO }, -+ {} -+}; -+ -+static const struct fs_parameter_spec exfat_parameters[] = { - fsparam_u32("uid", Opt_uid), - fsparam_u32("gid", Opt_gid), - fsparam_u32oct("umask", Opt_umask), -@@ -222,25 +229,12 @@ static const struct fs_parameter_spec exfat_param_specs[] = { - fsparam_u32oct("fmask", Opt_fmask), - fsparam_u32oct("allow_utime", Opt_allow_utime), - fsparam_string("iocharset", Opt_charset), -- fsparam_enum("errors", Opt_errors), -+ fsparam_enum("errors", Opt_errors, exfat_param_enums), - fsparam_flag("discard", Opt_discard), - fsparam_s32("time_offset", Opt_time_offset), - {} - }; - --static const struct fs_parameter_enum exfat_param_enums[] = { -- { Opt_errors, "continue", EXFAT_ERRORS_CONT }, -- { Opt_errors, "panic", EXFAT_ERRORS_PANIC }, -- { Opt_errors, "remount-ro", EXFAT_ERRORS_RO }, -- {} --}; -- --static const struct fs_parameter_description exfat_parameters = { -- .name = "exfat", -- .specs = exfat_param_specs, -- .enums = exfat_param_enums, --}; -- - static int exfat_parse_param(struct fs_context *fc, struct fs_parameter *param) - { - struct exfat_sb_info *sbi = fc->s_fs_info; -@@ -248,7 +242,7 @@ static int exfat_parse_param(struct fs_context *fc, struct fs_parameter *param) - struct fs_parse_result result; - int opt; - -- opt = fs_parse(fc, &exfat_parameters, param, &result); -+ opt = fs_parse(fc, exfat_parameters, param, &result); - if (opt < 0) - return opt; - -@@ -665,7 +659,7 @@ static struct file_system_type exfat_fs_type = { - .owner = THIS_MODULE, - .name = "exfat", - .init_fs_context = exfat_init_fs_context, -- .parameters = &exfat_parameters, -+ .parameters = exfat_parameters, - .kill_sb = kill_block_super, - .fs_flags = FS_REQUIRES_DEV, - }; --- -2.26.0 - diff --git a/kernel/tools/cpupowertools/pspec.xml b/kernel/tools/cpupowertools/pspec.xml index 7c605491..1ca6a52c 100644 --- a/kernel/tools/cpupowertools/pspec.xml +++ b/kernel/tools/cpupowertools/pspec.xml @@ -12,33 +12,17 @@ app:console

CPU power management tools cpupowertools contains utilities to manage power management and frequency scaling policies of modern CPUs. - https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.6.tar.gz + https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.7.tar.gz pciutils-devel - patches/linux/patch-5.6.19.xz + patches/linux/patch-5.7.13.xz patches/mageia/fs-aufs-5.6.patch patches/mageia/fs-aufs-5.6-modular.patch patches/mageia/fs-aufs-5.6-fix.patch - patches/mageia/fs-exfat-remove-from-staging.patch - patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch - patches/mageia/fs-exfat-add-super-block-operations.patch - patches/mageia/fs-exfat-add-inode-operations.patch - patches/mageia/fs-exfat-add-directory-operations.patch - patches/mageia/fs-exfat-add-file-operations.patch - patches/mageia/fs-exfat-add-fat-entry-operations.patch - patches/mageia/fs-exfat-add-bitmap-operations.patch - patches/mageia/fs-exfat-add-exfat-cache.patch - patches/mageia/fs-exfat-add-misc-operations.patch - patches/mageia/fs-exfat-add-nls-operations.patch - patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch - patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch - patches/mageia/fs-exfat-update-file-system-parameter-handling.patch - patches/mageia/fs-exfat-add-module_alias_fs.patch - patches/mageia/fs-exfat-fix-discard-support.patch patches/mageia/CVE-2019-12379.patch @@ -67,6 +51,13 @@ + + 2020-08-05 + 5.7.13 + Version bump + Mustafa Cinasal + muscnsl@gmail.com + 2020-06-17 5.6.19