From 791585b9ef35571c9f4e7accafde99fb050ae381 Mon Sep 17 00:00:00 2001 From: Rmys Date: Wed, 5 Aug 2020 18:21:46 +0300 Subject: [PATCH] kernel-5.7.13 --- .../kernel/files/configs/kernel-x86_64-config | 537 +- .../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/kernel/pspec.xml | 31 +- 19 files changed, 325 insertions(+), 17195 deletions(-) create mode 100644 kernel/kernel/files/patches/linux/patch-5.7.13.xz delete mode 100644 kernel/kernel/files/patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-bitmap-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-directory-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-exfat-cache.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-fat-entry-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-file-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-inode-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-misc-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-module_alias_fs.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-nls-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-add-super-block-operations.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-fix-discard-support.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-remove-from-staging.patch delete mode 100644 kernel/kernel/files/patches/mageia/fs-exfat-update-file-system-parameter-handling.patch diff --git a/kernel/kernel/files/configs/kernel-x86_64-config b/kernel/kernel/files/configs/kernel-x86_64-config index 15c6d75d..cfd4c6df 100755 --- a/kernel/kernel/files/configs/kernel-x86_64-config +++ b/kernel/kernel/files/configs/kernel-x86_64-config @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86_64 5.6.19 Kernel Configuration +# Linux/x86_64 5.7.13 Kernel Configuration # # @@ -8,6 +8,7 @@ # CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=90201 +CONFIG_LD_VERSION=233010000 CONFIG_CLANG_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO=y @@ -56,6 +57,8 @@ CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y CONFIG_GENERIC_PENDING_IRQ=y CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_INJECTION=y +CONFIG_HARDIRQS_SW_RESEND=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_DOMAIN=y CONFIG_IRQ_SIM=y @@ -71,7 +74,6 @@ CONFIG_SPARSE_IRQ=y # end of IRQ subsystem CONFIG_CLOCKSOURCE_WATCHDOG=y -CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_ARCH_CLOCKSOURCE_INIT=y CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y CONFIG_GENERIC_TIME_VSYSCALL=y @@ -103,6 +105,7 @@ CONFIG_TICK_CPU_ACCOUNTING=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set CONFIG_HAVE_SCHED_AVG_IRQ=y +# CONFIG_SCHED_THERMAL_PRESSURE is not set CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_TASKSTATS=y @@ -136,6 +139,7 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y # # Scheduler features # +# CONFIG_UCLAMP_TASK is not set # end of Scheduler features CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y @@ -220,6 +224,7 @@ CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y CONFIG_KALLSYMS_BASE_RELATIVE=y +# CONFIG_BPF_LSM is not set CONFIG_BPF_SYSCALL=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # CONFIG_BPF_JIT_ALWAYS_ON is not set @@ -253,7 +258,6 @@ CONFIG_X86_64=y CONFIG_X86=y CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf64-x86-64" -CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_MMU=y @@ -295,7 +299,7 @@ CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y # CONFIG_GOLDFISH is not set CONFIG_RETPOLINE=y -# CONFIG_X86_CPU_RESCTRL is not set +CONFIG_X86_CPU_RESCTRL=y CONFIG_X86_EXTENDED_PLATFORM=y # CONFIG_X86_NUMACHIP is not set # CONFIG_X86_VSMP is not set @@ -330,7 +334,7 @@ CONFIG_PVH=y CONFIG_PARAVIRT_TIME_ACCOUNTING=y CONFIG_PARAVIRT_CLOCK=y # CONFIG_JAILHOUSE_GUEST is not set -# CONFIG_ACRN_GUEST is not set +CONFIG_ACRN_GUEST=y # CONFIG_MK8 is not set # CONFIG_MPSC is not set # CONFIG_MCORE2 is not set @@ -488,7 +492,9 @@ CONFIG_PM_SLEEP_DEBUG=y CONFIG_PM_TRACE=y CONFIG_PM_TRACE_RTC=y CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y # CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y # CONFIG_ENERGY_MODEL is not set CONFIG_ARCH_SUPPORTS_ACPI=y CONFIG_ACPI=y @@ -567,7 +573,7 @@ CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=m CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m -# CONFIG_CPU_FREQ_GOV_SCHEDUTIL is not set +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y # # CPU frequency scaling drivers @@ -593,9 +599,9 @@ CONFIG_X86_SPEEDSTEP_LIB=y CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y -# CONFIG_CPU_IDLE_GOV_TEO is not set -# CONFIG_CPU_IDLE_GOV_HALTPOLL is not set -CONFIG_HALTPOLL_CPUIDLE=y +CONFIG_CPU_IDLE_GOV_TEO=y +CONFIG_CPU_IDLE_GOV_HALTPOLL=y +CONFIG_HALTPOLL_CPUIDLE=m # end of CPU Idle CONFIG_INTEL_IDLE=y @@ -656,7 +662,7 @@ CONFIG_EFI_CAPSULE_LOADER=m CONFIG_EFI_TEST=m CONFIG_APPLE_PROPERTIES=y # CONFIG_RESET_ATTACK_MITIGATION is not set -# CONFIG_EFI_RCI2_TABLE is not set +CONFIG_EFI_RCI2_TABLE=y # CONFIG_EFI_DISABLE_PCI_DMA is not set # end of EFI (Extensible Firmware Interface) Support @@ -664,6 +670,7 @@ CONFIG_UEFI_CPER=y CONFIG_UEFI_CPER_X86=y CONFIG_EFI_DEV_PATH_PARSER=y CONFIG_EFI_EARLYCON=y +CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y # # Tegra firmware driver @@ -691,11 +698,9 @@ CONFIG_KVM_INTEL=m CONFIG_KVM_AMD=m CONFIG_KVM_AMD_SEV=y CONFIG_KVM_MMU_AUDIT=y -CONFIG_VHOST_NET=m -CONFIG_VHOST_SCSI=m -CONFIG_VHOST_VSOCK=m -CONFIG_VHOST=m -# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set +CONFIG_AS_AVX512=y +CONFIG_AS_SHA1_NI=y +CONFIG_AS_SHA256_NI=y # # General architecture-dependent options @@ -804,8 +809,8 @@ CONFIG_ARCH_HAS_MEM_ENCRYPT=y CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y # end of GCOV-based kernel profiling -CONFIG_PLUGIN_HOSTCC="" CONFIG_HAVE_GCC_PLUGINS=y +# CONFIG_GCC_PLUGINS is not set # end of General architecture-dependent options CONFIG_RT_MUTEXES=y @@ -923,6 +928,7 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK_NODE_MAP=y CONFIG_HAVE_FAST_GUP=y +CONFIG_NUMA_KEEP_MEMINFO=y CONFIG_MEMORY_ISOLATION=y CONFIG_HAVE_BOOTMEM_INFO_NODE=y CONFIG_MEMORY_HOTPLUG=y @@ -933,6 +939,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_MEMORY_BALLOON=y CONFIG_BALLOON_COMPACTION=y CONFIG_COMPACTION=y +CONFIG_PAGE_REPORTING=y CONFIG_MIGRATION=y CONFIG_CONTIG_ALLOC=y CONFIG_PHYS_ADDR_T_64BIT=y @@ -948,7 +955,6 @@ CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set CONFIG_ARCH_WANTS_THP_SWAP=y CONFIG_THP_SWAP=y -CONFIG_TRANSPARENT_HUGE_PAGECACHE=y CONFIG_CLEANCACHE=y CONFIG_FRONTSWAP=y # CONFIG_CMA is not set @@ -1085,6 +1091,7 @@ CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y CONFIG_IPV6_PIMSM_V2=y # CONFIG_IPV6_SEG6_LWTUNNEL is not set # CONFIG_IPV6_SEG6_HMAC is not set +# CONFIG_IPV6_RPL_LWTUNNEL is not set CONFIG_NETLABEL=y # CONFIG_MPTCP is not set CONFIG_NETWORK_SECMARK=y @@ -1142,8 +1149,8 @@ CONFIG_NF_NAT_SIP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=y CONFIG_NF_NAT_MASQUERADE=y +CONFIG_NETFILTER_SYNPROXY=m CONFIG_NF_TABLES=m -# CONFIG_NF_TABLES_SET is not set # CONFIG_NF_TABLES_INET is not set # CONFIG_NF_TABLES_NETDEV is not set # CONFIG_NFT_NUMGEN is not set @@ -1161,11 +1168,11 @@ CONFIG_NFT_QUEUE=m CONFIG_NFT_REJECT=m CONFIG_NFT_COMPAT=m CONFIG_NFT_HASH=m -# CONFIG_NFT_XFRM is not set +CONFIG_NFT_XFRM=m # CONFIG_NFT_SOCKET is not set # CONFIG_NFT_OSF is not set # CONFIG_NFT_TPROXY is not set -# CONFIG_NFT_SYNPROXY is not set +CONFIG_NFT_SYNPROXY=m # CONFIG_NF_FLOW_TABLE is not set CONFIG_NETFILTER_XTABLES=y @@ -1397,7 +1404,7 @@ CONFIG_IP6_NF_TARGET_NPT=m CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_TABLES_BRIDGE is not set -# CONFIG_NF_CONNTRACK_BRIDGE is not set +CONFIG_NF_CONNTRACK_BRIDGE=m CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_BROUTE=m CONFIG_BRIDGE_EBT_T_FILTER=m @@ -1469,7 +1476,7 @@ CONFIG_NET_DSA=m CONFIG_NET_DSA_TAG_BRCM_COMMON=m CONFIG_NET_DSA_TAG_BRCM=m CONFIG_NET_DSA_TAG_BRCM_PREPEND=m -# CONFIG_NET_DSA_TAG_GSWIP is not set +CONFIG_NET_DSA_TAG_GSWIP=m CONFIG_NET_DSA_TAG_DSA=m CONFIG_NET_DSA_TAG_EDSA=m # CONFIG_NET_DSA_TAG_MTK is not set @@ -1531,7 +1538,7 @@ CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m # CONFIG_NET_SCH_CBS is not set # CONFIG_NET_SCH_ETF is not set -# CONFIG_NET_SCH_TAPRIO is not set +CONFIG_NET_SCH_TAPRIO=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m CONFIG_NET_SCH_NETEM=m @@ -1549,7 +1556,7 @@ CONFIG_NET_SCH_PIE=m # CONFIG_NET_SCH_FQ_PIE is not set CONFIG_NET_SCH_INGRESS=m CONFIG_NET_SCH_PLUG=m -# CONFIG_NET_SCH_ETS is not set +CONFIG_NET_SCH_ETS=m # CONFIG_NET_SCH_DEFAULT is not set # @@ -1591,15 +1598,14 @@ CONFIG_NET_ACT_PEDIT=m CONFIG_NET_ACT_SIMP=m CONFIG_NET_ACT_SKBEDIT=m CONFIG_NET_ACT_CSUM=m -# CONFIG_NET_ACT_MPLS is not set +CONFIG_NET_ACT_MPLS=m # CONFIG_NET_ACT_VLAN is not set CONFIG_NET_ACT_BPF=m CONFIG_NET_ACT_CONNMARK=m -# CONFIG_NET_ACT_CTINFO is not set +CONFIG_NET_ACT_CTINFO=m # CONFIG_NET_ACT_SKBMOD is not set # CONFIG_NET_ACT_IFE is not set # CONFIG_NET_ACT_TUNNEL_KEY is not set -# CONFIG_NET_ACT_CT is not set # CONFIG_NET_TC_SKB_EXT is not set CONFIG_NET_SCH_FIFO=y CONFIG_DCB=y @@ -1612,7 +1618,7 @@ CONFIG_BATMAN_ADV_DAT=y # CONFIG_BATMAN_ADV_MCAST is not set CONFIG_BATMAN_ADV_DEBUGFS=y # CONFIG_BATMAN_ADV_DEBUG is not set -CONFIG_BATMAN_ADV_SYSFS=y +# CONFIG_BATMAN_ADV_SYSFS is not set # CONFIG_BATMAN_ADV_TRACING is not set CONFIG_OPENVSWITCH=m CONFIG_OPENVSWITCH_GRE=m @@ -1700,7 +1706,7 @@ CONFIG_BT_RTL=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y -# CONFIG_BT_HCIBTUSB_MTK is not set +CONFIG_BT_HCIBTUSB_MTK=y CONFIG_BT_HCIBTUSB_RTL=y CONFIG_BT_HCIBTSDIO=m CONFIG_BT_HCIUART=m @@ -1719,7 +1725,7 @@ CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m -# CONFIG_BT_MTKSDIO is not set +CONFIG_BT_MTKSDIO=m CONFIG_BT_HCIRSI=m # end of Bluetooth device drivers @@ -1865,8 +1871,8 @@ CONFIG_HOTPLUG_PCI_ACPI_IBM=m # # PCI controller drivers # -# CONFIG_VMD is not set -# CONFIG_PCI_HYPERV_INTERFACE is not set +CONFIG_VMD=m +CONFIG_PCI_HYPERV_INTERFACE=m # # DesignWare PCI Core Support @@ -1875,6 +1881,11 @@ CONFIG_HOTPLUG_PCI_ACPI_IBM=m # CONFIG_PCI_MESON is not set # end of DesignWare PCI Core Support +# +# Mobiveil PCIe Core Support +# +# end of Mobiveil PCIe Core Support + # # Cadence PCIe controllers support # @@ -1930,7 +1941,7 @@ CONFIG_FW_LOADER_PAGED_BUF=y CONFIG_EXTRA_FIRMWARE="" CONFIG_FW_LOADER_USER_HELPER=y CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y -# CONFIG_FW_LOADER_COMPRESS is not set +CONFIG_FW_LOADER_COMPRESS=y CONFIG_FW_CACHE=y # end of Firmware loader @@ -1952,6 +1963,7 @@ CONFIG_DMA_SHARED_BUFFER=y # # Bus devices # +# CONFIG_MHI_BUS is not set # end of Bus devices CONFIG_CONNECTOR=y @@ -2021,8 +2033,33 @@ CONFIG_MTD_CFI_I2=y # CONFIG_MTD_DOCG3 is not set # end of Self-contained MTD device drivers +CONFIG_MTD_NAND_CORE=m # CONFIG_MTD_ONENAND is not set -# CONFIG_MTD_RAW_NAND is not set +CONFIG_MTD_NAND_ECC_SW_HAMMING=m +# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set +CONFIG_MTD_RAW_NAND=m +CONFIG_MTD_NAND_ECC_SW_BCH=y + +# +# Raw/parallel NAND flash controllers +# +CONFIG_MTD_NAND_DENALI=m +CONFIG_MTD_NAND_DENALI_PCI=m +CONFIG_MTD_NAND_CAFE=m +CONFIG_MTD_NAND_MXIC=m +CONFIG_MTD_NAND_GPIO=m +# CONFIG_MTD_NAND_PLATFORM is not set + +# +# Misc +# +CONFIG_MTD_SM_COMMON=m +CONFIG_MTD_NAND_NANDSIM=m +CONFIG_MTD_NAND_RICOH=m +CONFIG_MTD_NAND_DISKONCHIP=m +# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set +CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 +# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set # # LPDDR & LPDDR2 PCM memory drivers @@ -2089,16 +2126,16 @@ CONFIG_BLK_DEV_RSXX=m CONFIG_NVME_CORE=m CONFIG_BLK_DEV_NVME=m # CONFIG_NVME_MULTIPATH is not set -# CONFIG_NVME_HWMON is not set +CONFIG_NVME_HWMON=y CONFIG_NVME_FABRICS=m CONFIG_NVME_RDMA=m # CONFIG_NVME_FC is not set -# CONFIG_NVME_TCP is not set +CONFIG_NVME_TCP=m CONFIG_NVME_TARGET=m CONFIG_NVME_TARGET_LOOP=m CONFIG_NVME_TARGET_RDMA=m # CONFIG_NVME_TARGET_FC is not set -# CONFIG_NVME_TARGET_TCP is not set +CONFIG_NVME_TARGET_TCP=m # end of NVME Support # @@ -2137,7 +2174,7 @@ CONFIG_EEPROM_LEGACY=m CONFIG_EEPROM_MAX6875=m CONFIG_EEPROM_93CX6=m # CONFIG_EEPROM_IDT_89HPESX is not set -# CONFIG_EEPROM_EE1004 is not set +CONFIG_EEPROM_EE1004=m # end of EEPROM support CONFIG_CB710_CORE=m @@ -2159,7 +2196,7 @@ CONFIG_ALTERA_STAPL=m CONFIG_INTEL_MEI=y CONFIG_INTEL_MEI_ME=m CONFIG_INTEL_MEI_TXE=m -# CONFIG_INTEL_MEI_HDCP is not set +CONFIG_INTEL_MEI_HDCP=m CONFIG_VMWARE_VMCI=m # @@ -2173,10 +2210,11 @@ CONFIG_INTEL_MIC_BUS=m CONFIG_GENWQE=m CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=1 # CONFIG_ECHO is not set -# CONFIG_MISC_ALCOR_PCI is not set +CONFIG_MISC_ALCOR_PCI=m # CONFIG_MISC_RTSX_PCI is not set # CONFIG_MISC_RTSX_USB is not set # CONFIG_HABANA_AI is not set +# CONFIG_UACCE is not set # end of Misc devices CONFIG_HAVE_IDE=y @@ -2198,7 +2236,6 @@ CONFIG_SCSI_PROC_FS=y CONFIG_BLK_DEV_SD=y CONFIG_CHR_DEV_ST=m CONFIG_BLK_DEV_SR=y -CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_CHR_DEV_SG=y CONFIG_CHR_DEV_SCH=m CONFIG_SCSI_ENCLOSURE=m @@ -2271,12 +2308,12 @@ CONFIG_SCSI_UFS_DWC_TC_PCI=m CONFIG_SCSI_UFSHCD_PLATFORM=m # CONFIG_SCSI_UFS_CDNS_PLATFORM is not set CONFIG_SCSI_UFS_DWC_TC_PLATFORM=m -# CONFIG_SCSI_UFS_BSG is not set +CONFIG_SCSI_UFS_BSG=y CONFIG_SCSI_HPTIOP=m CONFIG_SCSI_BUSLOGIC=m # CONFIG_SCSI_FLASHPOINT is not set -# CONFIG_SCSI_MYRB is not set -# CONFIG_SCSI_MYRS is not set +CONFIG_SCSI_MYRB=m +CONFIG_SCSI_MYRS=m CONFIG_VMWARE_PVSCSI=m # CONFIG_XEN_SCSI_FRONTEND is not set CONFIG_HYPERV_STORAGE=m @@ -2286,7 +2323,8 @@ CONFIG_FCOE=m CONFIG_FCOE_FNIC=m # CONFIG_SCSI_SNIC is not set # CONFIG_SCSI_DMX3191D is not set -# CONFIG_SCSI_FDOMAIN_PCI is not set +CONFIG_SCSI_FDOMAIN=m +CONFIG_SCSI_FDOMAIN_PCI=m CONFIG_SCSI_GDTH=m CONFIG_SCSI_ISCI=m CONFIG_SCSI_IPS=m @@ -2328,7 +2366,10 @@ CONFIG_SCSI_DH_ALUA=m # end of SCSI device support CONFIG_ATA=y +CONFIG_SATA_HOST=y +CONFIG_PATA_TIMINGS=y CONFIG_ATA_VERBOSE_ERROR=y +CONFIG_ATA_FORCE=y CONFIG_ATA_ACPI=y CONFIG_SATA_ZPODD=y CONFIG_SATA_PMP=y @@ -2450,7 +2491,7 @@ CONFIG_DM_CACHE=m CONFIG_DM_CACHE_SMQ=m # CONFIG_DM_WRITECACHE is not set CONFIG_DM_ERA=m -# CONFIG_DM_CLONE is not set +CONFIG_DM_CLONE=m CONFIG_DM_MIRROR=y CONFIG_DM_LOG_USERSPACE=m CONFIG_DM_RAID=m @@ -2505,7 +2546,8 @@ CONFIG_MII=m CONFIG_NET_CORE=y CONFIG_BONDING=m CONFIG_DUMMY=m -# CONFIG_WIREGUARD is not set +CONFIG_WIREGUARD=m +# CONFIG_WIREGUARD_DEBUG is not set CONFIG_EQUALIZER=m CONFIG_NET_FC=y CONFIG_IFB=m @@ -2522,6 +2564,7 @@ CONFIG_IPVLAN=y # CONFIG_IPVTAP is not set CONFIG_VXLAN=m CONFIG_GENEVE=m +# CONFIG_BAREUDP is not set # CONFIG_GTP is not set # CONFIG_MACSEC is not set CONFIG_NETCONSOLE=m @@ -2566,10 +2609,10 @@ CONFIG_B53=m CONFIG_B53_MDIO_DRIVER=m CONFIG_B53_MMAP_DRIVER=m CONFIG_B53_SRAB_DRIVER=m -# CONFIG_B53_SERDES is not set +CONFIG_B53_SERDES=m # CONFIG_NET_DSA_BCM_SF2 is not set # CONFIG_NET_DSA_LOOP is not set -# CONFIG_NET_DSA_LANTIQ_GSWIP is not set +CONFIG_NET_DSA_LANTIQ_GSWIP=m # CONFIG_NET_DSA_MT7530 is not set CONFIG_NET_DSA_MV88E6060=m # CONFIG_NET_DSA_MICROCHIP_KSZ9477 is not set @@ -2717,7 +2760,7 @@ CONFIG_IAVF=m CONFIG_I40EVF=m # CONFIG_ICE is not set # CONFIG_FM10K is not set -# CONFIG_IGC is not set +CONFIG_IGC=m CONFIG_JME=m CONFIG_NET_VENDOR_MARVELL=y CONFIG_MVMDIO=m @@ -2749,7 +2792,7 @@ CONFIG_NET_VENDOR_MICREL=y # CONFIG_KS8851_MLL is not set CONFIG_KSZ884X_PCI=m CONFIG_NET_VENDOR_MICROCHIP=y -# CONFIG_LAN743X is not set +CONFIG_LAN743X=m CONFIG_NET_VENDOR_MICROSEMI=y # CONFIG_MSCC_OCELOT_SWITCH is not set CONFIG_NET_VENDOR_MYRI=y @@ -2766,7 +2809,7 @@ CONFIG_VXGE=m CONFIG_NET_VENDOR_NETRONOME=y # CONFIG_NFP is not set CONFIG_NET_VENDOR_NI=y -# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +CONFIG_NI_XGE_MANAGEMENT_ENET=m CONFIG_NET_VENDOR_8390=y CONFIG_PCMCIA_AXNET=m CONFIG_NE2K_PCI=m @@ -2779,7 +2822,7 @@ CONFIG_NET_VENDOR_PACKET_ENGINES=y CONFIG_HAMACHI=m CONFIG_YELLOWFIN=m CONFIG_NET_VENDOR_PENSANDO=y -# CONFIG_IONIC is not set +CONFIG_IONIC=m CONFIG_NET_VENDOR_QLOGIC=y CONFIG_QLA3XXX=m CONFIG_QLCNIC=m @@ -2835,6 +2878,7 @@ CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=m # CONFIG_STMMAC_SELFTESTS is not set # CONFIG_STMMAC_PLATFORM is not set +CONFIG_DWMAC_INTEL=m # CONFIG_STMMAC_PCI is not set CONFIG_NET_VENDOR_SUN=y CONFIG_HAPPYMEAL=m @@ -2859,7 +2903,7 @@ CONFIG_WIZNET_W5300=m # CONFIG_WIZNET_BUS_INDIRECT is not set CONFIG_WIZNET_BUS_ANY=y CONFIG_NET_VENDOR_XILINX=y -# CONFIG_XILINX_AXI_EMAC is not set +CONFIG_XILINX_AXI_EMAC=m # CONFIG_XILINX_LL_TEMAC is not set CONFIG_NET_VENDOR_XIRCOM=y CONFIG_PCMCIA_XIRC2PS=m @@ -2873,7 +2917,9 @@ CONFIG_MDIO_BITBANG=m CONFIG_MDIO_CAVIUM=m CONFIG_MDIO_GPIO=m # CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_MVUSB is not set CONFIG_MDIO_THUNDER=m +CONFIG_MDIO_XPCS=m CONFIG_PHYLINK=m CONFIG_PHYLIB=y CONFIG_SWPHY=y @@ -2883,7 +2929,7 @@ CONFIG_SWPHY=y # MII PHY device drivers # # CONFIG_SFP is not set -# CONFIG_ADIN_PHY is not set +CONFIG_ADIN_PHY=m CONFIG_AMD_PHY=m CONFIG_AQUANTIA_PHY=m # CONFIG_AX88796B_PHY is not set @@ -2899,7 +2945,7 @@ CONFIG_DAVICOM_PHY=m # CONFIG_DP83TC811_PHY is not set CONFIG_DP83848_PHY=m # CONFIG_DP83867_PHY is not set -# CONFIG_DP83869_PHY is not set +CONFIG_DP83869_PHY=m CONFIG_FIXED_PHY=y CONFIG_ICPLUS_PHY=m CONFIG_INTEL_XWAY_PHY=m @@ -2912,7 +2958,7 @@ CONFIG_MICROCHIP_PHY=m # CONFIG_MICROCHIP_T1_PHY is not set CONFIG_MICROSEMI_PHY=m CONFIG_NATIONAL_PHY=m -# CONFIG_NXP_TJA11XX_PHY is not set +CONFIG_NXP_TJA11XX_PHY=m CONFIG_QSEMI_PHY=m CONFIG_REALTEK_PHY=m # CONFIG_RENESAS_PHY is not set @@ -2983,7 +3029,7 @@ CONFIG_USB_IPHETH=m CONFIG_USB_SIERRA_NET=m CONFIG_USB_VL600=m CONFIG_USB_NET_CH9200=m -# CONFIG_USB_NET_AQC111 is not set +CONFIG_USB_NET_AQC111=m CONFIG_WLAN=y CONFIG_WLAN_VENDOR_ADMTEK=y # CONFIG_ADM8211 is not set @@ -3008,7 +3054,7 @@ CONFIG_ATH9K_WOW=y CONFIG_ATH9K_RFKILL=y # CONFIG_ATH9K_CHANNEL_CONTEXT is not set CONFIG_ATH9K_PCOEM=y -# CONFIG_ATH9K_PCI_NO_EEPROM is not set +CONFIG_ATH9K_PCI_NO_EEPROM=m CONFIG_ATH9K_HTC=m # CONFIG_ATH9K_HTC_DEBUGFS is not set CONFIG_ATH9K_HWRNG=y @@ -3124,19 +3170,21 @@ CONFIG_IWLWIFI_DEVICE_TRACING=y CONFIG_WLAN_VENDOR_INTERSIL=y CONFIG_HOSTAP=m -# CONFIG_HOSTAP_FIRMWARE is not set -# CONFIG_HOSTAP_PLX is not set -# CONFIG_HOSTAP_PCI is not set -# CONFIG_HOSTAP_CS is not set +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +CONFIG_HOSTAP_PLX=m +CONFIG_HOSTAP_PCI=m +CONFIG_HOSTAP_CS=m CONFIG_HERMES=m -# CONFIG_HERMES_PRISM is not set +CONFIG_HERMES_PRISM=y CONFIG_HERMES_CACHE_FW_ON_INIT=y -# CONFIG_PLX_HERMES is not set -# CONFIG_TMD_HERMES is not set -# CONFIG_NORTEL_HERMES is not set -# CONFIG_PCMCIA_HERMES is not set -# CONFIG_PCMCIA_SPECTRUM is not set -# CONFIG_ORINOCO_USB is not set +CONFIG_PLX_HERMES=m +CONFIG_TMD_HERMES=m +CONFIG_NORTEL_HERMES=m +CONFIG_PCI_HERMES=m +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_ORINOCO_USB=m CONFIG_P54_COMMON=m CONFIG_P54_USB=m CONFIG_P54_PCI=m @@ -3157,12 +3205,16 @@ CONFIG_MWIFIEX_USB=m CONFIG_MWL8K=m CONFIG_WLAN_VENDOR_MEDIATEK=y CONFIG_MT7601U=m +CONFIG_MT76_CORE=m +CONFIG_MT76_LEDS=y +CONFIG_MT76x02_LIB=m +CONFIG_MT76x0_COMMON=m # CONFIG_MT76x0U is not set -# CONFIG_MT76x0E is not set +CONFIG_MT76x0E=m # CONFIG_MT76x2E is not set # CONFIG_MT76x2U is not set -# CONFIG_MT7603E is not set -# CONFIG_MT7615E is not set +CONFIG_MT7603E=m +CONFIG_MT7615E=m CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2400PCI=m @@ -3216,7 +3268,13 @@ CONFIG_RTL8723_COMMON=m CONFIG_RTLBTCOEXIST=m CONFIG_RTL8XXXU=m # CONFIG_RTL8XXXU_UNTESTED is not set -# CONFIG_RTW88 is not set +CONFIG_RTW88=m +CONFIG_RTW88_CORE=m +CONFIG_RTW88_PCI=m +CONFIG_RTW88_8822BE=y +CONFIG_RTW88_8822CE=y +CONFIG_RTW88_DEBUG=y +CONFIG_RTW88_DEBUGFS=y CONFIG_WLAN_VENDOR_RSI=y CONFIG_RSI_91X=m CONFIG_RSI_DEBUGFS=y @@ -3236,7 +3294,8 @@ CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set CONFIG_WLAN_VENDOR_QUANTENNA=y -# CONFIG_QTNFMAC_PCIE is not set +CONFIG_QTNFMAC=m +CONFIG_QTNFMAC_PCIE=m # CONFIG_PCMCIA_RAYCS is not set # CONFIG_PCMCIA_WL3501 is not set CONFIG_MAC80211_HWSIM=m @@ -3575,24 +3634,7 @@ CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y # CONFIG_LEGACY_PTYS is not set -CONFIG_SERIAL_NONSTANDARD=y -CONFIG_ROCKETPORT=m -CONFIG_CYCLADES=m -# CONFIG_CYZ_INTR is not set -# CONFIG_MOXA_INTELLIO is not set -# CONFIG_MOXA_SMARTIO is not set -CONFIG_SYNCLINK=m -CONFIG_SYNCLINKMP=m -CONFIG_SYNCLINK_GT=m -CONFIG_NOZOMI=m -# CONFIG_ISI is not set -CONFIG_N_HDLC=m -CONFIG_N_GSM=m -# CONFIG_TRACE_SINK is not set -# CONFIG_NULL_TTY is not set CONFIG_LDISC_AUTOLOAD=y -CONFIG_DEVMEM=y -# CONFIG_DEVKMEM is not set # # Serial drivers @@ -3643,17 +3685,33 @@ CONFIG_SERIAL_RP2=m CONFIG_SERIAL_RP2_NR_UARTS=32 CONFIG_SERIAL_FSL_LPUART=m # CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_SPRD is not set # end of Serial drivers CONFIG_SERIAL_MCTRL_GPIO=y -# CONFIG_SERIAL_DEV_BUS is not set -CONFIG_PRINTER=m -CONFIG_LP_CONSOLE=y -CONFIG_PPDEV=m +CONFIG_SERIAL_NONSTANDARD=y +CONFIG_ROCKETPORT=m +CONFIG_CYCLADES=m +# CONFIG_CYZ_INTR is not set +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +CONFIG_SYNCLINK=m +CONFIG_SYNCLINKMP=m +CONFIG_SYNCLINK_GT=m +# CONFIG_ISI is not set +CONFIG_N_HDLC=m +CONFIG_N_GSM=m +CONFIG_NOZOMI=m +# CONFIG_NULL_TTY is not set +# CONFIG_TRACE_SINK is not set CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y CONFIG_HVC_XEN_FRONTEND=y +# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_PRINTER=m +CONFIG_LP_CONSOLE=y +CONFIG_PPDEV=m CONFIG_VIRTIO_CONSOLE=y CONFIG_IPMI_HANDLER=m CONFIG_IPMI_DMI_DECODE=y @@ -3664,14 +3722,13 @@ CONFIG_IPMI_SI=m # CONFIG_IPMI_SSIF is not set CONFIG_IPMI_WATCHDOG=m CONFIG_IPMI_POWEROFF=m -# CONFIG_IPMB_DEVICE_INTERFACE is not set +CONFIG_IPMB_DEVICE_INTERFACE=m CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM_TIMERIOMEM=m CONFIG_HW_RANDOM_INTEL=m CONFIG_HW_RANDOM_AMD=m CONFIG_HW_RANDOM_VIA=m CONFIG_HW_RANDOM_VIRTIO=m -CONFIG_NVRAM=y # CONFIG_APPLICOM is not set # @@ -3685,8 +3742,12 @@ CONFIG_IPWIRELESS=m # end of PCMCIA character devices CONFIG_MWAVE=m +CONFIG_DEVMEM=y +# CONFIG_DEVKMEM is not set +CONFIG_NVRAM=y CONFIG_RAW_DRIVER=y CONFIG_MAX_RAW_DEVS=8192 +CONFIG_DEVPORT=y CONFIG_HPET=y # CONFIG_HPET_MMAP is not set CONFIG_HANGCHECK_TIMER=m @@ -3706,13 +3767,12 @@ CONFIG_TCG_VTPM_PROXY=m CONFIG_TCG_TIS_ST33ZP24=m CONFIG_TCG_TIS_ST33ZP24_I2C=m CONFIG_TELCLOCK=m -CONFIG_DEVPORT=y CONFIG_XILLYBUS=m # CONFIG_XILLYBUS_PCIE is not set # end of Character devices # CONFIG_RANDOM_TRUST_CPU is not set -# CONFIG_RANDOM_TRUST_BOOTLOADER is not set +CONFIG_RANDOM_TRUST_BOOTLOADER=y # # I2C support @@ -3752,14 +3812,14 @@ CONFIG_I2C_ALGOPCA=m CONFIG_I2C_AMD756=m CONFIG_I2C_AMD756_S4882=m CONFIG_I2C_AMD8111=m -# CONFIG_I2C_AMD_MP2 is not set +CONFIG_I2C_AMD_MP2=m CONFIG_I2C_I801=m CONFIG_I2C_ISCH=m CONFIG_I2C_ISMT=m CONFIG_I2C_PIIX4=m CONFIG_I2C_NFORCE2=m CONFIG_I2C_NFORCE2_S4985=m -# CONFIG_I2C_NVIDIA_GPU is not set +CONFIG_I2C_NVIDIA_GPU=m # CONFIG_I2C_SIS5595 is not set # CONFIG_I2C_SIS630 is not set CONFIG_I2C_SIS96X=m @@ -3813,7 +3873,9 @@ CONFIG_I2C_SLAVE=y # CONFIG_I2C_DEBUG_BUS is not set # end of I2C support -# CONFIG_I3C is not set +CONFIG_I3C=m +CONFIG_CDNS_I3C_MASTER=m +CONFIG_DW_I3C_MASTER=m # CONFIG_SPI is not set CONFIG_SPMI=m # CONFIG_HSI is not set @@ -3839,7 +3901,9 @@ CONFIG_PTP_1588_CLOCK=y CONFIG_DP83640_PHY=m # CONFIG_PTP_1588_CLOCK_INES is not set CONFIG_PTP_1588_CLOCK_KVM=m +# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set # CONFIG_PTP_1588_CLOCK_IDTCM is not set +# CONFIG_PTP_1588_CLOCK_VMW is not set # end of PTP clock support CONFIG_PINCTRL=y @@ -3850,7 +3914,7 @@ CONFIG_PINCTRL_AMD=y # CONFIG_PINCTRL_MCP23S08 is not set CONFIG_PINCTRL_BAYTRAIL=y CONFIG_PINCTRL_CHERRYVIEW=m -# CONFIG_PINCTRL_LYNXPOINT is not set +CONFIG_PINCTRL_LYNXPOINT=m CONFIG_PINCTRL_INTEL=m CONFIG_PINCTRL_BROXTON=m # CONFIG_PINCTRL_CANNONLAKE is not set @@ -3860,7 +3924,7 @@ CONFIG_PINCTRL_BROXTON=m # CONFIG_PINCTRL_ICELAKE is not set # CONFIG_PINCTRL_LEWISBURG is not set CONFIG_PINCTRL_SUNRISEPOINT=m -# CONFIG_PINCTRL_TIGERLAKE is not set +CONFIG_PINCTRL_TIGERLAKE=m CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_GPIO_ACPI=y @@ -3879,8 +3943,8 @@ CONFIG_GPIO_GENERIC_PLATFORM=y CONFIG_GPIO_ICH=m # CONFIG_GPIO_MB86S7X is not set CONFIG_GPIO_VX855=m -# CONFIG_GPIO_XILINX is not set -# CONFIG_GPIO_AMD_FCH is not set +CONFIG_GPIO_XILINX=m +CONFIG_GPIO_AMD_FCH=m # end of Memory mapped GPIO drivers # @@ -3941,7 +4005,7 @@ CONFIG_W1_MASTER_DS2490=m CONFIG_W1_MASTER_DS2482=m CONFIG_W1_MASTER_DS1WM=m CONFIG_W1_MASTER_GPIO=m -# CONFIG_W1_MASTER_SGI is not set +CONFIG_W1_MASTER_SGI=m # end of 1-wire Bus Masters # @@ -3956,7 +4020,7 @@ CONFIG_W1_SLAVE_DS2413=m CONFIG_W1_SLAVE_DS2406=m CONFIG_W1_SLAVE_DS2423=m # CONFIG_W1_SLAVE_DS2805 is not set -# CONFIG_W1_SLAVE_DS2430 is not set +CONFIG_W1_SLAVE_DS2430=m CONFIG_W1_SLAVE_DS2431=m CONFIG_W1_SLAVE_DS2433=m CONFIG_W1_SLAVE_DS2433_CRC=y @@ -3995,7 +4059,7 @@ CONFIG_BATTERY_BQ27XXX_HDQ=m # CONFIG_CHARGER_MAX8903 is not set # CONFIG_CHARGER_LP8727 is not set CONFIG_CHARGER_GPIO=m -# CONFIG_CHARGER_LT3651 is not set +CONFIG_CHARGER_LT3651=m CONFIG_CHARGER_MAX14577=m CONFIG_CHARGER_BQ2415X=m CONFIG_CHARGER_BQ24190=m @@ -4022,7 +4086,7 @@ CONFIG_SENSORS_ADM1025=m CONFIG_SENSORS_ADM1026=m CONFIG_SENSORS_ADM1029=m CONFIG_SENSORS_ADM1031=m -# CONFIG_SENSORS_ADM1177 is not set +CONFIG_SENSORS_ADM1177=m CONFIG_SENSORS_ADM9240=m CONFIG_SENSORS_ADT7X10=m CONFIG_SENSORS_ADT7410=m @@ -4030,8 +4094,9 @@ CONFIG_SENSORS_ADT7411=m CONFIG_SENSORS_ADT7462=m CONFIG_SENSORS_ADT7470=m CONFIG_SENSORS_ADT7475=m -# CONFIG_SENSORS_AS370 is not set +CONFIG_SENSORS_AS370=m CONFIG_SENSORS_ASC7621=m +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set CONFIG_SENSORS_K8TEMP=m CONFIG_SENSORS_K10TEMP=m CONFIG_SENSORS_FAM15H_POWER=m @@ -4039,7 +4104,7 @@ CONFIG_SENSORS_APPLESMC=m CONFIG_SENSORS_ASB100=m # CONFIG_SENSORS_ASPEED is not set CONFIG_SENSORS_ATXP1=m -# CONFIG_SENSORS_DRIVETEMP is not set +CONFIG_SENSORS_DRIVETEMP=m CONFIG_SENSORS_DS620=m CONFIG_SENSORS_DS1621=m CONFIG_SENSORS_DELL_SMM=m @@ -4063,7 +4128,8 @@ CONFIG_SENSORS_IT87=m CONFIG_SENSORS_POWR1220=m CONFIG_SENSORS_LINEAGE=m CONFIG_SENSORS_LTC2945=m -# CONFIG_SENSORS_LTC2947_I2C is not set +CONFIG_SENSORS_LTC2947=m +CONFIG_SENSORS_LTC2947_I2C=m # CONFIG_SENSORS_LTC2990 is not set CONFIG_SENSORS_LTC4151=m CONFIG_SENSORS_LTC4215=m @@ -4075,7 +4141,7 @@ CONFIG_SENSORS_MAX16065=m CONFIG_SENSORS_MAX1619=m CONFIG_SENSORS_MAX1668=m CONFIG_SENSORS_MAX197=m -# CONFIG_SENSORS_MAX31730 is not set +CONFIG_SENSORS_MAX31730=m # CONFIG_SENSORS_MAX6621 is not set CONFIG_SENSORS_MAX6639=m CONFIG_SENSORS_MAX6642=m @@ -4113,26 +4179,26 @@ CONFIG_SENSORS_PMBUS=m CONFIG_SENSORS_ADM1275=m # CONFIG_SENSORS_BEL_PFE is not set # CONFIG_SENSORS_IBM_CFFPS is not set -# CONFIG_SENSORS_INSPUR_IPSPS is not set +CONFIG_SENSORS_INSPUR_IPSPS=m # CONFIG_SENSORS_IR35221 is not set -# CONFIG_SENSORS_IR38064 is not set -# CONFIG_SENSORS_IRPS5401 is not set -# CONFIG_SENSORS_ISL68137 is not set +CONFIG_SENSORS_IR38064=m +CONFIG_SENSORS_IRPS5401=m +CONFIG_SENSORS_ISL68137=m CONFIG_SENSORS_LM25066=m CONFIG_SENSORS_LTC2978=m # CONFIG_SENSORS_LTC3815 is not set CONFIG_SENSORS_MAX16064=m -# CONFIG_SENSORS_MAX20730 is not set +CONFIG_SENSORS_MAX20730=m CONFIG_SENSORS_MAX20751=m # CONFIG_SENSORS_MAX31785 is not set CONFIG_SENSORS_MAX34440=m CONFIG_SENSORS_MAX8688=m -# CONFIG_SENSORS_PXE1610 is not set +CONFIG_SENSORS_PXE1610=m CONFIG_SENSORS_TPS40422=m # CONFIG_SENSORS_TPS53679 is not set CONFIG_SENSORS_UCD9000=m CONFIG_SENSORS_UCD9200=m -# CONFIG_SENSORS_XDPE122 is not set +CONFIG_SENSORS_XDPE122=m CONFIG_SENSORS_ZL6100=m CONFIG_SENSORS_SHT15=m CONFIG_SENSORS_SHT21=m @@ -4164,7 +4230,7 @@ CONFIG_SENSORS_TMP103=m # CONFIG_SENSORS_TMP108 is not set CONFIG_SENSORS_TMP401=m CONFIG_SENSORS_TMP421=m -# CONFIG_SENSORS_TMP513 is not set +CONFIG_SENSORS_TMP513=m CONFIG_SENSORS_VIA_CPUTEMP=m CONFIG_SENSORS_VIA686A=m CONFIG_SENSORS_VT1211=m @@ -4346,6 +4412,7 @@ CONFIG_LPC_SCH=m CONFIG_MFD_INTEL_LPSS=m CONFIG_MFD_INTEL_LPSS_ACPI=m CONFIG_MFD_INTEL_LPSS_PCI=m +# CONFIG_MFD_IQS62X is not set # CONFIG_MFD_JANZ_CMODIO is not set # CONFIG_MFD_KEMPLD is not set # CONFIG_MFD_88PM800 is not set @@ -4399,7 +4466,7 @@ CONFIG_IR_SHARP_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_XMP_DECODER=m # CONFIG_IR_IMON_DECODER is not set -# CONFIG_IR_RCMM_DECODER is not set +CONFIG_IR_RCMM_DECODER=m CONFIG_RC_DEVICES=y CONFIG_RC_ATI_REMOTE=m CONFIG_IR_ENE=m @@ -4418,7 +4485,7 @@ CONFIG_IR_TTUSBIR=m CONFIG_RC_LOOPBACK=m # CONFIG_IR_SERIAL is not set # CONFIG_IR_SIR is not set -# CONFIG_RC_XBOX_DVD is not set +CONFIG_RC_XBOX_DVD=m CONFIG_MEDIA_SUPPORT=m # @@ -4432,7 +4499,7 @@ CONFIG_MEDIA_SDR_SUPPORT=y # CONFIG_MEDIA_CEC_SUPPORT is not set CONFIG_MEDIA_CONTROLLER=y CONFIG_MEDIA_CONTROLLER_DVB=y -# CONFIG_MEDIA_CONTROLLER_REQUEST_API is not set +CONFIG_MEDIA_CONTROLLER_REQUEST_API=y CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2_SUBDEV_API=y CONFIG_VIDEO_V4L2=m @@ -4532,7 +4599,6 @@ CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_HDPVR=m -CONFIG_VIDEO_USBVISION=m CONFIG_VIDEO_STK1160_COMMON=m CONFIG_VIDEO_STK1160=m # CONFIG_VIDEO_GO7007 is not set @@ -5099,7 +5165,7 @@ CONFIG_DRM_AMDGPU_USERPTR=y # # ACP (Audio CoProcessor) Configuration # -# CONFIG_DRM_AMD_ACP is not set +CONFIG_DRM_AMD_ACP=y # end of ACP (Audio CoProcessor) Configuration # @@ -5107,11 +5173,11 @@ CONFIG_DRM_AMDGPU_USERPTR=y # CONFIG_DRM_AMD_DC=y CONFIG_DRM_AMD_DC_DCN=y -# CONFIG_DRM_AMD_DC_HDCP is not set +CONFIG_DRM_AMD_DC_HDCP=y # CONFIG_DEBUG_KERNEL_DC is not set # end of Display Engine Configuration -# CONFIG_HSA_AMD is not set +CONFIG_HSA_AMD=y CONFIG_DRM_NOUVEAU=m CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT=y CONFIG_NOUVEAU_DEBUG=5 @@ -5119,8 +5185,7 @@ CONFIG_NOUVEAU_DEBUG_DEFAULT=3 # CONFIG_NOUVEAU_DEBUG_MMU is not set CONFIG_DRM_NOUVEAU_BACKLIGHT=y CONFIG_DRM_I915=m -# CONFIG_DRM_I915_ALPHA_SUPPORT is not set -CONFIG_DRM_I915_FORCE_PROBE="" +CONFIG_DRM_I915_FORCE_PROBE="*" CONFIG_DRM_I915_CAPTURE_ERROR=y CONFIG_DRM_I915_COMPRESS_ERROR=y CONFIG_DRM_I915_USERPTR=y @@ -5128,7 +5193,7 @@ CONFIG_DRM_I915_GVT=y CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250 CONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500 CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 -CONFIG_DRM_I915_SPIN_REQUEST=5 +CONFIG_DRM_I915_MAX_REQUEST_BUSYWAIT=8000 CONFIG_DRM_I915_STOP_TIMEOUT=100 CONFIG_DRM_I915_TIMESLICE_DURATION=1 CONFIG_DRM_VGEM=m @@ -5163,17 +5228,17 @@ CONFIG_DRM_PANEL_BRIDGE=y # end of Display Interface Bridges # CONFIG_DRM_ETNAVIV is not set -# CONFIG_DRM_GM12U320 is not set +CONFIG_DRM_GM12U320=m # CONFIG_DRM_XEN is not set # CONFIG_DRM_VBOXVIDEO is not set CONFIG_DRM_LEGACY=y -# CONFIG_DRM_TDFX is not set -# CONFIG_DRM_R128 is not set -# CONFIG_DRM_I810 is not set -# CONFIG_DRM_MGA is not set -# CONFIG_DRM_SIS is not set +CONFIG_DRM_TDFX=m +CONFIG_DRM_R128=m +CONFIG_DRM_I810=m +CONFIG_DRM_MGA=m +CONFIG_DRM_SIS=m # CONFIG_DRM_VIA is not set -# CONFIG_DRM_SAVAGE is not set +CONFIG_DRM_SAVAGE=m CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y # @@ -5511,16 +5576,16 @@ CONFIG_HID_APPLEIR=m CONFIG_HID_AUREAL=m CONFIG_HID_BELKIN=y CONFIG_HID_BETOP_FF=m -# CONFIG_HID_BIGBEN_FF is not set +CONFIG_HID_BIGBEN_FF=m CONFIG_HID_CHERRY=y CONFIG_HID_CHICONY=y CONFIG_HID_CORSAIR=m # CONFIG_HID_COUGAR is not set -# CONFIG_HID_MACALLY is not set +CONFIG_HID_MACALLY=m CONFIG_HID_PRODIKEYS=m # CONFIG_HID_CMEDIA is not set CONFIG_HID_CP2112=m -# CONFIG_HID_CREATIVE_SB0540 is not set +CONFIG_HID_CREATIVE_SB0540=m CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=m CONFIG_DRAGONRISE_FF=y @@ -5531,6 +5596,7 @@ CONFIG_HID_ELO=m CONFIG_HID_EZKEY=y CONFIG_HID_GEMBIRD=m CONFIG_HID_GFRM=m +# CONFIG_HID_GLORIOUS is not set CONFIG_HID_HOLTEK=m CONFIG_HOLTEK_FF=y # CONFIG_HID_GOOGLE_HAMMER is not set @@ -5610,6 +5676,7 @@ CONFIG_HID_ZYDACRON=m CONFIG_HID_SENSOR_HUB=m CONFIG_HID_SENSOR_CUSTOM_SENSOR=m CONFIG_HID_ALPS=m +# CONFIG_HID_MCP2221 is not set # end of Special HID drivers # @@ -5630,7 +5697,7 @@ CONFIG_I2C_HID=m # Intel ISH HID support # CONFIG_INTEL_ISH_HID=m -# CONFIG_INTEL_ISH_FIRMWARE_DOWNLOADER is not set +CONFIG_INTEL_ISH_FIRMWARE_DOWNLOADER=m # end of Intel ISH HID support # end of HID support @@ -5727,7 +5794,9 @@ CONFIG_USB_UAS=m CONFIG_USB_MDC800=m CONFIG_USB_MICROTEK=m # CONFIG_USBIP_CORE is not set -# CONFIG_USB_CDNS3 is not set +CONFIG_USB_CDNS3=m +CONFIG_USB_CDNS3_HOST=y +CONFIG_USB_CDNS3_PCI_WRAP=m CONFIG_USB_MUSB_HDRC=m CONFIG_USB_MUSB_HOST=y @@ -5837,6 +5906,7 @@ CONFIG_USB_LCD=m CONFIG_USB_IDMOUSE=m CONFIG_USB_FTDI_ELAN=m CONFIG_USB_APPLEDISPLAY=m +# CONFIG_APPLE_MFI_FASTCHARGE is not set CONFIG_USB_SISUSBVGA=m CONFIG_USB_SISUSBVGA_CON=y CONFIG_USB_LD=m @@ -5870,7 +5940,8 @@ CONFIG_USB_ISP1301=m # CONFIG_USB_GADGET is not set # CONFIG_TYPEC is not set -# CONFIG_USB_ROLE_SWITCH is not set +CONFIG_USB_ROLE_SWITCH=m +CONFIG_USB_ROLES_INTEL_XHCI=m CONFIG_MMC=m CONFIG_MMC_BLOCK=m CONFIG_MMC_BLOCK_MINORS=8 @@ -5889,6 +5960,7 @@ CONFIG_MMC_SDHCI_ACPI=m CONFIG_MMC_SDHCI_PLTFM=m # CONFIG_MMC_SDHCI_F_SDH30 is not set CONFIG_MMC_WBSD=m +CONFIG_MMC_ALCOR=m CONFIG_MMC_TIFM_SD=m CONFIG_MMC_SDRICOH_CS=m CONFIG_MMC_CB710=m @@ -5897,6 +5969,7 @@ CONFIG_MMC_VUB300=m CONFIG_MMC_USHC=m CONFIG_MMC_USDHI6ROL0=m CONFIG_MMC_CQHCI=m +# CONFIG_MMC_HSQ is not set # CONFIG_MMC_TOSHIBA_PCI is not set # CONFIG_MMC_MTK is not set # CONFIG_MMC_SDHCI_XENON is not set @@ -5984,7 +6057,7 @@ CONFIG_LEDS_TRIGGER_TRANSIENT=m CONFIG_LEDS_TRIGGER_CAMERA=m # CONFIG_LEDS_TRIGGER_PANIC is not set # CONFIG_LEDS_TRIGGER_NETDEV is not set -# CONFIG_LEDS_TRIGGER_PATTERN is not set +CONFIG_LEDS_TRIGGER_PATTERN=m CONFIG_LEDS_TRIGGER_AUDIO=m CONFIG_ACCESSIBILITY=y CONFIG_A11Y_BRAILLE_CONSOLE=y @@ -6001,7 +6074,7 @@ CONFIG_INFINIBAND_MTHCA_DEBUG=y CONFIG_INFINIBAND_QIB=m CONFIG_INFINIBAND_QIB_DCA=y CONFIG_INFINIBAND_CXGB4=m -# CONFIG_INFINIBAND_EFA is not set +CONFIG_INFINIBAND_EFA=m # CONFIG_INFINIBAND_I40IW is not set CONFIG_MLX4_INFINIBAND=m # CONFIG_INFINIBAND_OCRDMA is not set @@ -6169,7 +6242,7 @@ CONFIG_INTEL_MIC_X100_DMA=m CONFIG_DW_DMAC_CORE=y # CONFIG_DW_DMAC is not set # CONFIG_DW_DMAC_PCI is not set -# CONFIG_DW_EDMA is not set +CONFIG_DW_EDMA=m # CONFIG_DW_EDMA_PCIE is not set CONFIG_HSU_DMA=y # CONFIG_SF_PDMA is not set @@ -6187,6 +6260,7 @@ CONFIG_DMA_ENGINE_RAID=y CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set # CONFIG_UDMABUF is not set +# CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_SELFTESTS is not set # CONFIG_DMABUF_HEAPS is not set # end of DMABUF options @@ -6236,6 +6310,15 @@ CONFIG_VIRTIO_BALLOON=m CONFIG_VIRTIO_INPUT=m CONFIG_VIRTIO_MMIO=m # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set +# CONFIG_VDPA is not set +CONFIG_VHOST_IOTLB=m +CONFIG_VHOST_DPN=y +CONFIG_VHOST=m +CONFIG_VHOST_MENU=y +CONFIG_VHOST_NET=m +CONFIG_VHOST_SCSI=m +CONFIG_VHOST_VSOCK=m +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set # # Microsoft Hyper-V guest support @@ -6305,6 +6388,7 @@ CONFIG_STAGING_MEDIA=y # # soc_camera sensor drivers # +CONFIG_VIDEO_USBVISION=m # # Android @@ -6320,13 +6404,7 @@ CONFIG_FWTTY_MAX_CARD_PORTS=32 # CONFIG_GS_FPGABOOT is not set CONFIG_UNISYSSPAR=y # CONFIG_WILC1000_SDIO is not set -CONFIG_MOST=m -# CONFIG_MOST_CDEV is not set -# CONFIG_MOST_NET is not set -# CONFIG_MOST_SOUND is not set -# CONFIG_MOST_VIDEO is not set -# CONFIG_MOST_I2C is not set -# CONFIG_MOST_USB is not set +# CONFIG_MOST_COMPONENTS is not set CONFIG_KS7010=m CONFIG_GREYBUS_AUDIO=m CONFIG_GREYBUS_BOOTROM=m @@ -6353,45 +6431,44 @@ CONFIG_GREYBUS_USB=m # CONFIG_FIELDBUS_DEV is not set # CONFIG_KPC2000 is not set -CONFIG_USB_WUSB=m -CONFIG_USB_WUSB_CBAF=m -# CONFIG_USB_WUSB_CBAF_DEBUG is not set -CONFIG_USB_WHCI_HCD=m -CONFIG_USB_HWA_HCD=m -CONFIG_UWB=m -CONFIG_UWB_HWA=m -CONFIG_UWB_WHCI=m -CONFIG_UWB_I1480U=m CONFIG_QLGE=m -# CONFIG_NET_VENDOR_HP is not set # CONFIG_WFX is not set CONFIG_X86_PLATFORM_DEVICES=y -CONFIG_ACER_WMI=m -# CONFIG_ACER_WIRELESS is not set -CONFIG_ACERHDF=m +CONFIG_ACPI_WMI=m +CONFIG_WMI_BMOF=m CONFIG_ALIENWARE_WMI=m +# CONFIG_HUAWEI_WMI is not set +# CONFIG_INTEL_WMI_THUNDERBOLT is not set +CONFIG_MXM_WMI=m +# CONFIG_PEAQ_WMI is not set +# CONFIG_XIAOMI_WMI is not set +CONFIG_ACERHDF=m +# CONFIG_ACER_WIRELESS is not set +CONFIG_ACER_WMI=m +CONFIG_APPLE_GMUX=m CONFIG_ASUS_LAPTOP=m +# CONFIG_ASUS_WIRELESS is not set +CONFIG_ASUS_WMI=m +CONFIG_ASUS_NB_WMI=m +CONFIG_EEEPC_LAPTOP=m +CONFIG_EEEPC_WMI=m CONFIG_DCDBAS=m # CONFIG_DELL_SMBIOS is not set -CONFIG_DELL_WMI_AIO=m -# CONFIG_DELL_WMI_LED is not set -CONFIG_DELL_SMO8800=m # CONFIG_DELL_RBTN is not set CONFIG_DELL_RBU=m +CONFIG_DELL_SMO8800=m +CONFIG_DELL_WMI_AIO=m +# CONFIG_DELL_WMI_LED is not set +CONFIG_AMILO_RFKILL=m CONFIG_FUJITSU_LAPTOP=m CONFIG_FUJITSU_TABLET=m -CONFIG_AMILO_RFKILL=m # CONFIG_GPD_POCKET_FAN is not set CONFIG_HP_ACCEL=m CONFIG_HP_WIRELESS=m CONFIG_HP_WMI=m -# CONFIG_LG_LAPTOP is not set -CONFIG_MSI_LAPTOP=m -CONFIG_PANASONIC_LAPTOP=m -CONFIG_COMPAL_LAPTOP=m -CONFIG_SONY_LAPTOP=m -CONFIG_SONYPI_COMPAT=y +# CONFIG_IBM_RTL is not set CONFIG_IDEAPAD_LAPTOP=m +CONFIG_SENSORS_HDAPS=m CONFIG_THINKPAD_ACPI=m CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y # CONFIG_THINKPAD_ACPI_DEBUGFACILITIES is not set @@ -6399,48 +6476,36 @@ CONFIG_THINKPAD_ACPI_ALSA_SUPPORT=y # CONFIG_THINKPAD_ACPI_UNSAFE_LEDS is not set CONFIG_THINKPAD_ACPI_VIDEO=y CONFIG_THINKPAD_ACPI_HOTKEY_POLL=y -CONFIG_SENSORS_HDAPS=m +# CONFIG_INTEL_ATOMISP2_PM is not set +# CONFIG_INTEL_HID_EVENT is not set +# CONFIG_INTEL_INT0002_VGPIO is not set CONFIG_INTEL_MENLOW=m -CONFIG_EEEPC_LAPTOP=m -CONFIG_ASUS_WMI=m -CONFIG_ASUS_NB_WMI=m -CONFIG_EEEPC_WMI=m -# CONFIG_ASUS_WIRELESS is not set -CONFIG_ACPI_WMI=m -CONFIG_WMI_BMOF=m -# CONFIG_INTEL_WMI_THUNDERBOLT is not set -# CONFIG_XIAOMI_WMI is not set +CONFIG_INTEL_OAKTRAIL=m +CONFIG_INTEL_VBTN=m +# CONFIG_SURFACE_3_BUTTON is not set +# CONFIG_SURFACE_3_POWER_OPREGION is not set +CONFIG_SURFACE_PRO3_BUTTON=m +CONFIG_MSI_LAPTOP=m CONFIG_MSI_WMI=m -# CONFIG_PEAQ_WMI is not set -CONFIG_TOPSTAR_LAPTOP=m +# CONFIG_PCENGINES_APU2 is not set +CONFIG_SAMSUNG_LAPTOP=m +CONFIG_SAMSUNG_Q10=m CONFIG_TOSHIBA_BT_RFKILL=m CONFIG_TOSHIBA_HAPS=m CONFIG_TOSHIBA_WMI=m CONFIG_ACPI_CMPC=m -# CONFIG_INTEL_INT0002_VGPIO is not set -# CONFIG_INTEL_HID_EVENT is not set -CONFIG_INTEL_VBTN=m +CONFIG_COMPAL_LAPTOP=m +# CONFIG_LG_LAPTOP is not set +CONFIG_PANASONIC_LAPTOP=m +CONFIG_SONY_LAPTOP=m +CONFIG_SONYPI_COMPAT=y +# CONFIG_SYSTEM76_ACPI is not set +CONFIG_TOPSTAR_LAPTOP=m +# CONFIG_I2C_MULTI_INSTANTIATE is not set +# CONFIG_MLX_PLATFORM is not set CONFIG_INTEL_IPS=m -# CONFIG_INTEL_PMC_CORE is not set -# CONFIG_IBM_RTL is not set -CONFIG_SAMSUNG_LAPTOP=m -CONFIG_MXM_WMI=m -CONFIG_INTEL_OAKTRAIL=m -CONFIG_SAMSUNG_Q10=m -CONFIG_APPLE_GMUX=m CONFIG_INTEL_RST=m # CONFIG_INTEL_SMARTCONNECT is not set -# CONFIG_INTEL_PMC_IPC is not set -CONFIG_SURFACE_PRO3_BUTTON=m -# CONFIG_SURFACE_3_BUTTON is not set -# CONFIG_INTEL_PUNIT_IPC is not set -# CONFIG_MLX_PLATFORM is not set -# CONFIG_INTEL_TURBO_MAX_3 is not set -# CONFIG_I2C_MULTI_INSTANTIATE is not set -# CONFIG_INTEL_ATOMISP2_PM is not set -# CONFIG_HUAWEI_WMI is not set -# CONFIG_PCENGINES_APU2 is not set -# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set # # Intel Speed Select Technology interface support @@ -6448,7 +6513,11 @@ CONFIG_SURFACE_PRO3_BUTTON=m # CONFIG_INTEL_SPEED_SELECT_INTERFACE is not set # end of Intel Speed Select Technology interface support -# CONFIG_SYSTEM76_ACPI is not set +# CONFIG_INTEL_TURBO_MAX_3 is not set +# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set +# CONFIG_INTEL_PMC_CORE is not set +# CONFIG_INTEL_PMC_IPC is not set +# CONFIG_INTEL_PUNIT_IPC is not set CONFIG_PMC_ATOM=y CONFIG_MFD_CROS_EC=m CONFIG_CHROME_PLATFORMS=y @@ -6466,6 +6535,7 @@ CONFIG_CROS_EC_LIGHTBAR=m CONFIG_CROS_EC_DEBUGFS=m CONFIG_CROS_EC_SENSORHUB=m CONFIG_CROS_EC_SYSFS=m +CONFIG_CROS_USBPD_NOTIFY=m # CONFIG_WILCO_EC is not set # CONFIG_MELLANOX_PLATFORM is not set CONFIG_CLKDEV_LOOKUP=y @@ -6708,13 +6778,21 @@ CONFIG_FPGA=m # CONFIG_FPGA_MGR_ALTERA_CVP is not set # CONFIG_FPGA_BRIDGE is not set # CONFIG_FPGA_DFL is not set -# CONFIG_TEE is not set +CONFIG_TEE=m + +# +# TEE drivers +# +CONFIG_AMDTEE=m +# end of TEE drivers + CONFIG_PM_OPP=y # CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set # CONFIG_INTERCONNECT is not set # CONFIG_COUNTER is not set +CONFIG_MOST=m # end of Device Drivers # @@ -6884,6 +6962,7 @@ CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y # CONFIG_PROC_CHILDREN is not set CONFIG_PROC_PID_ARCH_STATUS=y +CONFIG_PROC_CPU_RESCTRL=y CONFIG_KERNFS=y CONFIG_SYSFS=y CONFIG_TMPFS=y @@ -7124,10 +7203,11 @@ CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set CONFIG_INTEGRITY_AUDIT=y # CONFIG_IMA is not set +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set # CONFIG_EVM is not set CONFIG_DEFAULT_SECURITY_APPARMOR=y # CONFIG_DEFAULT_SECURITY_DAC is not set -CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,apparmor,selinux,smack,tomoyo" +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,apparmor,selinux,smack,tomoyo,bpf" # # Kernel hardening options @@ -7137,7 +7217,7 @@ CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity,apparmor,selinux,smack,tom # Memory initialization # CONFIG_INIT_STACK_NONE=y -CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set # CONFIG_INIT_ON_FREE_DEFAULT_ON is not set # end of Memory initialization # end of Kernel hardening options @@ -7194,7 +7274,7 @@ CONFIG_CRYPTO_ECC=m CONFIG_CRYPTO_ECDH=m # CONFIG_CRYPTO_ECRDSA is not set # CONFIG_CRYPTO_CURVE25519 is not set -# CONFIG_CRYPTO_CURVE25519_X86 is not set +CONFIG_CRYPTO_CURVE25519_X86=m # # Authenticated Encryption with Associated Data @@ -7243,7 +7323,7 @@ CONFIG_CRYPTO_CRC32_PCLMUL=m CONFIG_CRYPTO_XXHASH=m CONFIG_CRYPTO_BLAKE2B=m # CONFIG_CRYPTO_BLAKE2S is not set -# CONFIG_CRYPTO_BLAKE2S_X86 is not set +CONFIG_CRYPTO_BLAKE2S_X86=m CONFIG_CRYPTO_CRCT10DIF=y # CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set CONFIG_CRYPTO_GHASH=m @@ -7342,17 +7422,21 @@ CONFIG_CRYPTO_HASH_INFO=y # CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m -# CONFIG_CRYPTO_LIB_BLAKE2S is not set +CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S=m +CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC=m +CONFIG_CRYPTO_LIB_BLAKE2S=m CONFIG_CRYPTO_ARCH_HAVE_LIB_CHACHA=m CONFIG_CRYPTO_LIB_CHACHA_GENERIC=m -# CONFIG_CRYPTO_LIB_CHACHA is not set -# CONFIG_CRYPTO_LIB_CURVE25519 is not set +CONFIG_CRYPTO_LIB_CHACHA=m +CONFIG_CRYPTO_ARCH_HAVE_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=m +CONFIG_CRYPTO_LIB_CURVE25519=m CONFIG_CRYPTO_LIB_DES=m CONFIG_CRYPTO_LIB_POLY1305_RSIZE=11 CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m -# CONFIG_CRYPTO_LIB_POLY1305 is not set -# CONFIG_CRYPTO_LIB_CHACHA20POLY1305 is not set +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA256=y CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_PADLOCK=m @@ -7461,6 +7545,8 @@ CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=m CONFIG_REED_SOLOMON_ENC8=y CONFIG_REED_SOLOMON_DEC8=y +CONFIG_REED_SOLOMON_DEC16=y +CONFIG_BCH=m CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=m CONFIG_TEXTSEARCH_BM=m @@ -7535,7 +7621,6 @@ CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=2048 CONFIG_STRIP_ASM_SYMS=y # CONFIG_HEADERS_INSTALL is not set -CONFIG_OPTIMIZE_INLINING=y CONFIG_DEBUG_SECTION_MISMATCH=y CONFIG_SECTION_MISMATCH_WARN_ONLY=y CONFIG_STACK_VALIDATION=y @@ -7547,11 +7632,11 @@ CONFIG_STACK_VALIDATION=y CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" CONFIG_DEBUG_FS=y CONFIG_HAVE_ARCH_KGDB=y CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set -CONFIG_UBSAN_ALIGNMENT=y # end of Generic Kernel Debugging Instruments # CONFIG_DEBUG_KERNEL is not set @@ -7580,6 +7665,7 @@ CONFIG_KASAN_STACK=1 CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_PANIC_TIMEOUT=0 CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y +# CONFIG_TEST_LOCKUP is not set # end of Debug Oops, Lockups and Hangs # @@ -7709,6 +7795,7 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set +# CONFIG_TEST_MIN_HEAP is not set # CONFIG_TEST_SORT is not set # CONFIG_REED_SOLOMON_TEST is not set CONFIG_ATOMIC64_SELFTEST=y diff --git a/kernel/kernel/files/patches/linux/patch-5.7.13.xz b/kernel/kernel/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 z+|7!%FzIWZB*=bpq!NoK>J+JVhLd*PrL{&G^WzN$$C05xeOZ~jAUi&`tJa1ZC!&(n zl#mB4?(pR2JjfHh^?Q^2=H|XP>Ekg)XuBcusvXyH&Xa<`&KVh{s zz8p?QByCuMPjN^Z$`XVgZNP#!iyOXJW3EuR@{uag^A^x?|UdrSo%vIuvMvu!DN>+ehkC$)BzI`;i@liFv%ZQj^^+4tN$a6k9GnU>u$)8ZA#nr; ztWKKhlXyRadCt3X95*lcbq#0b5S%`&=@@u_WbHkn6+@O(9LkEcbcUTnyTAe2B$dHy zy z^b$<%$>at&7E#wbvtruR+Y{-g6@r2b02||c8LD2MS`d$&K04QQ015UH`V1=!vOM-3 zQl&d5uK;7FH@+`+PpLYG;1hO@M!rQ1xRjYf<*pQ=E z)>jz^ZbmH27PhQGtRCG5?S%J%(7Pp94$h>LG6C)uor_kIa(Tz49M>NTYSQSRdeZml zKO~11*mYf^xEd#eg7kB!4`H>oc*6ZAjsxdF!d9T!JMoRaBQ*TDnezlSxrzb5xmF>4 zfuFA4ed?iWu0Zq#Jp_!P;c%S%=?X{XD?@1I>d*uVZHfDqKJsSx0Pr46OMruU1TpYl zU(e(Ln3T{;05?F$zYlp=i1FMhs1%hD#b%d;4wKCN*8%seq|H6+vVn=FLoPFLOjG*W zHahu+nuH?v@q{1Z%t87Sas>jv?o!{9ZZ;Q@r%=3tZ@z)V8h%>k)$l}=rWLBEGc|X) zfz)TAi(D_4Lw)QK0+%vt*c)0c`dm}fXB@j9zFPDs)iY{k2@ZqwI?}}-WnNQrVr_jR z#OFWmK|UrVe2MJlnN+mCc9xzX*#=toFJaxPt#hv$fRf~E!Q!3pkjQm}ilE?8JiFLY zGJvB@_u)u~0JX$a_x8Pr_w~#>x3M%h3}Ie_%K|%K_mo73N{yj|Y;$fLRu>>vopBJS z7v13(tchc%sX)}%zjjK3LZCOs&~l-do@n7y(_-te!Zj1T8~+{!m*o*anGhzou~p!q zq1P%?JWDZ`grObiCY{00toF~$ZfJ8^WJfi_c_w$;x(ucv17TSrpz!w}IIwQ7JrfXc z1F=xeNNy{s2H;IWVz=od#TbP9NNM^y!ME-h_B1*gk5$*KYnegkn4Qmj#_QeBaif1mJ3_zUNsi{N_EYe`k zVJzF_;3WQ^ye8sce9A6RZ}_M?EXJf_eJCQxS^A1zv-1M~t9`F*aGA`&&4=ek;$cP> zs(CYUu5S~q5y;%79D+nFCU2%aqw*kpiKnJA!Gf0gR6IwIKS<32EczoB1NffbXk{p6RLn{ja zYd-mU4=%mzQdUSQ#`zn_I_hnA5`#i}{FS(rqu|I%yrS=9ZzNn5Mwz_ej!T_bBHXYV zjKX<*?d9{QB?@;8 zKDBPKY|CWL={N% z)D=oq7vmd{O_Qc_p=UVci{C{nOFIH28TI={@2`t71hs-?!PJ(NR5=J@3&4jwvp-g> zO<06!nRqt}f}XceQX?ut+_k&;RhLZx?VBn*@OS<)G6vIF#>nIBWd)kk7-{CG z)!Y9G=`zfedx=7GkWb8*C25SdBNfR#-PSuT8N*!2I_F_SV9dix-XShCFuiqLB2a>u zEkET%;FBDa?2KaO5s~>Gs`QS#Sn*_2bXBi@TRaV?R4M1xxgd#9tGuu5>bY=+!tiJt z>-;PsQ}(}{vbxz`mdHM_&Q4Fw=S4opcqgvTvR7S;zVP|Y$bK&IqSZ0B3O*Ww-L&RE zdn*e#Wz~^9KO$yGdWr zEtM^vN?%(!Qe3NuTR5uwXltnv7Zu%Y-vavI657X`ug)O6wbjq4G!LiF; zZt_#mTLo(`s;}Bu!9^blUj5I}2iXP7H){vb1vauBS_INloURA;5_MB{o!|RnSfVVO zl-;&E4tI^bEeDRB8+DW|-P<+*#UW z0^$h%HQQbEB(^HLC|!^llTQ1_i!nu{vnb`#OPI#J)+SahJ_RB_u3d0Us!x~3^>bK% zMh5UL0(n26(?$)*#0vIUvuo1cf8Vzj zEc*UUP-^2I6)YS!wV~+LjwN!bbRd{UK*let)&E%d4=sJXfW;c5%#EypvBYd%o1ec6 zH5_!Xe6wSqRf$Y)go|b~G+j=;*zB*R2KCaHXRomOE)g-B2Ti44glQoW;-y9QN?Nyy zYCc(0t6@J{IDfHL3K>@{<-6ZP&^WMIQOaXfQ_Q&qdBrUBF zO>%06#oC7`0wt-K_4fBSQ7e|bmz;@lR_bKraR{JP&yd_2e}T5<)x9A!Cs5BrGvTq}e(b(;G?e%JrlT-8 ze;UR8O`F;aZkYtpb!?gWJa#3zPj|oz=2{c}{Px>WL(k=3cT+UWUrcO*zwCx39<2s? zFf#ozW>DgT$Y%q-Yach_Tu7!xwtdj>5s+Sb$h1&P@eJpAfE`@H{l4 z8guSUShw#+n52w?u&NCB+LnJ@9a$=@4_j)<{hUoo4;i1}vp7Tiro!|DQ{SRPynBj{vWg#Ap7)3a_72;2N}f2A!R^FXGBIkKk2^~Qg=+iXS1 zCVs=9ppnqEHK8V4*tqaC@yjEW-b>0zeh$NoIKI;h8B+<;J_LmmM&nX?dRXH2Rvce6 z&FsU{PhIpvR%DEn=EKJaO8rdjrnFG!0`|Dwa$?(QiH<)n&9=01Z2jZ>J#*VA+)Lpb zAaF>t4l-5IeM~YvcJ#3e>c_Ifz%7+ZzsSw_Ky2}63ML4?1Lbw!g|;}TUlSCb#zG-l zy@aazN*eYE;tSm257td5ua6iBR+y35eYWvkejQA%HnB;p(-oG?Vd%w$4_3wmzpO+w=i=ZPT#MZ z6aXV0XC$273Zlt@l>%o$ANLMccm;*z|5geZwuh&b{qhIV< z#6j8vD|_sKXZN#zJDR1g+VSGuI_UTQn5bGms5*&*3%y?^(UK$8=-qK`tTVK&oITCd z=WsTVh8Ke$-4NGvUZ}AOs+m@So}jz=Q#DEWorv#J^h-pVVZU4>_q`k3-C04w;L)17 zf0N*lO@Na`3VSASF^XnpxM$OgGS-u3nlSAyAxb$Lc}u-qLi0N6XbcqcvXm`XPjw!` zE@rB-c>7_GSV9NPWB63h1@prTz`n{#v|Yd#^i68?B>bt~QFJ6d=lf%%S(h|9w|r4d z7}U#l6WlatkL1L2`Op!%vM7z#fNdxA9VJ1I?6f#UA_J|U;U?r_Vqxx*8dL^-T4LL_ z%Xl`q;ayYln15Yjn#Ihr3d;>BFB&^`6A;ih8+gWy1%1-QRo33NU1D^L`j zT`u>4w|28>Wepp1&nZig6ZIy694|x6)~ykkZ@E;ViE|RkrWyd9>_PZ-l4HaSixv@s zZ)2DyJ}+fDc@!zXouB7@pqE9voi#n)XKDEHe(k1;>9;+`xewOypwu+z(>x+CR~vBeH_}m4?ZPgD%!H!e z9yC}QjGPmcFWUDrYfeQ4g&oeP)rv-)Jp`3qaKQ4N|0vg)UfgwChF9^iYHB()A4t^F;pe5cV{e9-_Wnbk_#V=>n3P&T~zX zw4&DFFL`L6lmme;akER=^#BOZ_S(z8zqO06V)3+pVWjSwg2aYjFZ-ItbpElA2hcT& z_I0zT9$VUQbq^Kma$&4p@2|2j0QF@NFabCeu~~q+0KuE>K{@zCeZWF_p-l#inhBC4 z+Uu8Mn=3v*MVVaNBsro1=m!aRbp@*?_2~Y{;jx%vDK+B>kN{Z!bdQnBs=fzw)eQ12 zqR(956u;>c4zq|q<7WBXKjxjXp=T9%721=2gs1+gDw+QtlUXi(xD zCB6XUMq~Yp*z|C0>7turrv#r?J}lD^;j-eDRDnJKBsv><@vB5fRpL>6OqEA?24kyj zCz2oO`8_2t9;Z&9PY2gk`t=aIEdzTY$$BOqxXP_T8T{wb%c1t)wTE7~BnQz7uQ?zu z4}O{_S|3W?ZS-i~L(g9fRL)=bsLI4=-?6R-9F)Z4aN(y%6bD_Fki+=C))``p!Tbp4 zXbhQ8n@;{G6dG#ddklN*s&oL(?HfpOhB^<-pY4gyH^PjUB2)&rH4{t1ISZLN_a zx2`%JFqBcOPUB<>SVj+o17#h*jc|z5kI4GrrwFKpt9!x9UaKc_^kFt|1S8-+H}S;2 zlNJ?qUgQRUR3d*4wO(hE54&b7`I0inm*LSFB5AYVX!GyAMPI)SmMU$+Z;C#6##0^t32M!Zu3NOf-CM5WCXpmKlHwk@ru z<``t1Vsm7LRhB&4lVtzmZdMoi;abDX2d~zWy*J)}@PSY6)89Nnn&z?yVU0|2E?xZR zH5Qzw?6J-92;y~*?=gv|BAAW(FS(~Z_nhD8W8qr~ogEFYnQ|T2o~DwhXRC}dqDonJxiP4MCbMZxe2^kjR3%_jbmD{*1ufa#u`aRALV=(k)V3mPu8xY zZD+tCX>SjRXAFZb440k-{*-s43x4-b1VbP+s6yFq^fG-5HG-ZO=Z$Q#&Fg72)*ws{ zH7EnMPXTlHrwAEZ^ZoKzRN1r|@rbhK8}5lpA0N3E(ay0x9L$#*2Nn~K!%*2(M$&yX zx9EZbyPO7w6v)+9QI}NmK|I}|zA3sUy3daSHl7vxc>6b^3Pq1_4P<8RA4y8~FXYwe^cCr-PRuSEWv#mreYBgT>V@IzLN zc>81^I(GeLPSZFao^e|l&>V{RNoRt`<7ZA=vD|71jfLN{dj~*1t;iRuTwrdB2VFhB zKjx@;L_ux0q}nB@0k{Y7kg!@1xK@oc(^{?7tfw)nCZj%_wvkaE>H;S3RuJe1IYI4Q zKW9t0Os2-NTuE*%xz4he)sBe_rNt*QQld%AI*LBtpey^7?2})~Wfu_*GFs15kyFXV zm_ztjQT_cFDZuTB+oQ>XWKj?$)q^@I2JAUMcY#6XV8?q@HZL$_}~!+yTMK0ph?ya{3t4gt(fY&7e0k z9&Gc(jBhhCN9Dv*eO@1eq6}12tzo;7kG*s%!Rpl$chD#A0S>sq-M_7j`VT=WP2d)* z>ppi=dB#cM!u)9SBL(nVcOtTB&O>qR7RDya46CpX<3~5~u$Ru0J|4;ArV}k*+yBH9 zF+W+u7Nfs<7COQc!5Omu!srcH@V|QBY$I{AZ)5>x3#}WoL8sP*7*_~*4olhjl-GB_ zDAZ`hE$UeYFB4$kx)S7kUIISbGKg?TzHe5DPZhzaVt!ced|JP2v>&y*6#s+6^5=Ngt5J*X8aVJ}U-+CEE@>0acdfkZ^oZv_2N>hoE z?1lV9#ue0!iDy-S)i5MUKw)VvDBv5A@{Ib|5%x*Iv`H#{aqTf!OOGJ42r5t+WKc;G zmQI9mdm1(LW~h%|FvV(P=E2X;IU9rJitnj{HL}w5=&!)P<*CSFT@C@f*b+roJom(! zs0DW`+S!SeE$BJQxBr9d-hVv@DZ(AS-P=w}D`4{b*ngU?N%Cr(G+E%rMy)ji00@6h zis$m+o>nL=c%;VE&ig4CQzZ)x`bLPwf*Z8L4Hg{lnGrcYa2;YLx$Di+lIb;GYTGL2 zW;?Z>E0Bjo2b^o~OFTMXWPfeb#g(zac!=b17={~a6|z=VIF$5^XAs-)Sx4ypEqoIA zaJW+8;U64UsCh(akKSxk$bF$Knhk=zYZ@v@(-Fqw%075{+f-a&kUxdgdJ%m&N#UsP{xOQz zB6IxXLJ;DGpqUv=<+0JQRDmXa-(O>m3d>>Ksj;GYzq67c^g&)l3Em5{=R1j2+{w%r zdKlD_&N>l&k+Qf>5{?GeyepKOaWl6$1jjX4KR2QuA~hiHmXWd8&p>o73jDn)*94o( z3HKP*yp`tcXsPYfn|ExUgdKEga%5J5{ zu$#uxPJ8s_nJ(%BRuhM=#23Yw#>!uQgD^Jvl1+X1kka`zqH4}Q}_8Fli zjq*{4Ks!U?mbuE5)m*@ecQvzd;2Nqh&i0WeV93EJm#+ekUe@sjB?*o~$@*?YJhXrfJg@E$t4Z+DTS}BCl5nI=8LW{D zVkV+z{uLsN-)ug!8_Wy&?-K9dBs^FxkJCZ$>j{mKeQaWm;u|$1AZe4P2Nkr34CqZl zo0Dn}8^Y;yuaXhl5S8a*u=fM3HGEVE+j@!muVapFsmHC8ReqKP3OJRo6AI`JLCYnQ zuc`?TZCY{9S7Un+a(|LN1iR+U!9h>v#q4@E6~G8!M!XY`PG*rOjCZqd$M@!R_%}qM zs5(yl_Boqbc~BTp{tmPmcfITIn18>^DKU;%GlGun9yNcjO*P(;oE*=&Y1oAbmp)w) zBtTlTmKx*<{RO0V)z;m&l*f{M}NPZ%PC9(AF zJ`2D%USP7I()|tae#-OEQTssQ@-s~f^VS}Z=mQ?pB*{*ALa0%FA_}}dAOtShkFK@v z%d%0~3>ek9e#knN_(4aUGbr~}Q+N73f0LF=*#>78J_FwnL3fD3npO@@Fr9Rb98wTz zxY^NbTWv|EU8cN;YAT6V{~qFb(fdX(yly{&Y9Jxpytm8xJdyT*)BDU)#}uO*dVvSD zZ}7fVq(C$N%%&%_Fl|~}I`MMCspCkgiCZ4P1hMkB{rko7-uNb?#SC*M<>0%XnKV_I zZ#u9*3^v&$oggHFR*c00AZ&%L)YkcaW~#qq-Ku?rrEr`Jy`b zTnL+-IEmHRsTn}R_}Ux$_qUvFE5g0>tB*;EO8rUbq&e;NDlBx4R9Fp!!q_1B+Fy_xkE898gtbM3LQ$q*4PZel^`pA?AuAfFP z^MZ1&IE@`gmzxr?HI;(vkJz;o2)lG0YHXRV#%ib9FNKtPpuQ)IBY#-9T2OLvx5v}_ znEhBG=K$B6*AAOC0Zm`t7AVXpyMNi0vPv2RBgktZ45WG}qX&(5|1aR%0vMt|W7H^) z`K{Pr0cc>LPuo-^N#~xp76&irsCDkn(lMlBwQ^HUwGHKYYstTUSkNW5@Jv_GtvYy# zUn8P<1Zko1xV__j5szai8X%h3A8?N)T|m!aSEA%?k$idXvLi*>w9J&u{U*NMPjZST z9tM4+scR$JF0b&lUKFUB)1f0VQxr7`f*5&Towf#VVs#Pt_r2$E2q^FAH=hM)ji;o` zkzi^MOwlo2z1S0R2AT&%jyU4p75H(URBqn|Xh`*|H_bP_8usS!xgZ2N1(GF0LdxkS z;4e0FNL$pd{@nVh@~W1^U^V8vEQNYhs_|R2-PY!2F-7R@FP)q}l9FIhs44^0s-WKO zN+StqEDgpVPVX{^y$~Z_8>Pa+!<`V7jlUtu~+ z^+L;J=^W_tA#V<4TW`&7NhJRKQeS+E=PTn2Jg0F<5IMdSyY{Lwl5c0pf+pCw6qj^* zMRqRDyD(EZ3qDEf5^?26(XOm~S&5H^u+G$>(E;apX{?v$N=oL*s7wxpG zAD=BwcL8kGJQE^iU&6w}3A5Il%D(zvBfLeS3&2nO!H7TrL5=5{AUkW8PS+Iff~dCh z`k;d#8hl`!v;N+uA=Y zFJgpiacAQm7J92^QEg+XZnSRf&8Efd1mp|#g)$&Z8|{Mf8;o$7=e5~F9uK8r4OE@a ze_%+g6{VvULwrH2;>lj~#!L(7^aoIkq`VPSs$lYh((M^r-Zhu7Cel%PO4a3TEv!~a zP3Noh+Lb!eg?aHAI^}rM9FyJ)77dYWFYn1w;6 z=g11A4G78pdMS?Ebq5jI#QtxJ4S*pIOTsH$)JF>M^Q~G_J||v8ot_c^Y{k$5)WHJH zdHt8(yF|76SAI_X_H2>g>FP`p*)}n$jKDfZPw%!@s+HgV_pE#_`vg(r7Qz~S%L+i8+l@B#0FVAC%M5mah z-j+~kg`egik-dgQ$*J#YNX#sKwfQ+hn%0%81X$=}0Ke!6R!gzCTSK&1iF|gXNx4yD z%2h%SLs5twjp8)%EemJ+fWmXYg4@%$YOwTH~3_&K(ma3yfrW=oWD2G{!Oz(ReT#Vg6tgW>E12u9Ad7%H3u2} zvYE|2Z=*+I=)Ro`fs*!r5+vj!rLD zF&M#l#!ILUV?eJKFgyklPqF}KDFWYhj)%yy_V?^o6o@uyEcbCIpX9mluf$0*T8aQ+ zTx5+P6y=&3AJFTzK+&M!gq(uyU9+ORD!#N$Q*^Ts@}{Nj4fpehf-__t4FE}`w4E2w zJ?Ew~7Oz0lmBr$;kdy8L3J}RMe3TOeqQRip8%c!!)A4E~HqOs3-ZfFS(u>kpb3wST zzAAQU&5jAoiwn)x-UgN3H=7V&>^-WKMn~|f560Q!tlBWQsOF$IrNm6?C^0x!63G9E zlC<#}OU4Z7BO1cAvfbfut{^=1+ftKJI#=IiCQ5L8-+#5Mk|3l{Tp~_o*T|6+X`Nm{Ow^i* zXl?Br_y=@b1cRuLV5S%z3BF5)GHl|m zlZI$knCQs;+mu0{01I297@5f2v z05U)t#n5h1k9=^bp}oe|%aaWB5vvtY_FdT^GLi5>6@H9ogkqte+A^k9;!6&}EW!q( zU)Nl`&y|bFNh62LSzzZEaRfhV+L7mV%}{0PT74AB&$QoPpFpJkZI7VDU-x*%bjZRN zJ%gE~%mAr}J#IQ*qE3*f*YN?jj#>zjX6R0AJ4G2^DDyc)RX28yO8{mm++p=rLP%1| zf@lHV0cMtl^duA`{r(v?sCX5Fe!?; zwX(W1Jgi{cw*tyHC{)UxKF*WOUemvNG<-*@-01XO@Pvx?E#7~_h>o_SChw}wspuT# zmPCsqcDeD;gG-^0Av57bp#5-}uf^#M4E5mkA$yt4L*}2uxY!sJ*E7mY?U2Rab}qBT zkV$X2yYBzrTQRw-cnvfeTTH`XMGr0r&gOXwVboF%ss(liYuEJMKQb|*XE^@gA}I$& z-e@$p6ng6e1n7{RHh_`-4#uyVZ9kTf53W6N)8*)tlDW-O2cd`|}SzEhX1m z;o1@A5#eIY$n&g3MMdK0k_S>c)(d!tj%(Q1!)i6FJvc>IkJZ`&xYffx?O|aEt z<_b!S4_sXHUi|3!@n>QEOI+50ClQgbVpifz3L`jr1=s!t?uFlShhoKY(87P}-lkN_VC-)Bn$KtrstVV&q|D=`qWd5U~ZAm2@aX~uIBprdMC?{RIq8~$$Zx3Cdhk7ibcXty zgwxIL?6nh-`AuWM(+V%w5i3xXdJLljiy+FKQ8&)d-(kCGB_F?jTTNBvhC~awp~J9g z%d8(Om)!fciX&`bOG?&2-|-gx0xgVpM{43byL^Jb@bHPdQ$hpuY4?e`wn+CIaE zVDUdMK+PK{N5lNBvU~1{ufz>PfN>s&=?yxy@`0e&u&>u4&*Z1MFvr(gv*qM)^M&Gc zNxpD3MLzhnrRZcth}cnrjPb!B3S5m(6o>P7hmk;nO^*K*C5V;uz{q?%agz1kV;4+5 z>|*b7kwOPStR+Y>zg{t84C}IfyYlajR5=c<=8LLFgfxmPs%?AciwTONrK^;UtScgc zL7aUR?#oG}0gXUnP6!s2=iSWZ9D;-&mS68yFh`9^6`IIpEeLHR0+}KQNFFJiHdzmv zw4{4U=XqTWK*)|c`;NAApf*Zx6EC{~nOs76Jx=B1Sc?WRL7Bk+oqQ2TsI9;QdD4gN zPLjl*y+AcJoD(O=vHB(?}?F$k4ZPIBu<|qj3 zhNF`3(K;~teHsrex~Yba%?%UdWDCc4rEC2-o3Y=XO259K_7fa~NGQO7!An7+aT> z-#HW-M`WUTH3eaTqJe|K;;NsNJSI)EpS{1L;ozlA@TGmA zr7)FkoptPc=xN<<% z{sQ!1=BG32QzJ@`+i?jYDQ#v=wgY_>cj0Y69P*N5vkj1Bh9n{9f_5o29HzNuieS@J zf%3agQ+MxvsnGdT1W6rnO_8z>Nm9dWD(dQZ(1h|`WO<}$GhbMFY2{6CB~a$|kDgu; zgz-=<`(56i>@TL`xlp$34{fOQlS*GKrY|JF2DJz%jA$s-HIW3v)ir70zi>IJ`*!c3 z%S(MIa1Pptca;TN6YpsHQtVe`i=8-IDvfQkn{OzV~<@eZ97=kc&e)eJ#SEpX{ZbX`M(FDzV&( zT}>O?6A7W-y?7-pJTc6OOP^w^oVab>{3$6zM}WZ`Qb;Jl-7Gc%k9Hd{=uQ6=I(oVy zpptJ_s`j%jCE?UlosgbQOuj{*MXfnk z!sFMMo6@G2y=VC48Ttu-%ra`AcCrEXtGh`CVV*~@n|Q%K`vU7hJ|YHP2OTRLAatc)QqxLxXla2-k&72h=9Axy?>&=khICGE0SBh0n96J&QLY%U_#`!dY;u_yB}OPVfH!ETR@Y3hSuqW9tzEO^A|I{<(S@ zuEt4#W#pD*h$OOSNuJOZJX7jd-M8bz$ZKO3p_k5$x33{t#oP>JT!ertWW1=-5iON1 zxo-8IB}{IMjMu|h^jOm&W$p{Cr%3GQrm0C}27KMHQpt){;Hw4n_D>7PAZnYAP^ewC z$0Dhg?dVpSuWTnbC|fCf1kz8$6cnlAUG4OD819CLuB9Jo=1z?)1V_7ADt3evHDCa6 zB(-BzWE)c=Vdop^&IBmfKA2UG8*>O$b6`@pLOQKuOB6-IJ=MIONQU5ZT1SW9G@pK+iY9}|VhV4e-OcBu$GR8(Y z{@Y?{hboZ#1I^gFPnWTUl8_6YlIies8LnZ~Oeri=*he5#ot#))=h6hyZZwHX2kR&B z+H0|L*)(5gV$towC+g-4p@>P`3k_MWo&IioCf`=5vmj5nC!MJ%sg78Qy%SbB%A;dV z>UnZ_k11DJY_3&WQ<9-oLcBpxOskIsRfzn#zN7sLDEATKRfo8_TH^=xweJjKo3cmi z_eS8~^2QZMvkcfeB;Hmfp{2YzsZf>RMF%}P>t%jSX|?Nx%YmJK68&;L|jNDWOlqP+*8 z3UcnDeO-01$@PumIGGw(ekF3DwtkA&0tPiWgQ%MvwOX9Z_C^J0Wx;W+G)m>oAG*4b zwvGlpVm>zb8sH}l;^)d#?ZMrX?1NC(H)=1Q7lEfM2~&{@F7BwjMo7jo4$CcFb~*du zLa$D5JWH#1_J+XHyj7>T?aW_e9(h-&3p5r&oIl?Tv3PRYOx-k|)e$5w6>w7m73mP2%}5P^!v-Kb%2tM(W87olKLwqqA;bs@Ol4tsphHce~cj zS8P8f<5BQt)~GmH8BFL?Kos7QA0yzJMbxN1?uiUxYnSXMPb(KoEH!o=JmmhUa&;{7k$49!%TD<2N(BQj3H?NznT%{ zxouqj^NfeWgGKV)*#V|jqi@!;LlGG7c4`lFVpV{~UlQ|4I#9L>h?|>%eW$gY71~j} zz{L+VAi4pM!n%HRHT_1AX6HQ}-(21Qr0ZN_!7yQ+v8O{-rKV-XMF_ z%kz*9;mIfIV=)3*<^RC`6;aNOKcb*(Rv(hy8$a&=k%?AeqfW+OY2_oy4KqdqFH4{J zA82DjH^QceMBO(LMf`WLItcT~cWyUrm4Wb8`B4=3lLvBk zKx}sY7W)1LbfW19ZZCyQ-4LDXn4bStORwh^x*x~xrfj<`_l?VGU)w2|%)KS)@6cO^O zvw@u|I|Un#)$YjO;ei1mi8Prfd=ijw@ymN(bfuW=h|o%mPF+}o$Q7TS%?vaSJ}p!f zK4g-ob|KaPrW3kqeLwA$;|q1z@I|pk2@_@64lLhmQ_+@GH=Q7aGWV(r zcQZTGeJpNn^Wb746arKf^vNyU_+>*Mrp+`sYIPGu%t)v)zBr1PH5dVprma!C)R>!1 z!vgk2dhA6@t?-7-zGFYiViAGTq|G=(Y&HraU|{{hrb%ZYAmgpGP2Vmp<#68=Ow?GD z!zWvj&f0^|O;gVsledrBJTOt{ST$S6HJ<$|`qe@qn!`G$*v(L?ksv@BxjNEEu^gU2 zpkIu1J(~-DeGJlb+ydi55ZmOl-o{|vynXyfPcpcu`H-M-o^l|RTjDIt%PTjD zWO{oq{A0a1-NWZS=7&Meb^$U-S?P8q*c|==wvpT}W7d4&_Gx45;FTBCE8blnAv%NUg?PHp*c?te0%*(aXAIC-G_K7xyhApt?X7h(6}g*T9fo(EH|4zSh%#KQV56mBMNmt*v- zI340|dEo?#k)WLhvBuL7yT_`Y_8$ zs>Uo>XIB&He5WogILQevM^T{Rq73q!FJaBy1)A&mr$|Zrlj9U@d*|}QGSLvF&@56W z*2t%a>HXnQ$?LnhPDN)6+ZEW0Q1%JX3LF?pk!lRwuaGnA%A%4`l%4m7(*;9BnzTYb z5g&LdNzZ7a%}sXj&3c8@T&SpoRr<>IkMD5mzmAh&u3u<2|AIMTs^TSok@*BUabC)R z-%s2U-0BvOl%n!+ia>>4F)E&dYcFR*X82!+T{+BM&n&;qEoll$O6u07ww)BKb+t(o zNE&|iPp3X$S-U)A(Mz{LCu5H}6EuZMk81G^Q%(KBj2-s_8y$6H0sEj22!hcbLbn(b z@8EI4zz2upeX|qy^#i}>#)1I3X-}v<)Ji9>pQN(58dAw!Zq>{BBJ!oN&zgSvOKf;7 zFZqbY1lBb77*L?$!o<0!ao1huvGJuooW6qQME3eI^CE~w?0 zJP(l?JK}6FIJZ{BjX`b(PuuWf0$Kq+#F}Xw%I^?Y6RZDVLcx-tKXAHT(zG?LRRta_ z#mOw=cm&YGd2aa0c3Lo~^T3JbeA$!Ng?f+HGr?5kB$hrUxM=mV#Yys?|9)!ar&U76 zjH?yi)ZE?aYlQ*x>2(9i!C)K0l&jDg$t9I5AUGDeZ+Zqsc+sfkl zBrB8`+Jv_gv!pF9xpAli0LzQYFvm}^cEZciDWPx8Ot}aoTod(3&ZrswD0p7vsS@B} z4)`A}r#u!|sA{Dhr9NJR@j1E0!{?=*fOl->* z$k1Z(?rlsSo%=va=!Tasq?FlNt=snSf|%Gq9kJ`2*~;vIFs?@zf3tViDCmF~Q#gUuuX{k47mbHCe zM{prdu!tQM*YnhddS&i|0`M6L*cKB01w`0Us?RhX%<<@3-?JoK`rC*FiN9f^*Y)!VzM4=hPXUTNA71tr@Q0)I#IDY|$1 z101%`E~G<(XGJt8)Jyxmh2*Mzy~-Ws@-u?E9xHQALoumgLrV}O!>ZuSD}$aEh4Sw&$OA?RkYfGijK>Pg z6x{o0I?x74Mn`&BSY;oCLkCqnlO>owIY?iH*BrDmED`ubr7DugvnUvc+n6Q-yQKf=DkltJ}Fauh?BglWiPMVN1IFbUDlcui9C&oJifzX4*hC$lCI(-?0FfYRhe%N17o>}l zg^Hjn_*CT|MNLs>8co2&{Z37$7RR$DNL1)z$?3ON6SU$sY{Xs;nY^oJq1xWtv3`~P zc(?`_O-60E*ShlhxAUg<5M|vJADw4`#)qN0-WVDzc^TOUDRxvaNqr>_h~kq`9u-9s z2N7(hTmR@NN7YlP51ThTpSXoTY4Md4lTXdDgDK3Yo0Jt%$!fFl$u*b<Jiw6u%118r2`14RGIUZnN_%^VDXX6hdJxmPxhV1jov6;6fxW^^$z8riCKYRko z7O*_D4V%OnijZ%*QKMo+vfG*G=32fEK;{OG0nA>iInAms!0S5$|6e)YaC8F&wCy(q zK(GNzeIMZbukA+@4tk2Uh=|yMy1a9Gc<}mdTZGuFnhPP>D8ncu+rJuqY2O8*lgJ;d zjJ?=3%w3h*f~g43H^O2IykaVWMEd|Ho_N*-Q1^D1LO-iONJ+01px?wD3^u!aoN?qO zn>|njo%pM6gDKo|rxM8r59|k{S`0z=K}3T;N|0RhFWdnS0GTxN3dBs|C0&{68?e@( z0Va;H#peHN)Jy8g{p9R&6e)ax*73;B&n0w`$uo~aMctx3c_48pk6?^uVxQKLmaQh{{9$d;q>ORMOA=KJdn$riSk*2G^I!u=K;2((< zKvYkZGumPY_41ja&Ef)#kXBamJw%w55cUZJ+&A)QKE-PIfZyFSFJ44_Grp8-dVHTkkM}So0At@_IEtfSSJZ4p!jr%I>e*HPww+6 z;S9Zb3&J4_F+f`|sg6XHt>p{vKtS804C{!KMMpi_6i$)>0>)?b=80u$Gi4dq9zz{N zFnaK|2N(GI`3zrAX9I&b!Dvzft6<^H<-Lh@A;7TZ5=1J zvIcF{9A>5gAHLbL5sT*Izx9uASn`owx9vS=!< z9h5?#s7pI6Y$TT9-#clC7{mD=iR+cmIm+~rew4tJFKzt1LC&|janV*Or?qfOexq{M z>v_{Bs;W1F`al&_cTH>i$Q;6G05L$$zjJ&#b4omkJTm~C*|BnytZ8EU%ZyAVbZ9h| zByWw+D9a6OnXfiHzapr{B|{Eio6!-nn-M8c7^U2%@vjKGle^I8g&A`Us^9{18Z z6UD!i!o(KD|M{b!1=H3z`T^4-N4jP}j+6z| zTILhBl-yImm+$j0Kx%*`j>D9y@MhLIU&foV%XtAn$Cm!N4u|%PHX~VwEah;1$FiaLI zhii8q3S9Fn(n)co137$ZB6SRzbR|!neCV=p%8N_q2;xit<$2eve2H({sYV5?(v1?8 z>ZVM9ED!e47(MzlAuK$%I_Cl#T0fAr4={!Q^KD&4@D+LjJPGWu=mjqr5kB?DcS=nI z@iC*7`FQ_9YL!*+1#vkj2s}tqy20d6dE=TD-@d=Uyle0zYfjH(r701eCtk`{gX(sU z94;0+MIqUIxEV{|v=FvEEb8K&Bj@LtSE(6@BJK3Ob2aq*ggFzJxNH$DQ+ zOu%~gVTEeATq9}r$Sv2&JiSo{4MUMpW+P}yPilV`RWD?4JD7G^_Jjc1>{?#HYkmt< zRIfY}WUxP(z#Vn@x~N%4P#5)F2m2B)ym7qZW5^Bk44g1hA_`_FMiXhxc2ph|>3UEi z#(@L{xnggPke1a9d}CzR>@+hl;j!ZXNBB=!s?R#aj+Lm~R$T{9x^ur%>WUd54^dJ$6`n zMB@lY3+(kAgjNHcuxb;S)Xwvt4z{f;JxxR| z@MD;H@e&d&5wi+|RKFW#DAXm^r#+9NI!?d*)Pru2(%NSZcn-q8ce~ezLnh<;t+RnJ zQ;3q;%B!oDL{xBmBxEfF ze~^AUB&fs<1~^}vF3Ji+nov8P1+?Z%lD;Ny@^u?XnFYMqAbR_)BXZ*4DmOf{=QtGZ zkv(OiB+-C0&3Vp6$15fCQpG4x7vFcmX6Z>!6lx^)UDaW1d31_Q0egTG^VB^mZw1{M zoz|XUj8SgB0Fl92jDx2Rs*+S)PrPLOh6g+x%`_Tq+19seE>i293nYgjOCzk=9JsI1 zc9ns`Fiv;jGWhNrulnmDy* z|GHGAHVNmQPt`2QCuBp97pg53jdWk4aas`{kv)CjkH&(Ky0N0#V|`^+PLp3vyp!Ln zNx*W*vXeqkU>e@l#UxwAk;Dm>rYE{UB%!i~1>UGbU<)o}0%o%BjH#T2hw*|JM$9-% zA~&r(k=2A8xhe=k%!#iLKWDTRS^U?)Xu?M&BP1NQ!6NI#+bwDoevXuL5TPzbv_n>% zMIKm<9?_X7v)M*^>V4-RQZN1`c^JQzvniss@kld?&u_}^@GW2pi=~Zqt0Aa?J#O`Eb(LA1*pcaQMSXw;19yBX9?eLZSRae7>921CGLuq zvOM+2KmFRCo~u&Pq=S6G;wz7jDp>9{;3}D(&qz{$Ot;bWwSyBGmU&}i^}-Xe+WQ;g zc@0k~i*3=M9+N1{2x1AquXl1cKDvX7;T;$Ebbj-V`s7q+ zCc3WDo&?PE3<~*9F>%;pv;9OZPw|N?hg4#*pyF=LE0!sg39boQBcGy)@I0#f7X#ZL z`k;MC)bFeydOy?=rx1|ieVBx9CZD-FXO&S=0`ny#R2T0T?mFCQL0GQdh*`69%4hhv zuK$Oyoz!!_-LOQc7n|8!sV)Z+w(FZSJif#0A1`hF{G$PdtBqi}a%e0AK##1*DRmu8 zUEZus-)BCLQb@0xFm#P5IRlNhoJq^XJ%}6Hq&#?ecwfqQpdtU zXm?u~narmhKvHJ4;!X0m011fumFp#+teWf%e5#UyF>^UvLchqZl%@!WS%Czwk)5Jd z9>w9Q;DW)QLQ+r5oBqWYuIZ$ddIiKq^($gTT5vBu$X<2{HyH0>vBx z1iuaS37ozZwSPMQ{J_`)7`4QXDDm2Bo+J`!7t2y z<57(%OXw6+TeF@W4K=iR!80E`l*ouja56a(8PDl7lH2!)NF)r=upY^4#l*5jr|;s< zO3bwx+YpQ6t^)Mo)_<@Ys0S;YSNL7$@><*k*Y#oZsR#VzpC+#plu1zLVe+Ev+!mK4 zkM+bfE1T{!g@A4?igxYWzGJ}9u&+MS#bkD^a#p`rObirhOcNw1)l+RJ3-qFQ>-vMX zE{{t6TKYD5N`sw^OT8k{l>Gu(fdUqLEqQx~5mW|(68t?_@!X?iQ}mAz^S3#oQY#v_Wsl1BjkEA@#@z-D zfDkJ}$P6wq*+RXlAxPWZB$oF#Tl#_{f!?%bG^wM%TdnHt0w1|8kPuS%21?aaD6-iR z)e}-15qc--B7S?!Mp2S)-*D;I$~sw z@%*=StWV-kYjw+^g`kg@wk$KCyCdgQb%7mr?4=ubhTAn^4zW)XvBj<@Cm?k+Z$mO{ z8qfeq@cs27>ES;C$NVUDF+pho6pP*NI^`UsPSFc|0{CLSybS2!88>KqIQq8W@XK5P zNi{o&abI1Ft47y9SLxcQsqrQhcz?tI@~Fd1NwtSK&@qER#G@Mdjq+^r_pQVu!?mTb z`CSsOGoL@nPONv}6u~X|E0U=(<8_8-b$ughS$Pf0Is=82I-TslTA|$?Uw+j=WUF?# zicad;ZlFi{bOvL5rNl&?Bur5W=S_`#>!(}?A49fE)v6G}_cn?SqyY;I1|ozMt7s|N z+4(Kid5GyJX1_gYq;qy!sj7cHv;uG&aH{K5E`4)C|Ayw2DdQ~;cC6klX8&#Z7&wOZ z4ZxJY;)0}QMd7zuLi=3xMmw24gdLmhO9L)jkEXXLB+15h1a}dLbzgsCB07`my*ycj z4Ksxw??MI+B=cX5*!p|`CCppABW2d_iZi67@3^TKcBOOmi5x1GiC%p_kDZN? ztt19p5k$*^6E70Af(9$)b}w`!W$PDvq#;py`+~!zp^%IQn=yq*2MBL;=4Z(P2?>>j zA=J>7O@S12qX%?{mD_U*cTp)Ki*ZTCJ(6ZnMr%j4KSC>#NB6+$WkWQbGKD}@t z?zQzFB_lMZK-8ZSbTUpi+ybg&DDm!FU!#1+u6{TqEF@rCeYSZHt3m96zKFfrK}mJ} zqH_5Q%pHUZCk|8XipFVz%c_}QN%S$ak zx)}#<@cFo1Rra4!$Efbzkms#A&!feJy7C64A=%)b9J~W$qdPKyI;rX=yWqy#XO1P# zoPqXlEDoyxu@rEq;X-ODl*c{}%KrUJ)Me3jtC35;Oc|6ChEIbIE1acGtC{uG%9InH z48#EJY8?-Vg-U!?uL+ckEP%h(lnBU!nyJ#I45F9!vQ<+M+r8=hoH$^sslEG3&)Oam zIpkZL%Oc7wz1}b5h5@XX%#eF5`Rhn3VZ;ZOkxtn>qn$}b>cLv?Cfuzc1^#FqZakfP+gaC@ih!tlNr)3Poc5BkRezciTU;S z8d(nXXWWJj^J27Dk48u2dt}SjLttI&)@vBrW zGk#jdqYD%-&rheeLX0b_A5UIiQ~y1>jVGTvV2SES5WA$H(U*+<-o~-Xv>ckjU&iQel9LyGDTAxvIXpotNff z2bUYHRe($SqAItj+tCNRsFVs4zf4R(9R;IAbp{yPTVT-lRhgQd@RO=jZ^JorXkjBd z>T)NdJDnDZ#%Jtov<&caQLe2V;B4u&i}!#NOn&_4I*lT-CSN%cscO5xlfCg#k*STw zztXT#qfUicNHd0J&NrW-x5i?-0U4qWtvrI8(=;X&k1L*c{Z(l198uS}6rG0KFJB0t zkNiHDW{3^F3{mS%oqByJtX)WC!_~om58~qzAi&DltT9I24`48(gQzP}GJJh09Q6Fq z&?z}PYi8~OsHh_X@-#K>k*)!T)`rB>u0ceP@NYP&$jpHU<#zBy+!%2Q`xa-P2GW+T zTkSP9lV)2v7$GAH4CkUmk9W|@gN~V*3B5H}*N)^I9Zic@fY5feqK{WyZ;0e+%6`Zs z1$)v~Fo%M_N)l4~yWL2O%Z3WLCBNYGfcCneS#?T2{piRXH-;R?38%3K1_Bzr^0lXG zwUfy74qyEsp`oJbY>hNC4E_IwuEn@zvKN|a0yIK~obiL+(;S+-qTTzPbc*ShvYd;} zxK*r=gFhNErc@#S2w9QrbrM1+AU@+%vhcJcxLfVK%HueE)CI1EtHir6l z)A{Ab_k}Q5iFH%3Z3Wj*%=uwDrsxwrT1FrzQ;ZtXs6pZcr}R4EX}Hu^zuQS4ya$GW zI>j?i7p<<@-3p&3NDgm(y-@O+yS-*-QbxT|v=<h9DK3B!HgqayGEBw z2Dyl;yTIcAtK=IXPtPVX^S2sIy;NhQUAZ#3aS@*oB?_zx(K-sW=5W1iYQn{LL&P^D ztu4_?Y1aj?nV|32|5Y@|P*m8~&t%xUQsXK>vYb~^g#_1^I9UtLH`;f9Gx5SvUTk^sRH89mrmr=-l-`?jjA>SbPW%|f4G z1TiggS>w#mOeXI=h=!mR7SxWITH<9k42Mt-kWz;sc-4+Q7m|x8I;8 z*~LUY@xAIw%$9B5(OU4mc2$i|BkH&2AY(QG45qc$DaKrW-LUDH0^r@3Xp4kVi) za}2i_nE8PEo?Y#9HcfU~h&%~LW4C&kMcHQR@%+~8JcL_jPY(E50eG*MKpvo}e+Mc* zsWM@|T3lv2>bn1xu9L(^)CqQJK=@#xN7>r@Gu3z3051|a%#Ek%KI-0rGfIOK;YaXM zM3JaNBGtO4UT}ujg1W#e=zPzV7+UoG~v{#g>xZq;3ngQ6#$`P5#iLK zi7*;EJodc#YD0%lyO`Nr$&4`H}MXRsxZfjls0D&5jlT zEOHmgnt>^n+Ogq`eWGlA)BWY>AHAa>iz`CpT<*SIG>xfE28e!LCC)ue8OO_#>3?%4 zx;oW}oEkdA#Qo)=iyz7^RvLIrO@0_=D7AB|RVR)w{Dcj%7deWJMwe${!aDkFo-=7J ztf@rda-h^GWD;96B1vRmQQEQ8KhIz8d>&%*UaFAeNHqz#9}FWc3t};ynOm!R%gP3W zHZU%7_gcd+a`fYZ`A-X?`MgLH=bzZcA-3{}FC->pV%v!yWl(K-8CvnMp9CSk&KOHOD`?Z((BANQ-GNT|Z;i0G{aN3RSfT<@uQ-0D-&Zm{BRa^?kzQ zDf4x|+48g&qPq~qQ>r*}nu&Ey31l#)idoJwaIt0-QetYxbxRlnx3s{S>&LKEURCrB6Ab^8Shc5PsSE*mWj6@ z42bf{SwP$lah)|LOFQTgVw$ouz|U???jlyEe^w8+v>&M3nMK=M9u6OLK_R3-ftF5T;_F&azm>d|n7+G6pxvpK6>ghxi#yeivnmJ8uJ>IP5vtk71JNS+Z zAtSnD^DSAFy07KckLd|T6Q=zkQ~-x>`FGiwc{l(Yz7*a@cSMGJDl%EZg6C-;LdDR= zg6h;WumnizT}Xu-uU*sWc`f-5p}5V5T;e@ian^yIVZp!WXh*x1i4lDcx=H&x40(i} z^S&v|wH$6ncA{|gu=dUrPjk}-GUbm0ftI|wcx#DT&pem(k}&}=D=1e<%I`XmVu_7D z)jR-JOrrF@az2RCi;QK)n6Lmw+!eN)kz?qU@gPxd1+n?H%qB^1B6& zDqw^;!}^FNIXie41TY#y9WecqEq(jf`u2}EqIE|&n>O{Nc_C$)ws|NQHZ`&=QRS`2 zHbLdu`8{n6? zZWd-)5eVX8lt}aTb`p*0_MQsIP5c}fT2%JcS3=Qi3rM6z?5){(%R;f1W_h3W2fIH1zFAc_a@pKEDtVO>jh+FZ?xyGAD=tL6*L%qkSr_ zbd?{dh!tOoFXC^9zAK^=aeKw9>U*YtzNWL_g71x=B@T4ljstwTD9?n7-O#RL^np2y zv}O+`vAS7yfm9-ddq7TG`_Mu!irai4g$@vP=ryz{=gd+Cx@lNN^)(D~*|ph|>?;c39D zl7YRs!e8aJZ)oV=p&EFg2NypX->9#okF6y%P*iivKsj60@{D%ZPF8v-KKKNdN;B)L zlTk(tO+;d`AY>GDQ9QSi;xp7KF~b45DGM&bEw{An$vdFL zGIV1~gjycLF8dpF9lc?f*H;;zjOU_?LF^Np;H0(jnoS$?WK-pl0`Gu$vAfTqG|qFm z<6Jr8@t>IAzH~^iXZDPfH}?0HqR&V>x?@s-UQ3S@50-vawAUl%EPQxzyPHk^@d06Q z=C9UsZHs+cdPhw8qG#ndSb+lgXJaeTGK4>PF_5u#&ioK6K+Vn$8)$P1jVlNg;0v`V z|7{TlM6Ps2$v%e->l~4#ZG58CKF-|C{PdlE|4EL^!Za#ip_HPAImVwDmGv%2sMuDf3~ z1Tcbg;3q@mKB=}U%!&?@Wl~yslH_1Lmm`1mWB$KJAUoASt@of^=5ILx-ob>3bDQ%x zePagz%2zao-wCl9X=}~Sca|~kH4Z(Nc{d>D`55|I#e-%6VJlGB^JR7m>fRZK_}^fN z4$vY*kRj5Zj4S<-L(8KNg1P)RzJP~e@WChk>L|NI@Rs|I$g+_$(*SuI{v8$_mFA4j zrt7`rNR8yB@Rdb~pR7IBK3eU#Y7APh6V*M*q)awC%2k}~KpUIpS{Vn$0T=Rl1f~hN z0p(V$Bc7rQ*wj4o)9MZJ;n?oETm8nt*xijrMOjtlk2QW z2r@yw0emO+iRu(KbDpOC_c5n=jIIq~umaP(YQfE}wki30t#PQ8-EDaXh!cRyFeD0) z$&XfT(5uj#P5HM4RBQ4yIKQ?Z)uB0wIrG(mkUu2UYvgCX;&)4Nb;0t3^S*qqxr zJ#v&8QEn`wd_ITV*YJDY6E`DB-*Y#cnK{8lfA#VUb~upOKZ-st5v@X_530k^Y%%!q zlW>d{dl{#@x+vz?UW*kP(h^1XBCIHwBd*6?Df;KvLdy_Kg1?>MI|^3G&$ z8PO$6m={|=S|5t;0`yCYu4$AzyhaV3Ng{v<%WDDXUs|PICykJCw;$Zj)1kb~e5@kDTxes(gK`qzfmvbqyd0aG~RB=)* zi$(^;(0Jx{G(aSEX}P*F187(ZT(e_uNeCC+vQanottgyakDC@es8ivcGWdOepPleP zIcXxKGbaq{N0_T#wu(T%Xo#^nTjM^PeF}z+v-~{M(}ML`cqjSs>1}jgxa)*TCtA?_ zLy;5Pm;;4V)~p0xsn7;_Ty%fEp*F{SmC3B@*v$c@&a0U2^m*~`7XQ7`k(^- zTw_g$Pvy7P!&aC^&)mfFpkz+^x?N``bA+lQ*`)rg?5q7V+W3D1IxR~ko~~CHtUiRD zXNIu(cB*2V!W}((F|HY(Dq$)+f4&7|q1l(i*DF78ULr6Y-fq$VS;|k=s!r`f9s>5+ zk!sH$&E-Hx_j$2mDIElrslS9i%d6L*cvb98>H8B%x_M+@b7*cYy;qN9;HlpwJ0AFD z=!4!u#8|upX#;E>c+uZ@Yhu9wU0*lDy&VCUUdo&=^4{amr@s#Hb?4lcyF83eomXW| z>zyhxORQs}63As)DNVP4?>9@UJH0|XIzP)GD$2}`XNGQEOM)V}3CW*>xaqt^flU?4 z4zWe(?5px$umY&p8$!I^VF0vho=Qxd$~iMYZ?Z^se2-nvoE%D=(6sxlvQkvX99B8l z$j@H<1kq^Q?ET$gcHmz$5?NOHm=kWMLf7lfFtNMZXmwJ~u6p8cg;B~+=kOXFMUP%6 zl%4SS1xh}ys~7cc`4lwPg$pOZxWzVYJDp};gIqr%E6E}yT|E}%F&O2kq2IY4vBpMSE zC;merT27)))F;kv9h`mKZ}bHJpB*GrFn%HFxF&n=ZD|z;ekHLGd6y0s&o;ju;(q@# z7yt~y8=yFac-Vf`?$uvU0`-|p&v|}@zE@tc%4Li*+yU*=s+@#(0DfTH#9p+!`w1RM z>zlm$^Wi1Nl?GZ=D=OWVHdEH&1fkH?(!5CT@{TqEqm3adtEs`EW6j=&UL-I=OJG=P zrVHTeOJ3xcP|_Q5bN4BbKMBVJy!95UaR+(kJN{Lrd&O<4sATrLk@^~xUpv{#B*iiq z6-a(`l@zvRx*<9baXJDF+8=xX?&O^3$tPv)_KN-z$MfWXoeCF4VEgxI1VN27#HYfj z*rvBSI*TO5a0uXL>H{*TVKywCj?FfYo>q6U0vnoxO&Msxa$qMoQteZQ%BU`&&4fR^ zh@IgY?$gps-_VP=Y=u_)Vz3YD>*gTFRe3aREpe8aABtv(Xiu*l4U)sy%>CM^*Q`pI zqsC3?39`LyrlUeK=0j$3dRP@}33ExN?~#P zS(kgZ!%szAj4Hq~mK86M$SYZLyg{0OI0U6a`qrydkMW2-!>^iHX4A` zEd$5Hv8g0>Z1N5@5i30hM#xg*@cRr^)m2zQXA(Oe8A6h>H4a)^)?CvqNR(PPg3m6w z(ttvUNIV^qn{{(Wif7s55b%H)2J{(6NT{ulYIu$qe!&WYMQF#IuSeOlyy6L__qpIXA@@X=a z5NVoAT@E*hjt}oq|ur zJ2L=)jEoCk9>0N<)tn}C{+8ThIWz7T_Xht?>dawdw^bE%i$#@Zwnyq&PO^G1wQdJ`hIz*A~{C>!Jvr1Ja+XCR$~_WDSf z+oJ2o7Io3WZrh)l_cY@v(fUy-2Mv`I7T27<(CWd#;T#f$)-#aSFZhV2LtCl0Nz2pR z8eM5LD6g#?-=%|_?4T^rf4R+l8VnEaCtKP4%xT;c69X-B z7FF1eW4!JqB1hek3(qDcuneTe*b>B(L+aItqBvQg$k+KiXZVchb>g|%P{8JOK#vHo zcuA~tZI9P!|C-PQA=DLEK22T;Vi;KAJ-63+xvYAVwD|2Nfo6ni zHCH`~+PUF#}aFe$AXLAxU==#*ss8G&f#uyKzP_x8MU0b-jKjjtk6F zzAGkoc{Eg%CX_qpgCN*`N}||t>6@#)#*RAXW_AQQo?SM7t$h(u+PWT`{vo?Yw&Ab= zOuf||uw+c+p@nre@hYN`YUA|X)BZzcxQz9CG#%s=EGoMp@;L)jVf#zy{ z@_7_s6mF|Y0{$#?!W(zIn>keWeU56}^HWOZ50VRR86;oq;q6D2FtD1h2EiXiU^0M$ zL88lWDX6+N1?uxZx3q&GQHkQBtz$;7n@&WFzy(nUdb=OH7ejiCT8xUEtNkd)*V0Y3 z3>wajVA%_GX)@-*W48pVNY?ff6|}E}y0*eqxqesk-|>=m;@;}Way_?ILV>dHc;XzSp_f)$~vmaWWqdjFLe>BK9 z_F8IuP+}EWZ~n?TnzQwRV+=OTZw=iZvD`=S&6&)g_6sKMVP{?hP>DSTd#@1Q94!)v zT~x)qUT#qoj(u3foZJtihgPQ*PJGFnv(&pg$c~Z%L_SUAj##qn+V@BtN^t3Bu}%M| zvlU=zMeKr$2e$qq8pT-8QRHcN-d#D4Wrb{0AV!+or|*-{FD@n<)ngR<1;kX(i65Wp zVgQ3A6}{nMLB{YHWX>w>tiRcC6Ho%;4ioERCePsDO?05^R^J}*T6pilVfWf+3BjCZ zc61m;o(#(C9)!5*AcQpQ0iOaBt4+Wy{1yO5kt$OqmE=a{rS;*v&S_8b+X?9{&zrSj zO8lVk3}7=deEqOO#Wn5@uk*A9QR+c|ax_f zLyTQ^_iW*6>=QkotM#;Evfu)*cECkakOnuIxbj0MUtTTY^@i9_-yMUvI+ z;jD0=!^&(>34u95D-KKpa!fLNV=SNABgEnx^K92rCqObBZ?qg zjpv;le6>-&cO6%E`bpr~|V8%vl16t)ByW}CL&iIlv z7L?2!e*W*R7J?-$E^so=DZsPOk0xBI*$WZ|&HV)pXRb~*GrR{`{Ee9jbij}RAu8GP zW+X25fLcU*DlVSZ3b13;_x1=8QFpYWyJfa?e$CsoJ??hWC6EqTyW&bp2=xYv^Ly1u z*8zJ?w3!^2HmOypHVAqEr$ck2g;gSTC17a|FKRQl4AG7eTld*aVv4}Yv zWt3?D>;~DOZIp3X2Lud7m{3~HE1Vl{`<+iN197`g*#|B%WyQw=n^%(|s=!yd?W;Zs zMMnXaUD$KbX^DZhm^O^5>W)n}Uf?ltWuJ7=Y2$_GuGiK3->?3@m+>ZCTPBwFXxk(U zF`v*$ab%;gUUqDwqON`+g3FhvRE`ip+FY}ks5W|iZ(XJ2ssiy~Mej6vss2{(z?tE_ za_FX(OScbiU|e*xWb`iupU~WI1QjC$zqJwz4Tty}vORKwy|@U}gJ$O2nCinfmvkT# z?hrQhLkn9m{Tm@?vK>m-2y4htP+^?S(Lt;EvkV)mmTz=@E@c{|{{Yh3#!f%qjHmb| znZ0MU{#Y6ZI2|tTyY_`*DMsT-w8%V*2aorO!(R%U~kX4z(vCm zxvu!>+@8;eC9wI#)8gu#Rg8R!Q$At6Xhtu2_wG&-K3~j=j4TE1IbQ3Vi*ol{|;2?xZNS;^A-IhYT3uYQs(~IMe zOv~WPTdRzp7EGc_Yc?hRyg0HFNPgW|I#wTcss!ooIz{y{juO?~ly7(bBx9!5PwM6j zhh1{6U!>5qjNB}f<=T&AS#`$FtlijFlz1@c_=2UyU6-KR%VG^u?Y@;UCpCDA>m)mB z5CpoG;^KziV60HTFYES%z;4sO6N2@)t(&>pJCI(xdM{E&&7&>Mvg;e4uDvsCT7d9EcpSrp;f52c~=3m2|ZA%Qnc zqDa;!X86KUK$W%9tS!(We2YyR8%#Arr64XaBMkMti22jF?CaB;0%Tt>;d*&FTzv z25xk9r8bSfKd~k6i?ANEv5UGH`)DLAUUS=c-0;!vlM)`pVio?4hEgn z>V$ye1ZMe0vckC5U}RjyNcTf1=1Lk@xw32(Ucba&rWeb8`9|jTPGI!+&s0E+dCK>M zboA(eJi@(fDd1Ol_#mx{jwD2d#**$)bZ6lCgV-I_q?0z$;2M*JVhd#sJI4d48lJ{V zmADpuby)~1*_jB9tyh81S8}%PF_EdRz{I!8HddmoqQKQ`MY~z9e%QrIVg0hLmsfN? z0rv$Xyp0)tn_$%bV9|(*x%tPY4}5p?#o*=R6Jm+|E|Qpjx|=h0h6gr_2QcsfNfI&D zN%2@fiMV%s$9jQ-SDe-oj(y+yLprUjFlJ;u@?q8WmIWeQ){EZ#ieajR_zeX8bGbbM&8Q*%m|ckP|&|WFfDQ@UAJ*J7Z@ zH=~!8wF9LrQCC-n)^3(%O>s`R7tyhsW(uimoIypxkAzM1W4q5p0nEQtM z_1B^{+4d!?J3_w@Jl{lZRYH@Jxf(^JxkLlyEyl@Uyw39}g!2MU9*GWTGelDzLP?k+l^G8ID( z^I+$t8z!tH!{`l!s1?Lo45KpD^OiPpGq&(d;C-69BfZQ&%T$OsJllq8spq%@Abn|O zK0o7Y+wwXQk0*HjRYn@by_P0$*#sF`o^>DY8H6ZASP|{bQf$=)?Qsv=ecdL#U`JAl zD9ky<^9a>{yP}(U(3gGcK3r-B-GQ1VjEn;_w@n&Jz2e^0j&H$&(tfU5OYCe6Zo=>_WjLj zd3NqdH?j>_IDKvzPsA_7QZ^3xA}?k$>*eo&e?DIT?u_s@CvJ!CWBO)T_!CmtXG1m= zjpwUi7UrSD1=pY}p+MGv6XRNy`LyaeQbl*7B-`9r#D|7jg{1uVjC;LamGWv6DL=-I zT&G$Kf}l%^;r01Xla=uMaQOwI*z}tkPe4WrKv=ixK7uYtW0HP7Sl)F;GDfO8-mqC~ z4t32B!zF?_@v2bc27C~(W-7EUS1)jk8 zf%O`by+K$sG0Y?B=-f8#j;6HA&Fl*KjNb33W;ucdXt?s zPi-#WI-V-H+Pu(Uv84G;q(%TYqzT7`^)HGnmEPrGr04hwgA)3uIn$em`>5kU2o$QD zt32|09qe(Pl-pn)JNCRUP~#?Cf$?rOCfEq^A|BT|z}gM;dK^o)_kzwu-*u2@<%leD zr28*yYtvIsICex^*0*=D9q=Y@BN+`U5Ogge*tM^ikEGH6etcJg zy2!<8->AQZ#0;4?3?2Zd!IgJXcy66+);#!q6-*U6}O|o=~@i)Yq5O4o!eV|1ECrUGhg=y(HnvG1Pof*kjH^58Y0cS5UhZCLvqQWc^S>0+ESE>rtp1qxMYb3h{egduo^}=x@`{> zW?-nsUttF`#^Wy*8I8q05Eng;bi12_$cjq*l2oZl7wF+6cT z6S59!mZ2@Jt2Tj9PofmxD-I3}1q)+3vTw@%g*6||SH{nFb|3#%#TCDXNvC^uJ)YM_ z<^KP+P;pYybwUjTfYJi@WXYgu@@MlQfPL?X=Rm;ika^Z~b+Gquxpqa>c)@e0H)32> zNy%^=fKX?l+iM|PWd@5URdyg`BKJ83LpC8Dy^E$oITRyivJg~h#2KDmUbQP6!{{Y5$NGWRY>)Wa67X% zE$&7)38o;P7JjvGKZhC?c)x96%bi~7J-&!;h2+UeX_a?WG=p;| zX@L|dh5$ky(`qI}9fOq*(K*QsWrrc&{GeSp#YtbnfyCz6Wno6#_BBg6*a~zGyUIO( zlVoiJ8yjbjo|0MBu}{zt2`cMm_*`z(6iBi1mqEzen-c%BMQREFqSMi|0TZF#PoK$niJ#=_>^p9R$0=Baa{!$U$AdLkoFWH2p&+gY0+E zfLAZx&jF8(Hx(o=tmB`I$CXOCQ3pc?N^gql)4gAU%his3l>ZKWwly&rd@P+K46<_g zfj4$gc>}i><7&meRAEWQvrB*QEh!UCtxkJyxeEIQ68GymYb;?ka(B)o0!-5l^%|wBLd*>7Prbmc{YM?I_mZ z|7asaa+7Fsl_1k|9!=PkIjmg`lG$r@Ps;_nH(Q055Dc*~9LRBWoLey34^*wHydvRQr6N$+3UgCW*>w^GJKlk{aOQH6ta!=|G77hhN`0_xrJMZH8 zsz0+bl9AnU<7m>VK$k=`mYg!7&f$@#X|hpQ+8Ql_J8FhoR1OvJ8GC(Gpjdny>kdw= zn^9msJo8@aG*vyMTYnk-|aFF>YnQpmd$-k_@XYLTKNt~URvKM8jGvze4xgmWV%9|)x z!etkIer($}Sf;Dk{yu&g=^+w`NZ|PI%#2hWAs(K5^xj8F1CiN6g2y*?5R|tuvF5X- zbeB!1qByT@gRK*8B|#F>$|IWXUoJsUnV$eXK*GPHfJ+;8NU^)Wm60*uQsc)}o>AdO z-ZXt@KHoYv;xPuMo#Ko@;THE<=O=?ma8!ED5(fP*>brYj{Ea8DQMr@*2Y59aF!~3u zJ|zBjfa==L)G0IxNXgBJw^%GnxAec*&xir`*WzP*PAn1YR8PoF4qM~rIkN+|4;R)* zmy4w{x(D$8`2=Y;exbkJ{EDtWtU%ydth`2Pq8lwT^ynxZ7f+n5CYf{gQ-6asmDMJ+ zvc}`8!6jNo$uDdO=(lxT3l;pBEk6)^4rIZ*fp>7P-G_0P&vMgcj$rkiM4c=*TeAPO zcy_o#U`RIMczbCUxs)T6)@qwSN1*}n{^5%)3)}J`fYM(LPP3VFj^)l&DX;!4&9wVy zm2#IAm=FR|l~<}9IpyiJS`~UDz}lNSMN!k6HKB0dB{2@%j_>MZ7ZGtD*^zd>4Fuji z*M?=*zJcF0O$9hi^VFx=dGqyIbF*oB9FPBYIX*c}1bkM>HngXo)n6{ftGU7W1eog@W% zSN!TYM$X~#t2+Ou2W9aKb7H~MBQBE|jtAOM8pTA%IFu7k2m46}j7U4rc2m`>7TEZU zf}61#)BH0`74|c*<-Bx3vKpHqJ>#^*E#|{<3DpUf2tsL1lAdlM!fj7(+&KL~*yFN} z^k|`u2b*kc9;))Jf@c`5)3s;A!cx5aoxA*db{f-{DcLlObbO^lfCVT7T$=JVuv!*H>t*xCRD8=-{ z(qZ-Z3Tl2gZ}QaUUQIFQ?R8!zsmK0i_<*b`Afz_L@grtzVy9FP2Tjl){HxnIGCj(t z8^bOic#!CbhL>!2DlbOUnbhyJ|CqOgBTy}-uB#x}1GIv+hJDk~ct-qP$x=}Rn9t~N z#oRAE7I29$>INFsT3-(`Gysv-a~iV6zXOm;x!<#DkGx!RF$|cWJ<*{ukJ{@YUd@zG zDGK{GGLybU%?kwU^Ach5F4k<%o9JdYk8I-jG}fz^mvk8&<35LS0fCca%0;v`V9TRY z^o<4Pa#@r+^}0&0twqrO#s@4%FeWI7fK&aU82KM|xx)$foF7NWLbeeezQ#wyJNtXV z+xmni_6i=hP@1+`>4>of?prByb<)I;he~)r{r)EHe>x6r*|Rz zp~@{jL4r5m*E%)=%`x)TT@z}N8cQX3KVk~q(pkOqMfNEiz*i948CHxgO4 zjT^0mf$FasR!$;@ItzYnPusBPiqS)vgap{2_dqBaTApW26Ia9Iz#J%(9MjODpbNh; z1#ZquX2hbA)022^3&&%Wl~iI=_~(G_+*=vl3Z!cw+#Z|+Z$PGXtce7!yR=!J z!h`B5H;!Hjdu0uwodmX%S9sTa_0l*gXR=H~Jn^GUhdh<;(>vD9Ti5qwHZU^31LFdC z$-5t9i2P?Ym*@1pyfh~JxjFfE{7UhPG1Ytxxl59}alBPtxfNuJN?88p=T$gAnnB`G zR7YcW4N{GN{D?~EUd(;!tAb@PG&BCHfl67H)WXLW5C7kQ1Lal9VIX_1&|;Pq)ij1) zZTDY%@eW`^xX!e6I`T1j`^f6DDownsC>OSdOgzz1%=D^+MKU0D7kKL%(M!)REo#bV z5V+hPu3YbcuXhh7x;!RLd&rk`|D!I$G|TfRt^6f`v&p`i(XU$G*SVtYQA^fzhj4xJG&mv6^S2 z>PWPC;(%qJOTpH1-X}B-QbievptalMIyt;c?>@yd!* zUPhed3XrPZGRwo9kzHz$O*NqDF0j@6XXD#-#`7|VQ2N@)k--;K%6#9fx#)%supgGb z$?f8T7rzVJzVMap!xzpP(Jm5El=9DD_*bpU1Esd-dL{beR%Rd}igBEwELRxGBDE4^ zvS`2LF11KcRoO%>v@4_4UmA}pQ435Zqo=>iPfb3orTlDa{mtW^RkB@G92$2XdM9R& zxj)Nlg|;Eh^71T&|G&hVLoPZObC8L@hov?^?A6Q04%~V#PfPB**PddQYjf$q+^WzW z5)qr0UL4w;2AsS{g)yr5Q$?Fhqm_j)DjWL(u%v$npju?8f#y({dsELCJz;mFGg~gX zM%lbwaX_2uPO0ppTj?hD&&YahXe0YE6X#M-=?(7vRT%q9d)E>b zD<-o3`%iuckbetko_h(@AkP#|$*`ifgGoY$w3n_`u&#)FhF_um-)UNHfQ*GE^ruB9 zBBU)#4r7T|zvj3x*<^e{u7ww&#fIN;A_G*(5(Zm8Yc7o@3)A`l52g=PAgZaHwT=pH zzuN@qZ36;e4Uy1OmHX_EC*k!B1)|8v6{7X;*f?jOLC>$VjhR~-cJa->vtC{OLsW{E zb-=>{0(uCUI8O4&JuXYTD|PY^Yrl0Ku|5*1U0HnEs!Oa>SYDE{*sHuuAReJdym+SS zV}43xZlF9UKqDZz@DMjClp2OB8_ght@{<`5Eavzs*7F$C?Gwp&X01Vh45S3$D9_?q zP6TL}G5*|jM&M*sqk&&UdZJvY!9pXmt?W`o{Ro=|#O?b2r1!!zV%UWg9S0;hlV8#u zy0g#p6o7~elrbLOclm|o41rl5Q9sA66>Vaph7neYTUv5h|F0L0(R>Zj=?GPu1az3c zwtuJWOmsZ8OViHJ8L3zwJac#6cU1+OeEg3%q4j$MQjA>7WYr`9GBbt*WZPYL{vsWq z=CdEW+?}epR&V_*|LJd;e&g_kezWw-?PuTF!cJtDy4jT+!UXH>zesd;|D$^G7k(-Lm zn*jbrg#oLgFfmXgMc(?+d0VkzL$3dEzhQ!o0yK~mDS${mt_M{?R^Y#%&JzsCraCy^ z*GqjOPmsF)hxX;O*cAp=4VL3hQhB{~5(QB77{98Z%Ng1n&4Tyb<_N`gTCdoo1Y&U) z&-{rdY4&HB6qS8ue))Z=k&Gkz6nq-E+T~>)Rw>+RgsJ%F-r~1AxwzfmiD3w83ORAm z{;uqjl@3bxW?ntj>O2{8x3#*4_LJQlT}CWLeZrFF0gcnf0CjckjQ+uQI1W#aMyI<3 zU~9jiV}R5x;x+QZ&p6AY&t7uN|GFkTYJQ(+fy;B|o~{HfT!_yU(MH;C2AyP{kMhTn zj)FQMFy(fRx!g5ytj52Te`A^kzCL}P7cVvqgX(sDMve|wx0pM9d?yMUUBfbI^kd_n z?%kSo?OCq6D)%wmpYpXo1MjWvBzXT9DQg zv8%N)19cBgA^UB#5hXvI*MZvjeM(*T0-w|+7DX`OI^!PAtG2we^2ch)M7q0WAn6TH?7n``~Au_y{{MD;8`v(D)yLv`Huza zK=};^Y6T~gY%7AHIgVWA*b;f*KCZB#t<}+0)7VwkCeIrcv+sD}_RK7je1?PJT?KMk zh*UVNOO>m(2{*OWIfpz=pw%1!I27^Gp9 z?MblheOcHnHc}sXB?e4;xw*&xEA&)Dhw=Q8CNpl`-W=a))Q+*!MaD!+yov4&Gh&Ou zI}aVlBanhkGkoEnOz?z2}rN8b|#J^dGFjDZIT8 z91@X_Bunr?F#Yz^Y~?G*i)TYvz>K&!W#6NtZhshZ9`14P0e_#=Bw^0qF5-kEyq!_Q zZ!PW7oz4?CPu1VB^~m?R%$jlPR?c%VfX`fL)7K00SrEEQ<5A{*1W-(6O+#I-=Y;Ru z*8UPkX$%EJZJ)*to7r2VQ*~I!a8MHI@NKF-`dJO@A%OaWO4@676l7uvLnzaVAxI~7 z3kNQGu7a+7)R)DUvWBh)(p$p(82qmFNpQ`$E1Q@^6FLx1sjFqNjcbzDrTNP;Jpac5 zJf)#SO}(?`N*S z91`z;nqQy28ZvalLIK(yFy}o6-nJuQT>m)7zVb$w z(H@WDgU{M*Y$`Yf){R#~sgr~dk9#9m@e-h81x(M9UA&r@QmMqNP2|uHQ!Rp)UG3$9 z%jlnv`(4NLZFdqA&JD%+qG+mqrguc z`4A&XyX|Mih+W;U^I-e3v5USr!OO6O;lsGIr5c%hT-V~Cb8p6z)(*Fgz83| z4`!(-<4EnQp9(7otExP}$B}!*TrfpQfX$<*tM9v=w~iDxR+#Y{IyHV_hB3j79zdn? zRH^9rcKL&k>RC1`lq96%d*@jz*LGgZbPr)f(;aVPlQi*0x!}MstWRr$N#|K{eMdqK zIdMHi-aq+=rY4hs!wFiIn+GtAY{ZX7c+7Rz=ptxY7fGyT<+Nmq8zAFFe5eDjgX6h5 z_m|sx0M}di$-ZIUS@kf}_a9>)<2|j0DUVm5U%gKy7mgPph=3Q< zyLvB$DS5UgC=GX+azVF=k|3tnm8Sb(1rBj7SLza)5_WY>9f0Z0_rXkurGAj0#h}`DMrP}& zKt|c70WkNbL3*QpCBrJuXC16@H^n9@*Tx7UzkT^QkznJ%Ye)S})>r4jKcYFOK>zcf z_~=DW&vhK}wi;0*miLoChREejAr%QP^i7Kn6Cohr)R~SY#w4rsvric zFO6qs)2Z^|BZ$%lNxxGt{txD!PZ;LI7YKkAdfGAd{2=<(%Up*$r~+N{YHCa#*`avgLkf z?`m2)*}8`Le?Mg!PM3Re^4xIzEyHdmhW$47t3DkXnpnGct&UaMIK;0gJxJ4J=6v%N&fDz9dUC z^JMm+A^>m!?M3VEj5Gm0<-Qo{TWD~Jj+o#z`ZI=dkq?#C$SpQ;%|c?vZDWT6OBCK( zO}01bK$oaktj(t72=X8OO5tCggwSk|z6aRKF0ey)7~h^DV$3A-77k$G*5u8J_dF@J1g?e zh0i{DL*Xi(t&oQ-)Zbl9?IbdWlJcLwd3xf>AS+a5y~iYfbMeysEqs z6hP)G0w2_h?rR>r%44h#`Ww41Pw=6sM0)3Z=$SH<`eM9{#Up=C-S!`2`*OB(=xo71 zPfJsA7I_AAU;LC*ZvZH;UHdY|M|$mCH-N)va&U5JKr7k9*a^nG}BG;2|SA zhymJ~OzZDj2|#FFFNXkPu70;Z2cXDo09QD2v&wAyb3_vHe`3mp8xtQEGqP@ty`UCJa69OVjiSvPMq_ zbatfSFcX1siC*TqpVc~aDgRV&3IXV>m>IZ051}S>MsP}S}U9>vxYTU zd5(g0JYKzT3dhWo0Ecc!tW0cH^P1i=A?621t2BT+w#Z1+$h>g?Ydt8A&UOT3 z*^vjBhJ!`Bf+(tVPv;)sE%WeM=L2Sg4Abi@^ktKT#jR=I%H-&V@M*Vejbi8%`4XXV zaj!lI<6WXvjPhKnitqTbE%5aeKy-H7K%t||95`)iC}qH8yU2=x(A7e!Acv@G(GIE( zdq*CqPGr|W9>okyl7m#8NX z1zrMc+Jp1)@fP5uKfvhoHc`k;PMXYV9uxPL)tS;|5bSR!D|zB*%n^P-r!Z_7tb>hR zf1*R&U2(WGb^+uTWs2NFzrTDq73RP!FcdIb$tNClTS0Oh;5 z>9{(gsVXv?gFKbaDSN)Q`Pc9%8TkSL~Jk{Og%}l@L zfp#KZwXuP@lo!$9T)D)%QFA>HI69hnvcK&H zVom?I$Voq){o)s2Oy+}!n_4-i#fsXsvP-juQ@w4f1sAn#s{Qs_U+|FB2;1Yo-AR#h z57rV@X$6y(C=FZt?4L`dowb^>eIqd6ll0D;exuidxzHuIgezhYg-Z9XyIa30{I)$R zb-C_Vdd2x8A1P&R`mXkKu`g58=GIxI)FdcrPlH)Dw~&V}#=J3jW1y~p#%ko}Q&f{; zq=Gw@8G(^TnNRFtKCa2{38_&Zb_X(N)&rPCN;=Rd2_xMn9btve$E{6sHk(TcU&Gz4 zlu2)8$;1yym6ijG=U=g}Jqa02F_cpj7ZsW9j(lACVclyddw>aUxkI$sMv%Nx&odM) z<=>`_7HC&{omtv9)6Y_62RRN4H|pV%>_A-o`SX~eF1;OVtQ&!7NQXH16gh|46}%Ia zLlOmNy$R)iHL7WzVqq+pG=F4hi2;#jT(9;?2^#+skL3n(hAq{al_pt{d#PC`$CoDs zHK-&uIM+wmmSzuMSUOO_2(9;;4nUl4@#8;jO490*?{)bdsX?ff!=|EoEMc21_KrpU zV}s4Qj0`Ic4EC>*wD^mrdymB&(}Mp>l}FwxWj?)Bn?;2B5xo*H&qt5%`0hE?2{w$pab2^xw<%4&dKueC}%ao}0{vIHaM+Ws@>xuyqo#93f^gj=8aSh$CnxAFtb} zbhP_JCRt*STzXsaKKfQg(z5MFrs)1Mx=vWWO~z<_Z1bAVM0;pmDc-dWz+6DC5dU&8 zYT3A}_}7CQC=pPr1|tva&`A(#CS=)_#$I$d{tGg zj{_$vC4*E;*5?z=FMU6!nFML0f=Mgje>QIw!6D#U^-grSQ~}&nV@9C%xrDSdLrS9; zC#l+CW$U&4uEg-~OlEOa4{!0Xp8X!(tWgJ~@ri#N!SGIV(rde>&GCnnJC89!KON;W zdz5n#h>={HgT9x0Vf;dXOf#Va@}A>U?jfJDb)HnJdP}sIRQ(;$+3WSuDUkup#>|}MwmI+9&$ZjaYQ+N|Au;)_`w&nCT zuBDGp0g^$o_>o6Bc6s9j66kN;P~ElFUTe3UB&ouQa*R6+KQb#!lAFSH+=xlH z8H?0Sm{#@qO}rD)@^rU|bc<@VEDWFT9K$NLL$RvvK9eQnr!n_SU86GIm&n_C?#1Ur zy9tZbh#N}H1sKfV(}XsR5Qt2K9^q$Pei4-+!0{@hEv)n;NytqZvLB5v(QIu-+wO@k-Cy*jWG9nd| zN8kiy1yd;jPCl?9DLhcJ=Dd&Cj&n&BNCT{XIqPz7&PgeDKXy#C>f-;d33mr-2$Xbc z5tJKfkz(3R(WP$njqL+FaM>}vVD#Rw`2llE_h!-T(YHftD2@<<(otS5N9eN-X9Se? zD{=ICbE9cvIox{I-4x@?i1G^OKQqBpus9vul>910oImy zuiJt`{N+(+H{`Nl>?I*Vl}+V&5EovTEEW?kp?CZAY*^7b{QYaHQq z7yBFR>|=V~(s(kgK$lBitH`Ey$RkWsinF(1Y9vf@tI}-wVQ(b=0j^IEO)Z!Q^Kfz$ zLH_21HNOGv_|HCG9y??Yr2%|<;akFDDt31Huy0}PUsgD5vxP|_S!P5>4;Zv(Y zwYo7ub+)-5=>}(VIq3L#4}pTJk5l zKR+PUAT`dVb`cc=xCj0OS+>-*&xMN2BpJM6Ahe}>X-No86kaBXy#@^)>0?FZ772=^ zWtnpSiTXTk3@m)2JfXx8j5J1ph(}L?{5>h@ZRn)A%BcQOV6jh@0Pxs^-uzS-SM0jmPzT^8fc+;xNxs%A`F;Xuc zZ{HTxNaH(d{Wj)&o!q-ckJ~Kme^Bd$)*9!Ha7G@oEv{ z_D#?-eM)I$W4rnTfzW|4l@k^Q!PgwE{04)o?6>TGAId#Slj=};m9#RK>x}+x#$eHv+eK5-{2yL}=IkmR~9|m1&Mz_tIrN-bndOq+6S(ZX1AFEy|G&^|WD4kq-q3jjR)%rIvMpl8m9{TbEblW|Z?pNNy zLJoo1q*8qai~YLZEQ`0CQ~3Su^a!-qQX*Yc_IxVFwwMZROSwLuvSBF0|H{_AzCus% z9CkGNz1Nv+7yB zPf=sHFtoSCpko2>s^Ip1SV}O^ogtBs8W{ySW{5aI`)jk_Pw1qVQenv}7vrNDj%Jfe zG#K6JFe&P$N{_q+MEzOp-_h*B7pk2?UA*a08g1BK!MRv%B~$&EpYRsY(f0I1o33@F zL1&nO1R1t!?*XN2*1psy6~SpEj-Y>TcChM(O?bUr)m>K~cu9@#f{eTrDN z!DE-X9%1x{dW#@ukK%t#&E(P0G>{Z*!eD|>wwcY{0Qx!pwjuYHDSvH)0=TtxfCFj1HJnh1bbCN7$= zCml%cagbo@??~SDEE60`HQ#>Zt8Lh`Y#g99h zAySjOCty}21)7N>ZvRjx!32V28HaW1D+?_g94nrC#jS|;v#WQZr#O#pDWS~Y z!UkGp>HHGm6doB~EF|M%Jw7cIxBr^*nTn;fxV@21Zgujy`5R!D=qC&p!E(~8Fd@36 zBW!6zq%MK_dY*e9!l>~r{hXz_*jIJRfgl|KVmvWOedNyJULM0Y^X3|0i~Ij4Xb+QM6Po@%h_VZ3vmh>zZ)G{7~hfD zhNn9;a`}7$Ez9gc0yGG&ilpk4;pHX?hBApEPXA8MDx7rr8N&=IVH8RXeukR`JBmJu zxgqw(UlPVwEEd5%7E+^{MI+GzsXx2;TW6W0D7eR293s;z%Z9hH?jEbObL9M&sn`=t zlbgEwtS_V93&8ElFpO`$$Dx?qv5Sh**Yh}&ehC``HT(WErAlf8l?>e2MYXm_JO4((E zugWCmRH+}FELp5nFqPKWDqw7mM?em_K-(D#{pW-7BY(|Z^o`ur0Zd= zFteZciQU04n-09h59!&U>j4;77@cYEgZLOq#=uXyZ4c&<{?Han=5$`_dNlqpp(K+v zc2b$drbK2mxF$i3IHfuGs(MHR(eww33rHuw$+En!L~p`3Oc23P*QZ|Zt(YD&Gdkdo zxSfDT23Fs|^lc*u_)H3qPKsjDuC(WhuFdx~wLnWBE6$SH&xScD4sWheu35?6&n_YO zsXsDaOjo2=W^HeU9!1-*M^%<#5l!d%pm%oK*5kjB@8) zMehwKR!96aKplFXu+c)U+xZQR2SNUry}onF>NzeL@uJjHVufB3yM;6*L@m#TSzW|g zV2{;WMvRr`7d%njQRKX}g&JU0WgGVPveRN+18-pB&jSm6Z!wCyVRnasqfnYdWVaSM zK|ZpE8zOyF&#&b|Qys3w^Jys8fZm&R79+R8pK=+<+v-h*OfdkyAa-A zx{G$eolaa!tUzCS44G$VSMLqBAYEhXXU)66*AV$*VeBalIZMl)p~TpWCXjvuYyjBC zb|o_)Edy<9u zsQZ&NP$jJ7WVZf7$FI8FQB0|o1k#W*4=g?sNPl;9C;sK;hh`xbLDzY_U(FA_U7XEx z1twYvARCR&;4;h2U~R|CrLP>|*R#@Bi8bv^*PGdy6V*gkc2tH}j!wE|*lBS}(A!kh zM;fi)Zb$WmX!LIw1uduVLE>WqiHNs@eJQl+-|K|n2CL72{TMtwXys$cibKfN%dmQt zq8YrEnqP%sGqHrZg^KYE5vK#8#@@8%+C;U##zsw_8o41^+Po!}c~bJ1V39^N8=lV- z@IdbVhM>-6-lJS44D)^pX5>Rqw!(-_+mYgl7%A@`>f`SKj)-cgM@OAhL5Pu+D@rDE z1>``4?g5%@Qv^7a<}Z{Di6Ro91dKV_*2!L=iLn)_K%iwMTa)BXolYmc(Pl!CN++tK z=0`Rysc9$f3eP+IN4)_vpHGT{=8&ig5oJ)(73a4T8rS2)O(D)Z>7tY-fNE$TN}8H*a+9H+mEFnN$HQ>!=@)>CKJ zP@Dmqjd+s_>eyHTKtVcGJiTq-zCTS=CjKy^PlTV=+GaU%@o~nFzO#OivGD5?85d!4 zOqY-ugilSCv1b9eSlBAGRF_lD3#<0Mev5>ww$4s zODT5-xDa9p+j$CQ3x^@U(up1Q|H=DxGfO=Avx2-3F9o;kig}<_+0@_4yGGf-2P9LH z$95q+4vCh3{E(cPhl_wkkOp6rhrBdu8tNCjQ(R`^@TSc!-8I}p(B8~W8D}0F2203l z5}R1?0L|pT1HCiV8n7W~4K}V&*<8|uLpe&kVruEa$xU5PCVkP+l%NbG6kZK6=Z^Qb zX9C2n`WY14&IuP~<^VYhNRQ3RMb2v@xlJW7^*suQFnm<0KeG2ZRRguzUucFc|AWOL z75pov3L`6mSVFRA({Kkafj#QlO-kW79szH)6&MG@a8;WfwdSAB@0@%R+#VZB-wtxD zwMZ)}z%^YN#OzOsShe}(bK%2TmBRw##=|G%Jo2JKkD?h56TL#N@OedxmH#@Nc@4lL zy#4{9T{c0QK5fN1<^AO2KMJZeC}$j&A;PGe)?qFX`yn9x@}On)2xqh(??E%0dmJpO zc8xBWr@nDEGoE4Pr7HB*0cS-)-IkF zTQ@iG7mvYi-Z5#IRsnD5%A_o91vD=6`KS}LeT7%*IU%=Bv+{a&ks_tW_Cw0`;h z2FqF1tYgV6)^f?RWV2w5S%-Cv4&UIAW{MA&g|32SZLx?QyYFB9NT%k10l^jqgA0yX z(s&uus_n(nw>dtObw<_iB!11gGh5cpmtbi=J6%xs6N;g8=bOh#c3}-~G=iSH^8>Aw ztH?v_t09T5VH0;-BDpM2wNimtlP5SlC$`O&$W{29I;w##NY_#^PmD`A*fv_pTfp9JEm~kr2>)2w|A!X`8Vs!c_$K#(AA9#Dq^T>pp9( zwsg853b`OM&Yk`^rrof5z2S93-?g9~G+Hjs=Bc3yk6%4A0Q3mF++=P|?^eJ8o{ed5Zr0mN+olTpc z!D*Tltuc+4ke~{B@Qy7!e+JUp^#7{IHR?M3;EW-uoTaIVMkkvbB$I4>*ZxBvkuld^ zeg4)a)d^K1?oE|$2ETg|AhQdeQcjwn!yDj%1i+61)6KcDjH@XL#oJ?w4%{U>N95Xz zBKM{IRWUlW;)CP#I)m+u7yo|-K!qI1!TenZH>dn{4eak)osmiilsCU z0<4K5HYhbMZp0$P8#qS(w7o%ES_S&!6{DT;IZLP^GWZ3+!KMBMtOnA{ETNtpa~qpb>bZ&Nu}E)4TJp!4U)$bYOHkfdS|ny6yfvJ z0)XkVLZxl2(UZz_EA`4UgNIS7?%%l5}SZUhdp; z;-i3nG{Y=cI`yRXDog>g&w z;wL5zZwpyFoho{KZMUlq?gs_ht{||xgXeJCp4Xg8H5oxG@uI#>+OP-$hdqhxNurjR zX%X-l#fmxg%|W)13qr<&L<)dQ^#!1|kUad#L6`P34~(JbE?F9u0K4~G+B~5twlsd1 z0jV@_WC%V{c~sK;LFR|2K#I*?&9S5}d%je{d^I6`zX=`Qf%MFw7N64rtyX47MV$mB|+eB z$T<}5|3&==0^iST!7~!WEmhm==^EEu)j_sapbo31D>x8OPWGppbwuFD>Pyj>H-WKj zM#+(kqc;p)m4yDFxj&o%#o3^N_>68-@>}al$DLX8TS--NyBjVm0@3*$yV)u;I*~Za zr)Y_U5BZSdCTP>HW`D#)3!PO=^+=>_QXW+ju#>yp9(Rprhx%Rj5ks`npSU1Fl?@3+X zRI$gSBeV@IWwYAzwG*Al;-{=K=W=%#{vRX4d>^s`VRPyisQfkaf4YPzMsE}@Vyee3@Kx*m959UY>Ng!cMUYX*nPl0 z+&x8keb4ii<1o&}jcFjQ2$xoXSLh3bE%fz5J)Q`hBWLcRAtK zZ%F5Sj72}l;Rz6p?E<)k(A0#m=J@)er-Y6TdAJ(e43}Iiv0qW-!?*2rOGSBB+zR94 z_8Qhi1E9|o=9l2)C^2*Q^BxULOH;L^OFbezBKfMy8x+jdx5E|eKzkf%BkxnFU}H53G{e?~2O|+hisQ+<70F!ff>G%ONcg zcK?r<4>m|#8+rZLV^=B-7%>v%TnmV%BWp#uh*0iqc~i-R6`L2a-jCjjJ}F|y9OI(H zIB8wsu#Pk~AGHw_8ev@hPKZ~td{SqK$wSuHswNaaCi%HWmm-W z{ypVj;t=Gp?BYlv063WmR4ef2>K7GRNj5kX!NBY^=M3Mg2SI@IR*83 z{6{Zk@#q!6o>dN5s9wb>Z-@JvTiPTeSvxz2Osu^4_;_yP32X#Jo9VpQlKN*_%9EyL zqv7-RUqC@u65}A0?b9z60%@}ia`6n6RZ#BTAFq|ErPVG_F_$-w8}H!M`oPqTbF!ai z-=AJN+5C@c*p4DbOays2*0$$G6_KP!4=KS6%whBl>u1X5)*pOQ0SS7put42E`#?7m zf^V-gZdpZAimg7f4SZEQPFM>J?9#ZcxnO;__9vA1kB$)5>!zcJp{p{hw$ZXFCq+E8 zn|PNafg^g^XEvzQ(fDEvJ%`&j3H;pX_EV_ z`mwryonDcS(r)KQ-srvVWjKt9gWW&?KLM`5AIW*DRAlH)VzsY;>0jyQz1Gz*vR;$g z;sbE@M(4NNN~35$P~9%zHkY(#j@nzcNrey1&x!fhkEWPylj<*FI3ZUh7oOt(8Uix$ z$s;eUu(Q9o#aC}37%KJ#2#c|l8x=c0HD~AiO351FBJeec^eS?Cc>~IXw#ib(oC8M! za<$}$NFsaBiy47=nqf_rQm_toXKvDn3$OMo?pnK>iz3bL;{kWma~Iz9r6Z}R_{x!x zn-&XF#MO@LOdOE4crTucpQV0g06zK0$P8=wz_2g^b~ehcp0muo4=F(gsj39;sMx=a zwBSuyd<_w-p7m^aWIF>hMuKR}GOL({Y2HM*FkY~1^xVu)oLCBTiFmmnkZ7o_(#pJ@ z?LnwPu9S6J5;q3PTe_x2tLqGJ%^|6Xo%0f`TZPjq#em=+N$n!=kIfVG_>C}g(I_2q zJ+wM>p8=9D5f9HQ;}=^jH<^L&EW%s13a!5IRRU=E|JL2tH4q14-eF3hUFcBfwY*QxEysdni(s};ImG|!4}p#DQ$=8o{C%h+%_sjRU}9qB4;6Qo6huM%iY-DENN zUh891jqXp-BU|Tpgmw^z;MdoYTDnuo$Tw_KyB^6U*$z|@#1bKv%7*J7OK9|>`i@?B zthb(HC`{!fxuxz)L3(JAO%9dSkYX2YmQUdLT-LIlI>|OyJezBXvIjeNi3##XWhgQ= zmQb0_aXskTG}C0$3%0v)P_WSoOWx(+8$#JGdWax$xjg~#Ha%D&aI}r`i^)E8*&$6F zgGb>-6`o0>&7;r8-;U5<}qkMg( z&Vz9lWBrFB=+0eWy<1mBBr9`F--qB_+G8w1>1TgYLm5R}u^_o-x2n|BCe7@f0Tu@ahAc_N>asA-zo4rM$9Vk)xd-=07BdzEF z6T{OuHmp9AV9gj@A^LfsW#Hrn={t_kP5i%*g{!19<<%E4$ZR3TalNAcsyoRO(K+Ly zxjZPyJgZ4NxXfX`Q4>hv#2+o=oUC==wFU&U6o-hm9z-Ff2M&)F+6My!-Pq?T^*}*{ zES=du5T-EjW(#K~PmfO3PjW6(UKKKrL29Y1QDdL<6W(9uto7$JqYXmL7GOCsErzlW zKGdDwi4glZHcEtQ9G2@^-w2Jj#j%;J?FwOzvbIpg5ll}&+G!138}hTW)!)PrUv?(D zQu&xhUFjgf@5-P-6!&x$i7MrT;CL3EpDdy(iY9WdGZEX93pW%ZVlILY)P3w^ZC_C{ z#RU>}3=i?5PTmBeY3|!HI<&Xhm!|-=g57)h5=6i!bLpE?I15XejGX!i6_k!oq8Sp}hzR90{dlL)!J`fY;{ab>@>DyncV3 zC?xkS5}{1WlKhhWZ}sMRcr_|oS+29LI^q{sBbQm+3`zp#!1_J}UK5uPQ&!r#g3z!h zr;`Pb9zgX*LHun*Ivd=;>)OJ8l7AYYnxY*F*qD66+(*|#v^5d>P~jTnDdAeCOey=- zPK^Jl1|R((fpwapfl4>H4+MFnf;U?0SJey0Z^(o+wzC!o5WWj#pMhm5HOovH)mi+` zN)V?hyA-)P2?|nUw;0+{qfSIJfrfDCtg2N8e~r!rDCU+OMLExxua{(A1#Q?1I!6jL z3!i)?^Q9cC7jZXV#C90Mkt+v%nW8$Q^(Lz6r+p+`axarN zEWin~6yA%gj)?nz>OmLuH~6ly&*X<+to?Jkk%w98@yDkbIw+m8v52ldNq2x`LA1j? z8}K1YC?Nx!jX6u*X4`!f9QRPS%2lC@4)Zf$JL!{1U;0lt3?Emt05?%S7?a@$r^DX_|E3(GUc@7%f3pU#TN$c#;~ z-M;o6=trxHOmPUF?x7z1&IWmlpmKukjoJu7$P+XZ^d`5T%LvW|WH4N_dYNw`mao2| zC!sPSC|%Y7>u-kGC&$D+C0zkW?`}K8mO&-*vrRJVkNw-#icfmvNQ{;J053q$zd>ZI zgIc^5-G95|I)Af&=6L@*-EbqqyVXzFtm-l}EgCx4unImW~~Y-&NjCDwRLFblk6B7vStJ2bl?m)(OEW97=kJ;bugQqf47l8XUztUMO> zSs?S4@UeI@iXUlm1vDF%pa-%ewaGg#pIq~#ueb#MCbuGq790NiVQ4I2fc`i--uEtu z%%|(;S4s1_2+GQFtd1P^;a^`Cda{QQ6Icko>6MQiMA=Lbv|fEiJo#nkhL1$ z-s28Cqx0S352fS4>&>el157K*%Vi|!Fk=|Zt#KgypwzF{fm)>7?MOpm%~VZ-Ix8*n zeE?&^#Ia|u)B4NG!iTH8_IXCJnNLAG*YD7r(9mHKULA~fOhr8JJF#qN`C(4ik3zcb ziptNkDT(1I2BHW>Ys#=sUU&(36}nGOe1m_FhDi@-?@b!?^C>O9kL45NDvC0ek@w?? z&1*X)b<;%J*-jDQgr6I_10=J+bH@a>l70iX@|ci?+4?^%{YOTf!0s%;c13&bYCBYF zoLpKps=SJb72!bsJ=p$u_nw}e23pdwnW7dZh)pwkS*cXZ8RzP%2T$U9%vgbbrOSi` z8C$Rs6yI=Dkq){cC9eVt2|(ZTYY8QwmsJHh&4i2u+}i54Vmf0}7on9nAV_kO+~}I| z@`xWJgDLxbASlO*kOlU9whOvImtU3jJl4giW>0|uPD$}9k*;@`D+V!|D+clPJ8oKW z9gdqbKKXJ*8JB+f2Ep||f5gP+Kk%4+Jb&s<-ptrmupquL4?d}#-*^M=%CYCw=czl{ z(^b`)Ek64AI;YGbf6q*8Erak>l>MAi|1KXAgD}!u=SlaBSa-Dzv!PL?&0olb&iWOt$Of~HFK5xUx}~o_dn%0pWIzN1vkV5Ln%Bw~Jv_A$Y_GnAIbu1uGSIf%DwV(o zFa)|TvJZDde^Tr8;KNYSCncA}HfNb@)X8h`i-=OqoAas_I$yLvs>k+bdKz>1ihi76 z23Yq`Q2*ZRIr=rQ#E^RXa!XlN-*H614tjx>^R0x%v$-?2*A42e>Ys!TZ<&R$`}+`T zaZHFz5(6YQ2^L*@iB;D6>4F`QuhN-~XJkG58ws6Xj~U!oz}TE7+Y?$&*a+nF7O&xp zM8C)9G%2ST=laqeP1Ett%1z5 z7jrp4zb5@3hzoEtqR`G0JL`F7E-!R_`0l@z9+&4C8*{=#8^a4FBt7_&v}=L8(m^H( z{1|LN-w-h#`(}U~75l)AD^^@I%^doMlYP3v_{9tfK2b~cHOaJ0>42sKd@Q4vn9oFV8x8`Vq$%#=;H>>LQuGOCE5#X*y*Z8?&=$k=YeH|uuK@Hxg`YBtzy%E zu*X4#6^yG9sfTSba7AZAa*;cZaRV=!b}|b9E+gA7E_^L3Q%k^hN(R$k7h|e)fxw;Q z05-al4~j^UHNAZ}P;RV#uOFki>i&Yq1Vh>!?qnLlHTxp(FLDD+LI)lk751yhQJA4$G>Aevvv?0%Kb`ed@)f%1 z$hHi3YkpeBRlabg^+12x(-k-vY1DSfmOG!^3$ksu<~v_h8WLKBgQ24Wr&pv?^V>5cj3& zgyqGJx+5f?-!^ICo5ja+nl$b~-0*)&Yz$wN~6$wwlkW3a+Jr{)| z^F{Rq;)NEmZxLDZP#*%nfLPkY8(L~^)}*{aP_AsFQ%{m2Y24YH4$#GnK^brPZwWt$ z%eQZUZf034B(rdlkrMq1EIUvlu|4JV5D3V5D#W<~zJ)ND%#!EDY+S|DWKzHZ#}vY; zD%{uWfrHEM138!8-N1EoXDb&_HZ1{x5`zyqh*5_o1h#RD*1+#+uKD)8o#@jD#43gJ zU@6kRe$kydJt+`V%LIFUar)SY9}fpA17X$=!o5nk@86gtq2qYVYZaWT<9YRj9%(j@ zvoc^=RYMm&LR5ow1}(o~6ONKj>W}%U9V1OUicWI{h56Q#)l;e;Y{tWCF^{qA2e3;u z74GO8mzB2=le;d>NelZ%(`lnE&Mj$Gh3dl&NoKG;dRj@NPy1R+fvp*Fj(bOv1*xwr0==8n^&kRId`|pRM5a;hq)0=Vh0ON5vg( z+}7vMFdiwrbA1G7O~l#?VGqf*;i4kgOKj|fuVeDM3DQ1QK@0b-lO$bv$e+{_m9hAfnD;L@rp{Ux~Y z)LvLaXT;;?Q{v(qbHtPrxlTy=%z$HmQvX=liHXSo;c6+vT~7iyrYTr6E<#$gQl7+V z;YTS-ZD#1>xwWq-KC!c+uOMKR%=rA8k>RW=DNfsl0k8vDKA45C6$hQ+B?C2r&~1h& zB1sE{;=QGE=jUXsxml~uH8ouO(@o-!S@L8Asht3N6jP(paz%Obx5 zYTqi?8cOarz9$!IB$YY6@YTh@k)sW5B!A_`1{@UFw+P^77sCpkVep2ft&Au!1!ciI zuHD~yB{9J>er;uBC2{Q80Z;#1K+WrrEY~x7p>(^MS zN}S4ue~hX_uh|0vE>7DP^sDNn7T^u;$%G9;B<6 z2_`wx;NF~O>Jdb>!Nzsq&RfSUprH){HpXdB-ezH{PgQe7`XZ;~bF}?-a$oB^Hk1#P zbG$Y{|5FH)#F>%Ew>YWtorwNE-I1^cXVhgf#A`C)r7%g$*`D-$s#y^N=;hjrdV8_d z$x^Y>C41xZwLoPF{=PtP-WrBzIqQjmQtzXFdQ=$3s7%kj{PV36C2O}JFu%Kpl`4n{ zgaM|bJ8D559DujK(i#PmqU~L{bCOSDmXleNHpOh}ehU4!=lN*}5t1#|SI-RTHn|ef zbr!;b5b=ab03|%oj7_+hFX<1=3&vU%TIY<@d3p6eGJv|H zd--kA0;8Wm!s!Si8^jjpF2|JLS-k4B*VDl^n%*^C+}oQIG4V=^y+=-9KJ9yxZ?=ug zYn7orNpee>Iqszcua$BJ~bw z&+K5Pr>>q9xv0$Zk%eLLi>!@kD`y4awV-A@f4X_VgthU+SeP!=EJNF4seNvrE(u-W z(QmBaV5?OTmNa;_qZ)=Y5oIuTFmq$doio;}a#rvCq$(w zbdLJFA8*1_!Slk`(W$mVvE(ZQch85LneAA!K0o57?cErFFW#?~ZYRN5!!(Vh@FmD4 z1Pq3OQxL&*l>=en-fGM@iyIzg9z!-`S0n9PU7GTHP{mMvL@Ord`_Y%A&J={6N2Nk3 z|M;^}7zIDE%-pBTwBBv4QnJB(tI1qI?t!Nb6#iuJAKdjR$)#m#i)f2genp=$3MyF9 zTDiqkdR}$@p#gO1NZSN|WHl{p#?+%phReWu(7X)GQ-)U}+K!J4wqDHQ?8lYCsRmQA zL33)1KLkJ*TW?)9EuwbFBA+cQ#x&zm@k$#7MOJyH9!1J(EaEKz1y7X-WIQZy%3Q!o z8}vS=RX3F#=B;gk15Z?pD0NI(l8xYWJ98BOc{^pW{~ZwPio9qbT z0yqB{tm0tXH^1v24}Lm(?k-PoRKRd{z6U?B5-?4>%G!uqdBco!xFeT5@uFNaB!KHhLej+MR!>YeXx3M@6%m-W663x zg-32CFFBhN?)G!pMRFC};*`{5u9h{U6_JvO))NJGo^ntAMUj@;gH@G1}X`yjM&|{{B|X)A>Qp@5*+te zq*Q#Z7t?q(6c6GDP+_H75z@~&auUgx?56sdEwVgPDrAi;*wKg3Ho%kiPA}gLO z0&n1k3n4TV8t?_>~zcZ*!8^0qYciso-3*oNTA4m;y`RaC0Kox8qBpS{OjRmubBMiZah;7Q zYNw(Bc%U7%1VI;G0BB?4*5Ca(HP>Q8fhq`@PY(^gVSTJL%T;8{L#D?E{XJ5@+0k3K zUVj!3ueZnC>Xk64Es;}KX&Rv0vdAO_MF79`1?qPZ`Y@@3C1~`bp`C75Muqfuweftm z^x67?$!5M_v41+%swM>lY~8kk4nA09Nc8}C9YMFEy_VSXA_Eh`i%zc5+@#~ zj)rE*D$xhB@ohw>4MV2S*(#b!mNHses|MTw3d$q&PM!Id5xv{u2?a5sI~KvTbx_Q^ zF@HR7xm3>f{`KF-nuTZu^5lO1`F8?1sQ!uZ_cQdi{P#_8+ix;XvfQV1Of zm%C#>C6wr+0gnEhRZm$oLcb&o9lD;SMuITtq%XvcZZrP>;3`u51z;SZ$MjR}}* z;7g4iZ3}J|UamnTBpF&_2K;PHVfZdL#tbB}-Npy%7iqryb#-TSlR)mtvGrmgZmZO} z_1lzxUM3jh&?Zas^TfSuE7*}44BPFLB6{b~tPnmN>Z4&>g(VH7ap!!m^?obDYHThi zCo|fUf)862v#KIw}SgE&J*oLEIX3Zuo+*GEm7F zgmI%dFIO#S@>DNc`$sYni}%-Fh6Y!&JmSdrnc)nlubSvIC09G01=+3Yo|?sX;0&Oj z(fL(pQguX9Vq2_VxIr}s!pwiumy%lW?XFg8{qw_WSCs~SGNRBlUF^xDz?y@kEh>U9WdG#Yt zZYDK&A@MrzUJA?}EF{lQ)I50ve%fpHitjsN;N?7Mt$23l%nXqQCBJjJM(#n%zBhG- z5`BUHZFQ5ayWaS_fBG73y#=ZLwFOKIx5UDSM8Yh~0S|i7v+ou<#GdZzfmB{(E)Vobm{Zh<2i%$Uh|mDG<5Erxf_mR`hAPR&5YQ z@&Iv;Fx2FU+Ui}*j_%i2gCbE!q18KJs^Zn?s(5T8LC@W?I#WE9Kbhgf;`KmeHo!K6 z!!HG|jKUB(yp9_NH4)K<1pV*ydy2C7r6uuVAJ zKc+2b4Z*gyk@q;nM%B<1F4ER6vQ|63InN$eZF@?mJoSxBX1K(|mU>3d%b7iC@b#~2 z%8$rxKl&5&DK>-hxem%Z@fU2%a;;@%MKKp`-ZLTcDjtl$@)-Tz=(qj9v*7<@!5bO% zfZ7%RuvQBPh?;M^(2Q^svuUV}QSQ2@EcoMblLUtqO`X^*fzyLcOjB76Y-0N_+#VyI z*yK+b@kELq!}8>l-TD~%^|`K$&g$yBg#+fY-lDT@ri&smBMA}RaCfEbzJafqsl@v6 z(u*brZ0*$EQcb-q4uc5UaOVzG++8!7hv#ryk>{I5cjBR0922adDWMbsQCf%*JPpE- zAIJhq;pf)|YZXjL71s0|aOJWsjt+6V58xf5KBNjk^H^cNV~9Su#@T-1G?L0mS541-qj zf|MbA=K{k^tRCDPpnyPT()%DW{QBEO%u$&3_ec=MZ%m|R5+SP9Z>i>aIFHkoNMKR9 zU-ayzOsu@WeAKs^?f7R`g%X!ZKw9#J0Ou4KFHwBQ+1tAO7rUcbAWmZ5*jpSeXzpx> zrwq2k@sKBSPwnvu=({_HuLKB>OwwM+@9C9Gm$b$(#(BI2Yrz;7Wqyy-M(|-A+Z8Ub zl%TTVn7I>02$ZzXu8i>dAuF~`=c02`vqh=9L7OfeR^fm=MNvOC1SfJR}LL&O>6f?Ha^=zK-IJ{)%JYzaiO@7Y3Z)C|R>X*v{=U^VHHl14@!LSWUVet53 z4EPNLr7c27rA?$sUW_*~ccGQ5VzcJ&mWrP>gwxSbVSav48`UU{p<9($$1E2i3ZUO7 zK@b?HtAlh1=G@`3UQQI1vIbKqlbcOz?= z7Fpxgj-gMC3=TY6r^cq4J&;k+$Sq1d;|!$FVw`Frw?mz@lH8+T-|t_jIgB4IJ_Kv} z%VIL{H$=y4-};!n>ie|DO)(!twt-fJUWbU*KhjT@DCl1TCJ5GFevw9LfC)_X@i!tT zr3z;;>0~yXbBQ+aAU;A8_7r>VyDwtT6l`P_380Ry{%Rd*@--}^Y2TjmPXghdB~jC* zlPQr!Y(e5gRA1C)mJ04rd4eLPgK&w{HaTc{uwochxAVq3ptl2x5I*tB-?r|r$kEXd z*FDzgn+=t6LkwH*<1T*a^Od~BM1jgDWnoB!E6*F zv{)^!Nd0R&ycX&UW2989NWMEeSpIo5Gm|6X_e-5?pns$5(M>I&T$C*Aniq41dxm1) zo~R?3te%u>li9rC?hQuHE%*he?mCFwEhG~C2L{!4w)Ltsv-8Wx%Ec7z9jpUEwjkfL?UH{v^5p z+R>=O^XT>N?Lm73wEgK7*-Kn2%`r16n%}f>**C!v=}A7sUDW;h%M?i@mR;>2oRZ+} z4VXETwS_>qHe2|_d5+wr@S|@Q?OqxhyW+j2d z&ao9{X368X#n_Meu}}Kg;*gL)ejo~B;^Xhqv4`mAS#xZehNM5lqzOE98~f3 zPemf6pK=f@+IB2O>((8LosLE9b)afe2S)t-VK;=GY*~lxv>$_WDR)0G@lcr()=NnO&gJvA6tx0#JwxK`ua*r)oZ4 zV+x0;?G@W|fErtfvx|xiUmKtTDfZPal%Pe?V68nv;3B08`31RiC<)dUN9;Mr-YMw* zPDn;PA-&>x6mjlafTKo|sz$_OW7+DV%sp~_|44_?XC8MgQHv&U4?hw}$^;ihOEO2Mvw!@)NXfg@oJH{^h6 zlqp#@k2zuo?Sw9Mm*ms$Nr=Cf(O9Lev`hA5b1^AXrmN!hV5#VhB7k z=@Jf^bb!ml8lp;1%2lwEhvF9>N&POHNnk-|;6Bk&19QIA+w`QWjzmxu|!XfKS_+TO)8v%&V~k zfM>~D%V;@c9wXh%QLzTYLs_#Mnrm^x2}(0}gaCA3pT1%^J3*-Coeb&J(kk#{8gzE1 zv~0j#ZqTpQG*n6a3m{g_FZ2g_(a=fWvjp)!v27hc$^$)PFG)tYHh;uyc+#X@DEb8K zr0kyBNx=IHf4y_ac6MEuwQ*f!)EH-CP%?$=aIrwYP2Tbw31|sEVNeV#m1%m^fmp0I zI%2C~bAUQ(ml|0<2pfbRo03N`cSyj!7L&`i(m1a(x%5LR`P4S0B2|Ea4Px$9ZY|-U zWRi25>e>0qUOd>T#cX4dtm~F)Xke_%E=}C@NE2(Bqs%XnZ*&^#ZCzt(-vhb+6hFYt*S^`+dM7 z6AVI?ixcXD(_u3VGCTzywLw;7KGcGAHAfiQxmFG+%ZoQpir?MgOPegDaYO2r=h_Y= zQE?j3Y0Vx5088DvnOd_LBc?PlwJFE`4o&3s5EzzQmaC<0nAy{7yYcT5B2sDe_l!qk zbqCsC@ru{N1(M209Uhj1=6@13o(u^u>H8ZMVhcdhJo$i}|p);*-=F9`P!X@*a@yiTk z4Ntpmm;D-NEE9zPr}=x=o5&;)G7i|DwL++X1qOE(rwe0c(DqF& zjf^iTZcfwMMS-*xS#9#BQfOB$__~xxRbg=JsT^OV)y6q13qe=PRk$2{ITP9JF+b#L zMJ);Zm85`e@@-NON+y-QGYma_?l!iZ5jU3EbNrTx4p+Or<r1+cA6_Y`}ej0*+6r&ANSXeqms?ep)ijo+ZtBbM=H zIaJrS;d0?Q#Rw4IMjyf&1#pw=3KhL_51~V<{Qb_KwJ^iwgKXXr(aHmHcz?)wZx3h* za(chUf=}o8&Q>jW(9>O7)Jh0WuP!{yp)nY@N}VZestYF#Fll$vy@BEq;{b5bi@{BX zF5sWKa@$x?{)&?B>#xD>27lA64H@x|Qy#EDn0>*4v(_f7$d=;~2A$OB#gQKh4cs~n zv!H#IOIt(`MyOqt;e0%6F7vLBVxQ7yaiU;GwQCqXgSjfT*0E@KJ_%C}dicg*%ulXLG z|EP*?5PiAOenMA`g^W~V_@-xML}nqz#e{%0o_fFOLGFcXCP>O>Wy$n9S$g(;IIpYL z9}CSHW%bUf;Ulq)`xQ#91Qg-s8fI(iGc$@$n$8C$lz=8m&z&yS0wnN(?(85FbO!1A z1K}akW}J&tzc?Y3l!DG;k6^RJmg^i}!8uL|QB}@y06L!J1^4@bXqZrgyT0!-yj=5S zm2Y7T0d+sg-DX^^4oZk*dt9j0wVI2Kl>hvn^s!C*9yQT68IOJdzUXI(adwNTN70BA zPL%G%?bHa@ss~-+$K8PVB3LKB^dyU4aS;r{oJhdPi)<$9|5<{Hyr+8Trx-8haBqPQsOoz$ky8 z{RbgjG5ATt^G20gBU_T~Jw_oyUy60kbB$l$-z{@cO0UhejZL?V-gAVziPxOpGcR}f)q5^#rF zDPvD1OTw!cRDVO>xr=MpK2c$RhAFsgtOTtE7FMOTVWNKw2QfL|dn&VLiTg<3uwL6R z%z;Nw7ai_7tJNLLRLBKcu+sAV=po+<8UC@o`!$-6!|rVP-f444SwcG4L%0NiwfE|}HCl#L+ zS=%RmjrJ%|dDx-Svqt75>Uphy8j2s;FfKMHt+j(q^wbv>`%qwW>s6Q(o90u~b{$%`}x2aU;qu( zkBLU{cNl(E7YI2=WRDQD`W;a`kY?TO1QM`7ibo>zf0ERU9=(-!Uw(G-t017wfR$gg zrNhSORe!xjG0)Z)CrxnQ6tcK^x1kycJnXU5jz2LY|G`4Y?Qw0T52^?mH2zIAE>b5N znD9we3pG$p!SeF^9f~NGAWhI-SSm`hR8`<{PAvsUe@swnO}!*0XOEWA6ee?k>GQ&8 z?*SGtILQL8h>M<5tQa@CB*SsL8kn{$hOff%frGe?1Ugqz7itYLR(8;flfEw;)p>v#BkunP zyRt`=JSTyfr62i5Gu(mRYgHUJFmUd~Bz zzME(=+G+c#mWjD0tMcnU^I_4M1Nx(feM;oJ;{W@eRyrq+-nGVsJbS|bt?i$2uGcJF z#zpt#1y1IcQq`|Ohl4+jR8c+iepo3R-i?d}Jiq5$^!x9OcMHQ)1XYUL+!1G8*KsXk zEg<*VtIGLpton`W+pidMihYo|AEU2%?nEf^wXOklqg-C^kr#En>?2wFmN|7+$#=IT z?QmJ;qvG@Y1i}I8$|d>;3Ba^dtORqvoU*#s7v>_pewIx)Z~)@XlT|N?oD?Lh${%m0 z(+`yC5eX=#S{z1kRS>F$4c>)b>18)o;(`*BM~b48nlmpGjYs%-_xtO$(~YY#f6atEWXsUA4qf%P5L6wUF6WRw}_V+ zPaz+z5Xc8TxrYRQy)RwKqqeagv?>6|!|Zwo87)n!`Yvcsrz(J~&kZkYtm$ddmvo^V zGLj>E1&$05VpdhKzXy8dvsX+l&cwLAVjY~$1taqb*GZrtoj>}pZtYE1s5idEhYA?Q zy#*{u{uDHfLF0C`fDl!Ede0#bf-Ps52knAuhlKeUoRePu4sO`r{~OH;y4F$FQK zVc*2TOJ~bF5K8CHe>@Wkb#tu*Div}S6-mmkU!LJeG1N4Fqa2xf zcRwEm#(~5@2?Vh(yb=lTFbPSwI1{k6A%sN9=g;%$eu@7MHW9`@UPWz#-+sj`(p*L5 z*+*4f$d8W-%<-{=6}I0)7~xyL>J+ijTLA zu-bzMQZyJ@Tys+qS?b(|e)MtWUG1$EpLuHDpL6>rO6r_43o{@A{jAM_0n!%HP3r7? zIa2|O;)m>`XCIs9rKsf$&8NQJ*{bfm4r>;Uh-SshBdmcz2Z0LLhp`^kxXsaUEa)C( z0s!u+L%#`T7PZus_36b-&KJSx41y`*W*H={_FE@ z#J1jL`WcRKHADWoybRImHClx1%Xt%tInKyIVN-o;L$TYs&wI8M#}gR;jb76?Ci$quC}Cm$7&Z z*_}6hcGqJ~usb88$b-(fIe&{Hq^}$e(%b5e^~*fy#x?GTw0WuL2w2Z9ei@|M7oG=hBIDu2N@(igSo6G zLcsz>i8Sf!=If}Nth|-ifE8OAZMfroqk23B;izWN7R@2lPnARbQAGb+T&Q_4sOY~t z6EOV%7Nl0(a;%p}Hs*yR5RGoVL6jF0t=0_}UhQVz&G;N%J$j@HCJNain)UwLDvHAC zmQ;kXr$wDtpm4L%nlM}oqLDQDnQ24A`10zp(3wmoQ%Fd<(J~jkfH%S_)pnSWl5^n( zgeP)ZQxaaNllf*6da=*oHe*j+;jaGm-~Q!wSN&^+vrn#)0$h?eiwb+L1U_P`$6g~qOLB~8}6_We}qf#~@W7;4?FgwHW|LIj#*rpN^x5ndED^H0IhF?8rfhZ0?( z0TXQTo>{Okd(}4&Zni5_ZhOi_SJ!0Y*^$N8r+YC=vnekmr1icNL-*wVyVM&--800T zoYd$tdV`OBHl8_Ro}pprPkk>WY~jK`Zu!sDha(07lX4w4>Mi|+ahqph6j6?b1o%Bh z)zadKu#}P8Qx^Vy@=0!)nRH*ME1WeW82bjCg`Z3>ZByzwAG$ZxJyD~9F0L*g_+XE3 zAErfc%(FEgZd%!Dw=~BAnN^n|8a``HIuFsWcWY5EH6S^l3Q{VNIsB-zdf=+HL3VP} zdMthLeJv9~SEMqqn41#Hm3=f-t6JDEzy=p^nNZg7)f`1J1Ql({Tf$5HwkyO>t z@{eTrt+9>hT=VRlumQi;xfp2l^G&%qzyvONqv0>CcLm3xNyCwd%sNR{ng6Z|1F*Q3 zcPmbOJ7+lG|GBPWj#A7%Svoe-W5aLr$YdS~_UZ8ylYCau+>DZz9j6jXyz{BS&I8`2 z%$nQO6_hsG%CP7A1)v!9mvNsiRtl$b{SZ)&I~y!4@2H(tG~2rL)` z>ut`_oXa>1TuIrs2EK+9%YN!rS_=MCb5W(LdH&pW{2QGKxJ{}FYTO~NaVQ{U7f@`2 z@064HaK`@K&_E}kqP>*yPe`c2ZN{QVW&gmIrQY|@C@Hc$6+7WbW16{j;mV{;qW@*9w)c-#%&M)J6Lg+ z!dGF(#=`1ao@{4biE(5}NBQkQ&*NyMG8Xq680t6sP@N%17%KI~jm zR0aBmB$V#jQdGjTaKsFXon8YPWR#4)`8qdYX!{dEuB~*2GE{>ZTK--?3`-tM+GrV^ zCrm~Hts!~ul54R*4f$0wx=A^9v-WvCe`=(_*Q*l4Z`o_9!yXRF+hepfmirgy7L3Wb zax8e-78JBQSJ?J_qYP7^2c)l9ai7|UC@%8 zS-w&`n@K1`W7o3eQ#F&0w)RcIa2Wk-wm~>CaVt zS-4{PN0bAz;A7Q=TQL-B#lE>)N=KnH-VfwaCF^EAj6NQ5?Xa(4Z~OHSgm>(XH!;WO z{ZTyFaA7Kw1r=e2Aon+T^{Q@T_f%}|+L6@G`l7z6bKXRmI)Un&cJ}uLOZJ(gRAv(% zL)Z{ON!xKLUq|Z=Y#1fLH{Tpp*Q)bdkF#nv^q1t*dxn_3UpsRR0>+B`wuF!Mvj0K0 zpBLix9{&c;(befsat8)x+WXWinx*`_qnVjKRVCH<@+B52Jd@)@&zV_n4NE^hRrPq~ z<)fR5gQJaxUki6v%I?~5%dJfH4D*Vid4OC=G0i@masv8m__3_KYZkH4#B;TEY@I!N z@rdy_T@8~+mP2fJORlSo7?Tm3fz6VgJk`CeueOlorU^}DTo`oC?u6mKlpeC$q~aX3 zm08c4R8?qy8fyRGh1w1csNr~|3t01isw1{7w_%gQ9i*?Dr>iUF<;J4;{6`DQcCsY0 zx74gtzQ5gscIKy>6$wJ3-s+?>3I{P^{MhIc(?|4{P`FTvG!haa`4E0E5ht*%ZeDmG z!02D6sn;fvZY1lS+;F4fbM?A`x$j0BV@S@Q5X@Kw7#7Ny%gPoGzLfdG*G#XT!PZc_L7<92QF18Y<=IFCjt z`+~dtU)$DIEQgNP(u@yN;D8Nv`LOo>0fB$E&{&n2bVdwT$_`Y{3uz8>(XGL^3iqD4 zYGFYTSGYySXc@%l($MZse}G-%4BB8u;escrytY@1q39(&LjT5;690wk{Hp^Y6jWgF zR^TK#sEkf(oaW=Ug)V0@PA+8y)i)uvw|6Kpwy0pNgaCtbG=rH%?DXp_~a6#S^bDW4-%!SXCKYymJMUjAG9=^BEm(+}YobuX#pE>VcGoKJX z__32&3X2g<#Tapo`v%we{ge#S>qR3ZzxcrtYMRt;t|Q^=1c4KM^F7S()GKjYhSNw2 z!EaTtO>%ge)&zgDTAl!mbn)7kBf<1n^bH3XdGd zrzz=6IuYatL&)V}trFQ%LNv1S;_HtWN;4amU$>{{lFq^2ME}R!iFmCQnH1y=0*}Iv z8pJz3Ciepd!U%VK?Cp!2Ebfc_P<0sw0<}rbdv1H%ZgX@9wj}XvkJfvj_gX6IrI*U5 zU-zc<>yND!W`@l@!+cC$JQ0dCPT~{|ZxWtlkt2eTJsk%8Yt~hmJxG>sn*}4vrtsP0 zj(32Ygoa(aCaNX++u+eTkzb5Cr1nnv^nYdK!tXKqHK-?Zz)g;1vo9xYsYHfQMq(Uk zi;06zt7w9f;)P1WizrHrOvK2!-eLX60T)L-ZdiB5w-;*#WFe>4(c&1WCy=rD>F4he zX8zLjcWL2j^tE@;^MXX@P^USM$+pj?#n>8IP0yMW{OsU>c&p730+}l^b>`Z5K@4wA zaJKa&;&-_T9WXmiGt3FBlh?1G*WtyA6`EHBL?H|@I6j$4j#Zlfruq9^YG&WFYxlne zBq&xuIDl$OV0ZoMx@BB3VUZ9w5I9el1xjrCyO@M*;A=FIb29csXD7T@)t;0T%CmqQ zjV;lJ4G~*_($R7)g|3R*BzLK(X&)W1c#_~@=fCf-!Z`X%%u#Zo+zVCp8%AS5>81y7 zj^f^slb`0tIMIRMqXg0Bg&@SR5R`lES-58sR;>GJc#?|6j)K z&4z7{dg{uX?!OAVw7r$5dc^PFbgiwu01hkp8bui^@>_K}_(VFhH2h31s-kV2Devrm zM^F3^ZMscLhmEeE22G~29vaXt8`=Zb;1JclxYhP)$kxv0klsk_f~J5;82mc7w}wwH z&NwB{NX{=_R^8vR?_}|ISfb$NoWMHO9Nj{2+NJg9PO_bXX5N&V6?6djJ4xDYO0aA$J~k@|to*}3=_~Ohvi~kTzx@C| zZ*hGzxGw3njV&!trWAA6qlFZkO8|p?XXsg@w65t0A&v+l%-N7^MG#q9ol2HVynMAP zjD=03t=nkSpZ*MD>VTC~>7j~#W$J;(7x%hVk?jO;$ zza3c{_CpJ0qEVCK;YC9l6tJcFe@;U=01;+;EJNERFBmaK{x(82oqi>c6__Ka+I$2; zb{-y989_z6LK+$&>nck}Y+m(oVtA$Jx-Z+OxKwfK|MrD?9_T<7^$dXO+&- z3QBqO9xd6-zCc!qizvHw8*94f7lg@jE8nxKcfMKnixm>lqtNp>UU~gM>-`G@DRAkd>&`H=zF;%&~cg4gcT4m>g0D(zZmfV)0u9{)$aCrAo28Ctg! z7uE7I*Wcjf@GcuN=2e$K&ih>CCt&$-NWn;Lp}9r&&y&77XKgl47VMx z)SvGHCMYM~79q`&y%?0{Bs$lB_oIdXL8nb6g7oLn6nNU&hzwkHGYG9&QH>2o7l_ch zqp`)Ynzmy4x?6}V;dV46sE2c-YY;q*X}86reEx0f*6I@pqLjX*6Ud^wQe|~9&PAk~ z-9_QjDssY;`1~zv&1(e%L0)lP{h+8-snp>wAxe>hXnES~&3c+?Zn6w=avG`>RldPU zKkpr7scRtvkpWpxRjr^K8?42z!>|h7NmD_Ve7p6OxM5E5`%RS?lk>M>e6oIP>Lcxd z84d2Uj6#AJ156>dz;jR}|EYi5g`XnASLbO`G&XIrP;Mh;3P!46qpY@L+y(JlWBx(N zFwq_#Ly@0$^9*J0M_BP7V;2? zMqrc~k$*I$QKumzQOWJpW-6cUpk^L?E7D=84R{-LIJV#tf4FWEOwaC^vdYmFXfrN@ zqv$s9V=qo<6WRE|Ni(Z)Tn_ZNe2uKIXd|5Y%Z-ns$;HGMVF$E3_JViQ_DEU}!dWgZ z&9msFL~*HBL71mr9N)8;sP*JK2FP%VFLwx`sZ50RP?77vB5e)jLyD{L!TOu^{b6hP z)fj=qvyKpX#mwxik`({R%PC~;J9Nv;2kI~;>)o7rYhg(2kHFUO0Go(>&NlFcrJOK} zsgRSFlI2^ImXBgUt(>pi}GzTQ|&C&p3&w?>F`Wx8aHPy9OeU>%D zifUUL!Tpcdf2k2$RL?D8O-uuUhurPBP!d~R;8nw_2hsbqsE29NsoX`R)1S`1{RX6` zozFtDVna2J708Qq9eGK#&JL%jmR7$m?ZOgI&dloOfpFkaIVW?+r4vdkR{##ypf^Av z!Fz-L)&>pen_0=7RFd%;d^vUQ_(Qh1;&01g!bj6-J)Eyx!f-LhI=T(4{{J@MdCeg1 z2iJ8B4$i6`U9hKmAFCHgKx1q{uZ1+dQpKD9TA6+ zxv3KWHIV@&Rh~xyC!3h4C=I^L{LF0WA5T>gP1Es5sljAXF;K^r`k`P_dE{i;?s*S^ zlc$XgsQVHV_@FA?-0%9Ghry>4W%qfUGhN`uJoG#;RK&l@Jz zB|Bc%$VjPc-L)hTx~?v2`)y;2z>Pq6d3p3~I6~ykL}j-D@@`LXHm=Iy^oy5IjwRq2 z_&Rpth%3(S^|*gDoJ}RQFz7RLp8c&F%=8z|LGpMlz9cckrTDyp3P6`z(KV}okVm*H zn(%Ex+9yVtt)ySlv0{_`sFvcU2XvH7LccD>S`Y@>*qwW#hw)~kAXS|;*#pe^8HlW~ zYPYC91SwhdUZ{D}E_(jWDS*Jf58g)@Dy`hUb`;AVPDDR&u0LAiKFy^u z;Uf17#3=9Z=#_iX%nt$d=E*+<>rXQj*S9R(GIgDzkMm>qP9tBxeEZiLoM}15gozh@ z#M49N2kfe{)MZ0L%KInjy(#Yssn8e!{v#M3e{qv&1>>t!?KGH-pqO|MSP) z@&1$)#kIo^=;vZ(Fi6NM<+2h~;t(_SumaWRD>Y1HkoafG2nr&FeL&lKKcYg6gW$qX~B7E8lp8Ag;}`|ES<22}*)a z`qKFSt8qN?j50w@**!MK;veUdPjosBigX}SXmwUqs6Ks#la!Rwx}K@*mMaZt<1o$? zc-Y)NjMd_CNUFry*30!yE{wdx$-GeYbLWK2qd7(M_KO6{FFX0SuDz_CK7;w}(l5q`)AEbo<&5?35r@u(D zX05t62hd_|$n|+UL0%4)co#Vn)2p0=D+=azfy^RA_{l0##RUh~6kxcYN43xn%fPViZE!%1 zU#13!Zy`U9cvx{lsLze64j5%GjQiO?gb*kEa3LazFTpX7mgfymTvdWc7azD_*2TD5 z_Ve7amHh#=9KE2aAHz@;%?AQrLPFW>EHy&6NbfrJ4cRILt7oRXtmhlVPLd7AG3bIi zmwX5DU=#KN%lT7{&;&E0Sh;*eTcG(Ji&HOx=~n&m@$*Tm-3=!c)0|6Cj(Mks09a!? z^nIfS42R91LLHb*#&cx#&2`tF?_0;C2jjj1CgDxwZ4l|Rhcj$xIax%rZ2 z`lVUq>_p^+dmHLQKOqFzj!mXCs36ZW8N1X~&_p0lU(y}$N#5jEaW5+yJ9~;SEBI5t zJmt+R?oJi!QR~hZ=5h$2eH)UEQlOQi46iG4LmniU33c*gG6!O)dqhq@V*{e)<7G*ue>R#MB3Xu zsY1O5J=CVynhQ5c?t-HaONrMEdQdX%wm==vU>_r_nCcV|vVkmJ&l5cvj}o|vH7Ybq zsKFOxhQ8F~{7dCopq?-}4RU_AWcpF&fc$iPoz7ZKFXyx-o1iN!sIXVS8OmJf@tIbo3pm-&FlfNXr2w9{x%w<Iiup7C5K0$!mcWB6oxrLNoyxgD*C;IRk4dm#EshqHWO2JPGgH&ID}eJUQcM6 zujm)^n;WTT)|!mxmC{%dnec863f(u7$k7=I3iTGo{~%S&woi#wsayIPlB@D5g#em< z`ZPtpJ-t5|-CNXJT70R{#T}A}&;(!*^}e;yX@d5Z!Jssx%>;o#h|?4CD00#euNQ^i zOWP1q{}%{*otIR}VndI}iq(KZnB{1K_$k}FXwpLWlJHMd7+gTQngUw6e0#`cnn6j7 zEY}^uU^YRomQ23#GXd}KYboQ zp%eh6P$NhWRu<>aYAdh!P5g?e=>ssYQ!7xJ=m40-zJKzZPEcDkK76|9VR3u#V1RRK z&nOgyO8HV<+avRlo(gErBq^sMVOZV26fFb#YPcsxYw_~8iOg&q8fk#J^=dez-~M4| zu`8M-p%Gyf=a;|KQkVQCy%GlNdY`~RG8Mcf9vK@0i)kF?L*~cA2pT0g2b(@}X;23) z{G#R{-^*?pd$~5l0G@?~UrBq~l#}f@N3G?BgHAAwMkCGDL1>x5=4pn9oEuf$AeLNS zFh8~b`e&dqNEdzafnvkljl(qjCipxC~%Cf37(r5QX_B&+&*1RKo zWh3K7AIBXU&2%4uOnFHYQZMM_DaN~McrB(r# zItS7;sdLvlFp+dMsfop=dXalgO3encLVL3hdaJ`8 z)kbiasBb}J^*EvD|KdpUL^p-??FcHC&7d8KSEIV8rc$UsWI$T<;Daom<4alkW#qGy znE|2K>I?^pKdU_8c|=6Goc~ORVE<#|rLI9jvxP&mJQJYw(Zb;DZi)}x*HpK}??)Fs z9d?s7^l--l1v{yzfnEQ!a)TqAMPzo*C0vI26kYC3y~~hHBgghb`$+gBX>HUKoqZ(K z|JmpcS4sS(`xmenT*TEOkFsBdI1_t@OdBkmeTs37m5TmP1&w- z)Fl%wMTLT?oEg&_kGkgQ{q>_eAhpy9WD#ns1#v)w18snHv6A)}y*(|ui2d~VAjn0` zYJqRa*BD4t_ZShm(?tij`q{Ih@=(pO%)Lsw3*#1SY=J&d zZ^6}?9DoEa@D3Bikl%_BO(MLhKBX6KC6iDl4kIywjN3dyFUt}LfFdEMa>c~e^D4&n zXCl%5JlM;jUt4~&(Kl#)zi{91*ksjzwU50Ij_Q1T4!Lu@UfKd>?Y(_S!>2h6Y_?&^ z^MA}uW0EeO#OB3;5vKM9>??Ay5Bk1U1tHI*5m%0<{rnhwgj!nELPOW1niM3#X*P90 zFDkIRqbbO1Rg*pO&pq3@&WSyP0!(8p)T1nl8Mn3wu0kSlDty-`>C|-DNnv@Z#yJ$F z;&Hg6m@xjo6UQ1{fuLb+DZ)YoR+k(fh zj1kuBOcOYsN)0HggOf!3vvY35_H!X(AeyE=;jX;v3jD^qR1$0&0w&h3NiExUU=Xap zc&!yIPvcIVEYh^{2>55gq_f4$35ii5W6s?V@4PP4Ufkp|UioBwae_4qs5Rt?XFUE! z-O4Ddb(vHuDMS|EyDnUEjvjwvQR4GO|LlL?lun%H{Q3E19~{hQA9&k^739G?n<;uycT2RT}h>9qc(1pz+}~;%hVm6#6e(} zsQB&#JzwaE5p;+wOH-_~$kj$$@(Qc#CR1V2gO4Y+Kz zhu<L*jGkO8$8jWf$K_Gmz-UPW1_8kMHY&3{i}_+Vi*4I z_57Ca5z;hZLcSKpI${-=%XTtQJJdZGF5=;hZx)1QN$JfSL)lL-Euzd>V#a{C9@T?bqw5^c{U^W8WPX`_L)&(XW~m%aXngH1QVJ3?@ABblU=qT%TL zk~uN&{?|a1SBC?PrwS2~L_u<1r!1=a@5#`e`R3q&PGF7txlNF_1yGQ%7e0%givL-G zy;SsCK17Tr*^fjBmA;MtE*7LVqk(j^K#!@w{F}lj3fw_u_nvZ!S8}8|7J}k?iz@w zwo(f^e+936;_PeQs1=gx4>oXl17+x<`Td&3fzrU)0A;!K!23{wS2!QUoZf);0} z{&OQRFOuA5OBU4XFx|&zP0N)O_z8)wwmBXrPgg*5i|AO~k=*yL4}U^C56+yGK&API zKRuUWfOlNAEwd2GbI&B40raxol>oMt2FZSq9T< zmaByz&_{Mlt(N6EEr&ddj3f8(22)yiUWO6**k0PBw-+?p8r)FBRLSgnRNrE7A+bLSeykTFA#Y}hHz`zpL;92p<^@bEe~^D!~f8hK#D zp<)A4J&PtUZQ=5b(n77{*t}@xD~-gWLX%CFH`SOb1oZu!fTVpPN_vJ#0`naYyn(F< zJYB!1dk%P)QoqOy>pA6VX(A;;a7UvxKU)-o)AQ86oa5q$Uf5-+0X<3nvX=*rG*rew zeLYZFx z4%JpG=?u)l^>x89n!f~5;YYlc|v(668~V6D9~c&y-+Z4W z3)|SEHeD!;tEk)PG##ghA1py9clfIktfvUOo5G7n5&>0Rw8LIIovU^zEP$AkEDh2) z=d&UzwB2^igP2d|NF-7Y8jbfS%V4pcf3=GrRPJxiwaqC37{d~_GxE9JWB_Nwd5iJ2 zqjSkzXT2R0$pyPrDc1ZePv_F+y3~{3-0`a!r*x}Q^@QEX*Ix}DJQN#H)EQ2|7#jAg zVkCnc4PueKlkg9^3uA~{UacD2Co&KaZ&@^+4l?#qxO4My>d1ATJ9u_HdN%GPzXmY6 zK0fQjdoF~u{}0&Lwc>ou9g3dJs*6%Q_)MLIShBXgQ}?n(*OFMrtXJvETa|j6fDriz zBOS*;j$2Q?otaLH_CD& z>Mh&2oxVY>%k8El&1lk*Vb+$zDMNP+Q8K-<`kx zLBnNseA-$Qa8{564|$b|FdB%IP87f9g9$hj`Fc|FY(=M)dcaX1FM$}F7XR6bZp`>o zOf?$Kjl5|Ug;Fr}ZFiZB#A}xQDTw~Syiw4EKsN9I0H`W?)#733fg?7j9zIwoyPwe- zy3^F9E!(^mFHW{dBnf#o%>-XAOuV zQi3*7mDJs%3#OH|dE75R<9RFn(hZRoM0eZc#&RM~BehAT!)D95=UJlB{;6Vl z?2F7i1i(^yl{B&hoUp}W*s`3y)XUPNcLyL6kW)usyD*tSHGiJA#Pwa3vQD(o4n2V^ zyWKS|>>7H&dAj2# zJ?29gmszQ#_!p1bW*ZKX9b>fh+_d-g4GQ(uyL0E8ha6b3K}+JtiQurRp2Bha_u9a6S}SF z1*+6Mbn%hA*fnwOS6aP#(m8-@LeP|XAp||uXPU0=Sl-gRM7c0ChkLj71u~qc=6k#O zXavI0+&#V27ip}q@U?d*t2h#^;dItWQfpcbWV28P(C=;?T^^~^j88yfy!3_xR5Yca zAuKD2mzUQ4H?Dm2bm; zpB(Y}1)sg$CXfF@q{abXfBI@{`jL{hx4Y$qKdEfA%@!H|YK@swe$1TNt~FOW(c2ii zqs`n~nfdItw4gD>AD!02J95ACx_TNahmdB}MEfVC?Ecr?y@6bShxLzZ9r8fR$`bNf zn=Z@K2Sq(8ytlBuchjM-SCjwfY(-L2T^CY>e*RtMK*!U`+ExqrF9@#2f~dEI_LNpj z%YjjXR9};d77LB*yZVOQMj{3CK0YH2QfRnq%jC?zt&3f!_Oq?=$-EL4F${jXM~M1E z-b6y9gZkA1F*lb2d1Rjl7F@s+z5UOJ9VPgmKPng7a$k}uo{tS6bQ%~>Sz1$T51AFxzIQG{3Y;jnVG>~sRgr#rZFSu!pzF);TCfZ8 zUvVY-`p>3&K;c0}@mz~pi9S{vbS2$OknT`%zCM1Twv<|V1ed9qPI=5&c)YJy|2K!2 z1isDx|B*M*%mLx_9&Oa}oY6rH6ILKA=P8I(Kc?~ob!Cd?E$5XV`)Ycn1$HNZbo zU~wzxmW{vvf~Vo^%tHTF5?v~U8J;NUEnE zD1mAV$h7k0I1-}2nv{S_(xDkHBA|KS{d3|ut@lNb3r#8;!k6sX@lAF8YRw9u&uQEg zpNO3|y2(%c*tp?+bR#p`IGFr2)kXA!BHGHYYbIZ@E;K8O(*!Xy3dy%Te%iLW51aa7 z)By9Hs(cAj~D>$i%+>-zY+$Y#}Crke!GjEFT}*mLNG8!DDo4=0>ictdc9 z(1=`N;WP^)Vl*P>mn4R|JNdCQTxJ-FVje(7EQ@Kttt%2)z8`+G4o3}&c>-_s8FVHY zN$1vA&eK!rX9CDCqRb=C2g0sHa6fqgo-NdHsuxUwH!kxb(*w4(OM`2hO_Dg3CQPrn zG&~N(qiuwUqDu}R12o~?925{b?jeNAXT0PTAhDCoP5Gd>lv(nvrucPpo>$Bj_G!7J z#T7Y1-mR^yE>Fbtk2bm3`Mos%@%Pww_*JoMVkBZRn|tX9;ME+5N@?EZ9XAAy0uF2+f_`L9Ko!~SzIS_XE1$%eKdsM>s4)0WR{8IbroEX_2)ppz=o)G&O6OA41<$T6ss3~VO6N~$knmn50`s71 zabomnlx33vx*-)CKg1dz3lBZug~jTNtXpRhG>crJ-8YH+jMnmmV3ai8_=w+eHShJ9 za>NS#lrCmjZ!)T0Jo*V|_Sx zL5YX@%VN&d3=0bNI^Aj%K>#(RrI0>BvVwe)L=ajbHbMAAraAers5RF*Tbz;^90P!RH+|bg1|*8BGq=|(GvqelpR|CGLHR-}i$Fw-hAmAZ z0&tgWLk0J4FU`QNlmJQW(4~X$yr_p~W<2B7^~aLQTab+(#v&A*n#0vK%U3nML{seM zQnpa9-6uV$MO47|WY%|8J*ThQQx!L_g~Y@8XLsvJ`yZyOs7Ew{Hs zvJ-5%r?Z+w-kW0?Ovr6n$=m;dgI*m=4HMG(7!5e9r`|2C%phU1pnRVjtNrsR@#fbq zgM;rYwu`xCw*6@qZOWKB36<=I2a86C#;z2bIUNPdCr$+qBnmXw*EebATX3jH4}D9? z(O;p&40ehlG2P8F(#Fk;c*Ry938Gj+V)~3+V?eDtz@uMad*}8zI>{_Lu&dp7SGuiK zM#U~9;RUc$OsA}p40@8dqO@}%DOzx%6aB8<*B$# ziB%~K;X2;O^+1&W2T1JTAfI#avF4koL>O}tqo3Wb{#zJSIm@fZ5iVW01PR8|wb^4M zUIs5an4B;OGW zn4|sb5U2s%xboj=ANQ2jtz9}?ZC%ix(ULim;FfQx3)j~Pd-?s9Pt?f2ewj;pf0j`! zSiT^3g6l;9_~%{8Fuyc(`SIzK@FEnv)sPb;#j3b3uf{sKP4*0Zij}g`nQ-s9A`XlJ zmIk;jO!r2HG!>|aSl3^%2aDx>YVCrn82VsPQjur=w|$#I6Zr%f5$d*Muj-yJNExw2 zD$Pjfo6G3Ad!YS5-4Wd}+qYTGYA`-zu--WH<|%c9^(I94$S)k+`*8%y#suG#9@_y< z_B=jP!G*^g#I)BL`(s1Lot8xJ$ciTO$OQ9D^^93+)7KUh>e8_OrqYs*Nt`PlK)2~H;7nN7@_R>!`ZFImWo z=#g0qU*R@75KubUFIaud+7OU;$9-A?Z7InCs*bguxCYqi4pYcwD4MzOmHoBU_DkNs z=5GE8TGE=)?9nbU0C+E<|64`|-eLdSm(FIq%uD9CX1E?_Dd6}3v7xegL28-<2Y!OR zTE-KijG!remq(ots7Sv>om5*-vSxoO{ z5bkvKb4qTWwMg^=)v+u2?q@1pZ*NL$s>PMn$+sLLzu)4OMZf&k$yN3tt$1?lIU`y= z5s@)a+N?J$$1N}Kv_$qI6sLYX`T8cw0;c242`^+hWI)5!`7Mw*vO9^ByY-OFib`&n?~T_)o0)%orA&x zJjY6gV2|uC19%Iuls-0DF-&|WL1Q2>*RV%)lNT`s`l7b8p)mO3lxXY*g+w*I zcwG3o^{)zc7M1Au;QXY$Lcgd%QQ)`Xt z`z@Gk+h7#0F0uZ`zuu5sJI&mzEIz62>G#YG?;og=-QZ}m3)IJ%K81(^?kc!7Hzhs4 zahoJ9qyG#c=NeTMtabV?e_dtATW$y+@x3tXY5!BXT99o7Yl zU3!V>D4X@S582eJ>lj-kW?#(65D!n!7RR|f5&>u!nqZP?b9G#g1hr5_A{dLNPbzV1 zQ$AF)TXZ|Dhtf5j>uxfjZz(l1+}TAjo=+JE^+WcY@TErwy}daE+Za5O*WI}lcjv;v z4d8|;{KoPLlFiwzi7p#vL=E7nCJM0M?}92!gHKSoq8hklW9l`ZHZm|*Rac2&w$KdU z&!2PCYyOkj>gElI`?g0xt|(!)?FAK4mQEI=(qU~2-&VJcjHG;KZ49Ru!3^EHhRLln zU{Ba_lFOE%^&r=@4rna!s^8Yr;uAu4w(XY0$cX#@M< zq1XuTq=siZ!KR*`@S)Og#IAE7V$q6&B%#RK0Q^WwL?Ci=%P?#m$xPQMs{8t)+?@6@ zlKMSXL`;mN|7+`exO!VfPQl6;HjpEkC^Nv7a)B>oUj5sG%`i?xgJ_sfZk>E+oT9oY>$x-63RN3$VmJT}>QNo-roZuu%0qlD_qGqR;@*buw zG%+-_{9&nAc7b@byDP;Kpl-tYYRL(G_|9@-Nw|CqEm9+Yni9Hs0mPWexGepOnS zwLm#8n+1wnXFpBpgw?u#!$>6)ehyS@SMT=?p&C1p4f1j<&6!VV&63K3p3OoUn!L6z zL@dIz^0jrXVU4T&vXL7Zcnl!~8ea)l60_oZ6l^0iY_YLYCPB@YR~EC0lRpVsCV4K) z3Ii8(=vPceZyg?VcII_adWJko3;2{1&I%5L>WdcnL9Fg*chS4CA_A23J_+~T%7x2G&y~}H)Qt5q7)gC{G{;#=8?W9 z&DnFuhRywiavuVK3`Uu+G0bKXC-2<$*6F=iIU2CcAn(u-De~310N^s>$nq)vIRsD7 z@#=`EMS%WH_~|B(1yi2ontFv;V8z2Lx_$(=*xJmKH}9;+ z+!jKdm;^B(;Ngc_r|T}bV}?EAQM(D8ZbPm!*d8CsZ~~f(c`mHH%=k+2GA6vfaH*+I z!uUN7Q>f|7Tknke$-D6q1&f8Y{S7{v6;X8upS}YY=}GH?av?r3nrUmt92xZQduqdF zIUC?U`ETr(!>d*<5~>>1W@r%m_xB?lz45d%G$^hDc4bP4Tu1$rx-h)yh=7m?%H+Q6 zqAf+AWH~$@@KB#xppem`*ql{1FjhN^ab^0p|BsCpx3hB7@ev6|5**$3q)Sd;{V=NA z+Iq_Wj|%&pj!cR(pV=kU$y?ZB(xOW=)cU#C7DC|iAMkCfM3|S+Nxvwqho~uQgJ;^n zt88|2ELz**8(&qSqeQyUmGP15`g|gQwV9c9CXrDO$66Q2sx>dR1W?OR9)0fDYuP$e zB7HQ686$qfB8|%}RfN{%?Y-ct)!ZlFNoR!j?mxB40Vnnbv5{Vx*<{#MC+3*mgFbg{ z`w~%{)F-`1s8qeL3NlJ=5m~s>s_KD+dGS)63PycEuw362JfDdg{*m1DfKvC5)k|S= z3u_<6sS+dAg|pi}!BRAS(vDj;`28|kt$RIay&hgtnU&$n(5aG(JDMZWXd80bU-dW( zO;ecrbhMZ~PN(6FP??k#;s z=DM{;01SK4PjV-G0UYAWP^ZTod%}?>=EXqU_n?AhXR{xyHFs07p{D5?8RjfNtkwLc zytczE1B&giuU_GyB=b{CsL`dm^K|!hSPtuY%Aqg!l!VZxFIZ7DGC5FwvTLWmpJ|+q z3!WAh!o>tF6SrHhpXjElb)_E3x44B5c8?;@SA}{Fk&?4>a4_@rBE$651XXM78jH7W zLKKSVg`Dq%hp~G6YhRERVH6)}%4>kMh3y>2NS@N>)#N=|)>eVjj$8cn&kvc7cM9Pg@+Npque0!HC#KLPRZC^x)j$K1LAqdiCQ))}ToH*NN5)L1*5L)2wwTjRD3 zHMQ5`^dhR^%LPup=vpd`zAZ+Ar;O{$+TK49$6BKB{x-Lu;9jByw110Iguxb}U-Rp?E;%bq)6H~+5C3a-;qm2Ow6cpQs4#6LkTh@mM2*Q(gWBxggleV^( z!1Ft1ntN1|&(`aC60mYsa*n{2CgRQyTv0rNI7*C%AcdH}9%sCZ%UroiP%X)0@A1)VP1*Wow`yYFa8zYbi2U5 z7FhxG+Z?A&Hpp9=GUYd;FgW9HBRWmp)P?HuHV%`F%A*ktGop}xh0L7pds7&qj{#d{ zavo+fh%_$y%WzN$!VQoJS^O8{FTm}Dz)_5U7*t{U+1Bcub8w1M44Kopya(8eSd0dO zGRPCliQ@&OPM2luW@PY?PT+rCTb6rTG)9hDC0&UI)z|Q~>V%WM8eP{(k5sy8bvzxy z1!@$!cwnfqm6)>P&Ip=m81*GV3y5|5n{hQ==g7yAvs@M?{aEQ|jt96KK11W-5iorS zpUdkj6ApY(y((oO50B}|<-b^%qRSBi2@$H_e(ss&94eY@)obxxd%w z%L6so%!TF|EXz;)*^NIujW`OQ2%YCNG0k#e{i-$#+KlQYcpDWNj%PcZsp5M5aWuu@ zMO@0Sn_%l4ff7leH0h{3ABN=YcnRvhr!72D(R?)YdDfPl7=PvY+VAjlaiek(3DF^W zq+^Zd2M-ie1~{3ttG`c7*f(f%O*uU&7j#wd5dze+g^KlZ>*V>sYgy19ZHGT)=*0(H z(x6fkH!%)5uhdR_K+x_D#fzItCLNw&R{yg(>&Hf2iIHe&<^dX;#b|i4ILnY>vQ1@Z zt5nVmB-c&>37|t)3H+)lC&dCX19aDi_VURH`kis|VBVqdqh4edzG=g$y>*#| ze9>;9pghxANm3!en`w3bLea?CRKb^J&U=uw|B4CyHz4rA1QW(LRSD{R?RH$-R=av4 z-#>z`C4v?O6xCbNMa%bb>9^o~kHVlSS%I2#j_?NB#-6o&!L5(7dFlA)2jN~<`b`cg z%>|n|Bb9kDrXdEDf&7=q97L3nIG8=|)_qyEO}@<2_rL*g^<{2R^!DYVvDeww*H^l^C4q{y_cVE`qWdrQ=Sb8h zPt{ZB)PRIiT>7a5pITc&?_q|M5T*8^7Tlw4O?!tZ~)n{NHIxgTa}^&@s85e zwebn4=9hgnE}(W(S95=$L2w9inb_w~ZKWJ}>Ko=bet~!9Ce(kxS=5qd&I9`JD(#U? zD#WC?gr%H)FFdQ-!$-#hnM{9K6nlk|llx%)X&&X^4dxeYF^c(e6|zcIquTVx*a*Q* z3{`+RPNUUSMy=Qd<2fj2{#EW08C-aHvZ$z>u~m-i-Fy9Qh2(n*`E83oD#t5yHc}uB{fn0- zhs@H^ZtMD;H>}lU^i0IT2+hK`bw&cO)y!zwYlC*=sJ2Pw;5)c}@K!?touocUG|w)t zQt*iOj;`*GbUOVBO%Emouw?@Xvy&o!jo^eNk7Kkf=an&a4>g%InVJ0(cJC&<=9xPJ zxZ>x13kE-kMTRqJd83TS!}xykyZ^D-O@}!DL7F{365qN@p4!2Wg`~!(32I3Xnrl3N zwAyJt`dqR)n=QWlR>PD9*+KzdYa#;M1944>jm(X%W@V>BLR<9z<4HNshLDV^qP(*C zZ{@(Ivlf-*o|@qt)T+O zc{`+)V(mV^lsV4g-$sAYw7ZPdAZzuxpPSI<+Zou#iF z!I9}r>d0sKRKEXrBia8MntpiRBKJk!2DUTY^Vgof->qw1fNo5g1}m{aSa;V4FSmp9 z58_(qYStpzN65TVJYC7erZ_5wz*i=Vy~0%$zb@`+I6Z3YU#sm!kTIS)4O)Q0a)+9=!4b?&;r@(LLH_iJx?$?1Y~(&1=IKFNzidz z-#Z?KR{6mVv(U`;?~+bS?c+q<-`&>8c)Av+gn84#OQ8m1_TM+S(1oVY1h)uw7tvU@ zV_7$y1Ywi}e_KIKjSgnk8Q|+SX|Lf8x}zrb`mq~7L`-;)8Pzn_=jd5xrE{~ zy13gc#6!4snHUNAixxG{#VNjIyuo zc2Q9lZU+0Tlkx^q%W31Gt4SlvNJX%jJ@}Z$lKsc8jDv@4@xRsjH~9axcfZX{ zc>mb|+|p-*&<V)hqclj_n zd_wZKb#1~q{hT&Ba5oWg{0y5f1e)Zk(^S-SIX+ecJ?}r{Tway=&$k@sC|=iztYQK( zZH0YOB-Kw`e{big;8$#BT9V_@|6ttD@)R^9IO61_Ud0Wm!sG_3p&fuHTKG00G|^7N z|M>?g6K=+w8C%v5-H)cflp^vby0Dc|mHNhSxy%w+_B~^4!TsiQQHz3hY3QY>=m%*k z6a|`gA>XDgII0l>_A^z>^V(NLl)%C7IAaitr2bDRa3j6cr|XH2%${Z(o#>8#beO&b z9M9CDf@bX)z?N}OjM1Le){GhcH#xoadLoLd@=|OTKp*JL`2d)(KzI|h?maGOO^xAW zrSC+F;qDS@``MX)@tRNt#D0K|l|tv%n~}N)MZC^mT5+cWaD28|J-SCQa%9Fk>GVqy z$n7qz0?cEWHXP^g%-Ht59dCvmB;o6lsfO4>P)Uoi%6hq=2W8cF$5YhmWX+LxkyO9d z3vJBi0IK4bG8>B>Z#N38ZkXFCA9w~(XvbF8X@sKL)Ycm1O*+-TR??gePsq27PG4Ac z&yto=@~4HuV#~?d?kwT-2K|T61DmJVE_rFwiY&Y8x5!4Cy4B2_2C=`EM4oZG z3)Ge@+xDK)ragP8N{xhbb0q*fK*YaNL|d#|e5aOAa+0iCe^nz~F)sw#R(0J@f(OTX zI?7sf+0iiTIsA5e3#Y~pbqAKKKQYH-h+>(StQfFL45+6us#-l6TtoTa2~^q{v!Mu& z^DLLs5n;3bs3E;{`7!289s7c9j>2SNr2`iX9=(Y&M175BjM8vo|cPJ?3fG0Sur zWZy%M?HSOslVNgqTwqF;KCvF0%=2+rF+HovuTr1R8>m(J#?%07G@zFilW~=zpCHG) zjLh!(?Uy~MU9YslkMA+yxvezI34gh_IaMnn68;OL2#VDYU3FHFGjSg+tQW;QI;}dI zmS~bL-BL5dGh^g3)*Our0*xBC>?TXDN`1_fWPy!N3nGFlFOBrZ%I8Eh0YZ0|hpc*F z0crr!`kKk6-g{xXc<=F!p?9F`)$=`CcLJ3OYL0TZz54F}$=fLZ(MJO}IJKs0S_9Ic zp+e_OliodGI|S04N74)6%HT!WbvefNYf;u}p2*C??yEoqk&A8{eOCFRu)Pxry3G9P zD7@zpCw^7a0w{IFW1v@6Bn08Cb_Z#YQ;gq#BRqXE23VY`8CKpCE^j8xt1T>vNcS38 zWp|(K2rc!jom-9e2;!NBcTjtVDgYV6v$HgLsYk{wGJ~Z=MdWa73>af-|J&GCFH{7@6?ekao~tA;Ftxl}w&#?goyP~aYm8KL zP`hlic(TZO7qVnFVfXs!_mh?+Z|0(enTC%Y2RNsK>P)1F14>x!3u`^wT0Q;c+9bd^1jdHD4o~S564*(gN-^mbPk<@}m2jvNQx@0hr`iz^>m5kwzT%h!4x8T; zI5_bz$1S8`V1GU<3^R|5-(v|TO`s~g7Di!N+s2LL%l_Oy|`d65AFPIW$^1Y*)|!WhE91~M}Zt~Q7`pNm-Q z19yQR&f4!YOSeMF=z{bUD53^RbhUqO#tg}9_z(ovfF6)IiCgpncG2wUG~PZ#+{~yUH^tr~{Z+ivd^0SKv7% z%PekUm3$b6Ro8+&2r>j(+vM#!(4itXwgF%7Vr2>ep9UmDC{!YWW8sP^-8bDp-i%AkqB%LnyR2S3~QEX?Vv>OG5wh z!#2?3|BF%Vt;Cem1PSuO54u#XQcdhzGv;}&mHy&iTi$2f!(?gzKC5iqKBd*Icy?P!%d83+4wGSeRrs60VUsLh#5)>!-QJJ` zL!P3La{DGYHa`8RhO!wZ#F6zO;8n$e9R5_oAu}I?1Sa(y&1`X7st_O2YgwlAWn~Rb^7UJ*G(S zu#w#m^+XoQ`Vo*L#*TpoKCPQi)#6MHIBVVqyQc*>8Qud6$lV`eQ#H$=KInKi9EPzs{_0n>cE@jfQ z{}e24@5^2;)$4RFd%emGev{zsXh%REqTyJ3Z2bzkV#=_J+i07_POMSCVBXDxfkkx_ znc2PM4pD(t=IbzD30OgW3^;Ch7%HZ4F8E z9Ei+#U%fObrXiWM88a=h#xH`!G{-i4)RcF&#+MoN$s0*4zv#ps{0&4>4l_ejZlo=M z2$_VV%q}l_f$mCjWQX!)9Z9&1d}C9ek7rHNtie2D(rmtUnDy#w?CgDMQS!*&)yj)Z zX6~E++~pRWJ$)#+oS}D$UejEo+Hid~);*v60drrrDTr^?U(oZ-b!xx^fK8f^qJl?a zcu|h9fYVV!dk9fpx}8v5b3q!Y)6k%G2pK&xF5j1=9w6(Prt!sz&sPOcIQqs4_F~Z) ze5I&+8m8&Zd;paDST$*qDk8&k*JVwjQC|5JdFRbvH0Ly>_8;q*C{#_TkcQg$Pw9Vh zE~Wg)dy70c&Mb#>`!k4_moBkV#&NFwTw1S(1`b)=>;>jj8EHt_31}b_sQ?d_$MkdV z0?uO|`veX;RSQsSMgN{wCYrLOIJE&@dBBMI)qZ`|8Sdxf z6RZWN3yXkMtuig%OGC$qT&p2)uG2S0>w#RD1K*yE&;U;!r4o^g)uFd7>NmQ16Fv#m@hK_b|UW0hG}zjIL$A zIaE*A0WCz{s#lX`i{M%n*jC7fTD(>E8?3UU%aqcqg91t-Y)PWK$n0nuG0J+CPQhhi z#jQ(bVR&6v(wdJESmg$%Xk$hSC{GwfjwBVU7`;VjpZ(Mj5Jq8p7|l0b7(wzQCdk#- z;~3<4q>>O3b{V3CkF*qIs$U(?1MV-FEXLt=XN|=}W0sM2tQ0#0fgA-B3su%XtAk9`+bM%`+^ z?-uu@3t<>Z)_Z=3kDyQRh%<9&3bZ&jP>-V{d9Tygpu$h}a<@^;%~S4PJTf2sdGa|! zwtT13Tw=P~C}RrIu7z5d>-_2@I^_-Bgh>1JQOx}6!Txs{2s_d*%`j%T|COuWO$1&8 zJj&l=`c(e<%(dZuy)uLmz`y(kHCc6B32U8)8L&-Ml;$+w6J=5bzJuySxo(7@e5qjg zeS{D^m%aL5L;21=TaMt%?ifv^D&Asz&zGN@fk68oIR`MsbR5NGg}X;cQO@FGZ-;;L ziPK>T!O-z^+ZX%)xjEG^Ew50MPPxs})U4#sk!Zi5J6f)oFxE}U7^5_lRC4^hsUZ z!E(1!Yv!Q|!uh0j*r`S4qCVUFcamWqmTgP<+N7q@NYCuHfR89K^KPd!MRZk<5mgEo zJdOlj3yoz(#FB)8LIyG9no8seFT#^o34_w{2?5=nsx6k8!T3sOOrNK{?Ae&ow^2T) z&cw9AWwJ+HFSsIDZ&QZxVRoZ{bXn9uM=C)}%z}RUy>jB9tuNX#+@G17G zLtVmjy!ah?cf(;|vS|Qw zXz0rC%wbupdG^cuul9c=^T?;UD|fdgn;#wafO(78cQhQ}xgg_?tbj;e&m-h2&p-b1 zU*Fi^Ivc0l2ID*ppk6GJj$zy!ga~2R1F76JGrSjEQpnSMQYwsy1_S|kC9%ejz8HAr_K>j{zIC~Ae#7e|A52up`64` z(KmjT+-{MdU)}`HnvI4X*8bqHFnRpg5Zmujxz#lTjo}90G&7o_e*(|O5EK($RCfL^ zk}rYs2A#y(TdS|MhsX3=iUutQ8NqVNHIwx64zjYBRFZmX3?vzR9iKvz-;fc zZZSOU9dj-Vz8X9_SX~U@Qd&!X6n$-CJIc~gwnuBRrpf)4hq=z8tR`x28_#~`jC-Oi^}t$aB?)T* z*@?fNQ8iwazaB~%R422o7MvX(`HlEP9551f+HpUe8*f$yo`YvRF#?%2(veKh3~pS= zUWpI??IX9tkyXa?{FshqWZ5~CUuBt~6(8+Gb0|+GG@shM;@MVi?Dv3G$;Bc6oJZ1b zzSfdTS(FJx)ts0Wc!9Ie#6Ton^nC%>>t{i>-RduaD34CR20nZiCQ#nKIxgan4szXyaOylA&y6h67RzM*M8vm6AK zO0xRK^~g+Vs_6vr;OC?|HzH!4foFs!jBRlX3Rt!28GTYT$iyUYQQ@nyy~kTGq~LQs zah2PC73+7^(W=(b!M7h@!pXWXAiffXYh(h-h~+Ba*l*Of;1_pldKJb-ewV_?nOZXZ zLl#^1q&|lc@5|7_r*5NQ6PtkL)waDJSr@I8L|t;WHG{%& z%xX+@EjR}8CsrU1DyCxKr#P{ZLk`IWy-B*_O@qo`rcIbYUXVGGx>a_o?iS&D+NES? z7P-=hT@l!2a-W&p4AukpJu~avCVUg#z~f$Y zbgwM0^|D6Coni}Ta;Y1h(u=wAaOhczxaufj55RC_2zNa?h}bR#9+A-$cD90xx#Ze{ zl;+A0XvoWW@7Ju8OV8zvZVc3z`Gow%fpS?XV2D3wSm{g?(s#Um3yqriY?f?4&UO3k z_nby)NjvucS`7|0!J~$z^FdJR2bDN|Q8{$166XcDgox|uc}|HWamJnGv94_|<9?C? zVId%L5hW12)AF>pa~;rfi8z|vxMd5kEape1<|=DC8fd*V*NCGw5H#>NMchwAeBbW5 zsjGkigMu3rgk?hYM4^sBOS(<%-~S5u7ay$44t8B zTomxC%=V;P5v`Pb7Z#$ohg~NgElDS9@)lhEfY!|rTF{}n`p3uMiI@~SxLHTS_yv%2 zksrK$=2m(}up*p+x7%6eahWEannS^-* zXuh&K@jzNIjiuCY!RX7ShF=L5XLi&8+V*J=wwFxkaIefhJRXHN`LR z8vF-So1n`#gC1s)I;V~XE-OKDr?0uLh{m!XHn^}iFlGUf zmHjLz!wg7?Bvi_qTz|W>w|+*)Bq_-JN-As60+`N3V&YC;*w!phKu6B_8nt4X!b&IZ z!g-MRY#lqmKgi8>jsO&J~&SB~;Aq|c5Bk}Cb1)z>Ze zI+$8s!)uw%D;dNPKB-nR_=KV;lu2K67tJku$EGn78rf|#T&m$b={P?nPC^f+lEW~Z ze2K4ph1r{9T~f%atkbrT49jkcN)sPp$hB|;Sv#ctfIy3WT=u96{<^BST7UZ&vy?3^ zG8hJ>c_?LJ5gsgR5YY7MET@T?ISWEDAnGr#QETZqDV0eM)gnY1>NsNC>(XUEH?n1zn^^>=DHn;7L_EnN(ov?v z)^8&pD7FKAmiJ@vtQcjMYXBC_5r08?xSi`bBzq&rZGA1k7y!_;uwW#%YNc#{o2r!o z*3O6do>t2juAQ-x7NO%f_YZY_J=l->PkaKBt27gK_qMZ`X^O>jqP~VPx?iqfTZzFGkENn2bQ?0n#vH#GLBeo+%8-!< zyzFmMi)Ev72PsaCU#It)azu}s1sarj5I@bHcE;KTLA|y)OZ0y)K@p3`nIepEKr;DD z^KwWVtcO%T}(>xT}LaO}WlwYVv~+pv(s7^VXd zl?GS4ce6;w14?g`g*Oj}fGe;gHH;#UQ+7~@))An>n?~y|nE|`Nges?N=H@TZZv><6 zJUj?Ph;H>j^(`FX1$j~inL4@P=+gS=$70{Zn}|Lmq!d-t`&rE`glR#<{{6*?Lu;_z zGj`TG-kpB@MAY>Rvhri(&*y_2HWTOBjS)Sob>0V&3nCyUFofrzx(()D9Z4)`&XmRB`ZtXX)V} zB8H(Nkd-N}zjWnioEK2fd92Zh*@w`rm!D|;+Ni+Jun;$N9_S%wZfnX@VbIx&HeoVn z(m7zou*MJ!6(dWbC2rGS_7{)V8qjk6#>9_GdG0w!*70GSEV=0XodD=jC(tie4WmTA zK2KCZ2m8~E;>Dyr?b}Wm58Y>LZ-bYLp{>w|eeAd%^`bio7M9ycWbsWR%~fs~R!7;K z>vXD^0(->M?OTa&gh0+x+{gOn;MEjXVG;|+AONN!BRyqgk;sHWj((^sHH5Y&Ij%yV zJ$(4^B66q*N=DkvEk}ynLa?eMxa5yg9caLCs=I>+)KUm6ZQ{s@Dw1*t!z=1|v<5kA z`CDwOO^EtZWB&3N-RaC3HM>?IIv7)bml~-8Da0(Z=&LBNQ|Cd+)TsQBK2;4N4z;=Vf$P&d&gu2^E{F$lX~;s>!!&gmOkgupwp zE<%xO|2{<5>K018RrQ#Qjbv9(-sUV#@V-JVm!ac>cL+98EOTRJ_989-DswOQRc}JC zZj?5}j~eVGq`(RWBfr39AY%PS!g$OZbU1cSawDc&Zi))R0kub#d0AMsA4oXj$rj6s*&N6A||o!c}UB#g#{_|-yH%4AJeTDG&Jgf z0mJJCFHg1p+(V}0s#P!;^@3eH#JO@EG#KhH9Oxc8jqb%%{;*BOl7Ih;gZEC9bo>7|CrB;vFgk+cep6+zCVbKhx#kCc$4U73 ziBv8wH2Za8D~U43AlmYjfn!0~xZjWu`C5_(6LynwbEJERWVf8CmWQY~Tuo?E zRd08r7@)LGfHf3h# z#xpAUt7_x%hNtv|Ed##?RB-=Sself4rg<_;FA}|zVXlSN9(DB6CyL`34RPXiGgS-$ z(jOv**EPpM)eF21He-OXqOzrDof9MG!?cKTKdd_6t9I_zm9WiqIH;pVB|dZsJSeoC zO%)ihga{kW5n6&7Iwq7n!^C-J=bhx3NYUxze;dm;Yv>3G6IR^vzHp-@&9}a|q6au% zuCOzvlQW)AGdUA#1u}%qH$AT>5bVP{G|eG=*I3d4RfUEmP}4r8FkSA9S0s;;?d0C< zaEBqO{3b;}zgDla+Neg{q*n)mY7ak~@rN=D6{?__VPZLg`q_s=?$uWyErmue$;Tub zFOu{kNR=rScje>rr@ts)dkhq=j&ad`C$KpD?iJ-v=S5{XwdoxmO0p3zaQ zh7KT9HKhA4!n$3eRVuD1viFuzhl!x+WfZL2DAUADx zU$?o$(612?#>oR~AvT z2}r%=5*i|qN%5I&Nn|O}+#}IP3F2fD7a8|u=TEy1czo7#p5Y zt8OP)>f&1YFw8IwjyeVuA)65`>cr`8@`!{iX?6+V3K-g1r^UpMicfV~zcwbow%tgY zVqeepo|D@J{ixSxCg&8w7cE0-nwKET40lKYy8sRpZ}A|5`oh${MqAl z$)yN}Kw*TF=F<=YhT_FI_?8EA@Ca!{sRcgA@uD9yf2eU;>caIvGWE+@i-_+^moGl`BeNR;Bq*6kIU3}$`g3khwE_)=mlOS~!d~~K z$>V-YaI+({d0Y52V_9)I=2PCR5rn5PjPG7YAlN`s%wrI86wNV(Vm=fr=0j_hWD)(l zQ3{^77J^}Xu{e}JcaMf1Cm>yG`(MJm(OQ=YzmM_eB0yoZ)sR^Cw(_J`XF*ZNI;bUtDE zE^JU#$U{SwI@Khk9M);~=j-oYxoq9e&ih)er+cGf6z1~KZQTiPdmj@U2JK~_GzIzC z2O1yM;d;9=D{5K!fRlcvqao3EJOpF{;apVi>TMPMif*~}7I#ejWf*SWqZ68YM&4O$fzH*9u3I&5lICP zR|Q+)PmE$iS}b=1K@hT{nIqeB1bnDHU`~~ga^kA_MQ0=ogvXsw4siFs>GiAiq2puC zQ>5ZMo_pezR$J&P;<+apXuagN(c$~5_b4-7ws{e>HF?~sxKI)h0iC~(U^c91?L$K1{3f#pe|VjjP1 z%Yr_ZhpRw9ZECkRwjtv&_;s%m!5UR80V_J#_LDhvZ5UW#GUvr?4S1M3kB8k%ECbH# zVD-N%x#nFPyNBk}sp%6AQ7Oyp-oj!=p_C-ap#JP0x}6r=m-gJDI{=rWBiri;c-f;f zY>Xw8BXcI1vQWztj?c2XMMvo=`#;lT5g*cloFFnedw-aN2V~^Wfw?s*E>KZkKvN2hl}v$<~^V8d5_PIj`~MoP^;7d(h=WYac@(ZtGT-a0tc#f2bZuz3ZO zu&+rL7wcWLE71*JvIxPskgkdr8O2ooR!fVsszTugHp+YxaRUQD`XUH+ilbw1lZDy< ztsJ#7Y92yTD^CxJrnEzOP;22f{|Tb`s8A{+1~>JPU>W}`^8%GX7(7gHw732wlAZLa zG1??Zy?U?7vP;x`baJAHu5WEsk2PcN$BJ;_o81EnUe3v4g7)1aA; zQ*$?EwEkaVLr8b|r<&_z5(CbH^;Nf5LX}w6no{d#6q>n2r;!HtEYJOmkyS_rS(mpE zRrAP!l*M9@&(^B+VD|KW84SFQIXLumsxpaGh2!8rU}y@;h3fPD`%=GO!VhCO=xUxz zYQVQF>6sFk`kkKbLCN+l$AXWrF10AY-(l0IbMkdS)1FaAlR+{nbN4ntJiol|QG#P$ zv^An3wn48pBf3ok_RyV*NNtOT#+-m|k@R-ti=hM#OwjZj#ANc$f&!+Q@Jck{?MlOk|dWEzKjhhH!+?YQKr;3eL@AtEkpv z%Z`NdCM^UsCixT1D18*Z)U?TkXit1cV}u(8&2C{u;sNz=&7+3nMLnb;EyU~5>2(U~ zFZ|sBK2G$fd`d#44Q>}8|vC)Ebc*%U` z4r?t8_v|{jt;3y`qdx%-EkDIk)QP*@WnBv+(NA5VKW0oFRWwUfP!2jvOH5+S6f70s zXrS5FC{$==T_fK48`#1gOI6Y=izi)dM{e+eJ>$+lK#KM_cvTggMpsz<%6i~_{w$xP zdYjP7e_){xNAdmofb8+QJi|Fb>*W@_7NMao*ob+aA5z4>_(0RnD6F0c(jr2}w|)MESC5ho8Ut@_5%fcL$nME!$LL7PAK3|%oEOc4sj zRUq{52oA~)oK7b7z#HpdM`r_q!#zY4?`4?PbFiY?*6Z;b&K8&(w22rP4l3DLhun_Z z@tBLjucV4~N#jic50Gv%?|s#vHKRSzh;d+J-G*Y6*Jb*^q6izm+EA?TW_{zsSz<6x zGjEZEp=h>xkrd;6Q>9mDQ?{D`xR(`@aHm^zvn7P`sBc8w3yycQ%n zWi}TLSKTS*B>>)iKOV})1k(aLBh2b~TX%tc)7mFb{C*bE?A^94st|cMHrQsbh8avl zbFu@p6K&LhCb?D!x3tW@UKSwUjN1X+_$Rn91XcF5Sd|O z`SN9mCA{vREe?CjonkqWvoEPiWdf#5?mhz?HYQ^3RG0a7>|q|}HV5OTF7NP~2Bsu0 z2%&EgWQWXoT2+bS?uw){|@G4~k^zApLs!wynl$=bE}xWy zGV@4i7KM0M*|{MymhSUGL(;{5P z^nA1U%?=D_HNnbUEe4Y!piQDIRr#ghs)p)7`iQGh{15jxbB<-=&X7~K?nd*vq ztKKLyEY`2DymH#(P4>4;sZi#Se9t=23@xiqQr0fSLPDmU#>DD-9!d=TFX+w(1nFR5 zWmwbWO3tF1$T?3H@y*CtOw7yRd%1EQLeyZUWxo`$uQDo;= z{1(`~7phqhH&#_}P{Q31KJorL4tM*Q7ZrjknA%AzKq(5N65D$fJ@bDd+(*HtYUJ7%{0~q0P-f}Fki7wemY-{|* zPfV7oi*t6s|Gm6XQ30#G2vp0YCQEG;Ti+?b;08{!T{VLXjDX| zL~GY-te8t^QMZcnijxVz&f|@$xuMweCjPdH%Yx)AM}~+!W*`X($;UuyVUJWzVENQ0 z39Qji5a}K0IH)~VCnU4`vEKoJZ{5&TcS?20sEl-VpO}{7@_?4n=9u~y2jD2-4lb>V zHJ7z$-v_82clzxwB+`7~$@G@Jl2Z66yKa!?{b4Yn3R6)a1OMBY-O*~*hG&vS=-(BU zh0`j{B0;Fj+OB#&!`Vc;pG_{C4~^IgRZQTjUiR6k>%e)yG;Rw^$ND(0_!F_(Nk>VQ z183i;kxlw^=IQ3P_F4QLkrD^xQ9}W-&pj1AT!`q|BCX<&bvbE6Y(+LIHe$q#Cn!vnAvK)8UNmppF1OPolS~epdk`q_4-a| z&*p?Fp9C+Wj`5{g4H7W!wR-t+!0L2Aii1h6B$O=f#zqfB&e6V`zB=>A!NjP<*jqte(b38;t`$xd18t6chVBM!Magf`75u+SuhT`;W2W~DJ$W> z!}!PmIeT|pz8+PAB!RbmZ{2%LnhdbfZcm+k#I4#(<39=ix#Z$_{5h@V833OrxEpdH7Uq4|i&y0Z!8cdypqJ904yq%l|w?3;P?= z@puH$3qc>(Pp!FB5F7Su`&xQI7Cq&Z`|;VES43a5p9pa=yiR|v$(%I@NY)4>dXw`( z503E?J6xpi3Ugt)QUDy(je241sZp({QjExhy5@VdyttOndT=TIZ@U}u9~#Dpz4pT; z1ZhL&#RJCEAH-Boof=iDwaWcmZrUHQA`iNl0**N&)dl%YJhmgWBT{+E80vgK8tbAp z@0UYmf6wm+AQ?d=xLah6o#sEH^~vy7ZHP#CEyp~61m$t@z_iA&cYNI8Jjw5-?laht zXyi}D&!S->!v8Jre+S#M(G|`c2L*0XX5MpQFy?GdW8O`Vd?ZA)Uy+I=gqwTxs>xSP zkK7D-6@5|UhCWAkBLo9b#m0*S9L(;&3Kzy3C?*tpyZqQqF7nu!>R|A?uoWU%LKz;f z+?n~4_Lq@Nu=~*I9DDyA=Ekz`UDbWS6j-=W`>~#MbJ}un>>K4=>)|a7#(`!7Fr&3WT`Xlv%m%d3Pn>#_l7xg)Z zothpE=Bf22JJBSQ>DV}}z=Si@1n7H;KHB6yM79@%rc~M3{`t%{=>hL?>{}MIgVXcI=HVPHf07^)xS%8l$xobx?_A`_eTFng*H> zUBn)h(&z;4W&@6&1ek zwM7q6G#s3sOV9>KfW}I55Pw&VleARHZU0?%Cf)R7s_(z1(Z#(XV+sMn`yAYy_{+L| zZ#@TB$QNl^!aWX}BeuaJ#c|O-fy%|9dXLb^U79Ksnd*5V#tKs&F^+O01|Ht8yFr4I z?LH8mDOc5q_V%biJY8A-G>GG-g&t{v(Lx+;wXSXMiOfvPrQ)fk?V6T0kHisP$0Q_} zhOA#80#J{_+JEPXIaHP8X9EICUkTUbC^-|lA*<;inwWx~$$BbUeP{zho`0wy&Jj1W z#A<64e9^y9sSe`=yl1TEbARuwnloE%U_;MJ1N_Vn#}e1iAS1;t;2@0@9P+h)&afynbU0D_ijq_k5?>Rb_gwkCLxz*?VzEom|11orQ zSx7wT;J2Jq`#$lDr@LY-4_#saoE3|GoDa0g*rg|YM~lAxr_clEj%7w!?ch;R&@ex| zQ;euC!0?jVpqbV>!Swwi?|6Gm6jxW6i-g1HJBJmC__10PpdKq)mzx^Io4WLaz5} zfpFfVlz&>h^+9FAy+g$K1%3SKgI5&kz zwkMv;1IE%nMUWwC=J7Bit>|-r^fwQ&+M^=9X}5S(zVIr`JmUoh)G$pw!WB!xm_`s5 z90`lGfe7gr4rxA93LF=$4U{Myk0!O*$aqAJ3#M1t^M@#Eby6~w?NtS}liHWmaKJuT zWU%3ajSs*sEH5mk6mLddHP?`1Cq zd&eRT;7^t`Fd}~T#-IeRGu>^g5>qF(<{CDP~H94!Otvny@>Nug>HEM z(lmlx!LesZiDk&!dM(!m2=fUrV?JLIT#k;JB3uz_pL8`byACcJ@f{xwJ4VYL zC}7qyp)6IH2;&cr32>Uks1#d*&coG6hUwa9iqa}R3n=owWE0E2S~rX4te)^Ii-#&(NwVn)M+y*jQ{>PGtf#o%+JL%sAmAp-9o4H0_;!a# ziG94=FytR5ac4opJ{9}mN(YS+6FQ8Nv9En!%a&hR42@`Y3Ynrjo8}<525!M0`&Pi) zpYAFwmQELs*}5~K^L*vNo4|)3hQXfMKUscSg?&OA7e~0lWWhczk&B!6eJ7j6SCdH{ zjAOdnJ8@A*ML`ypJW_0srF`wO((#)2bxsbVD}%1P7RhKRrL!fpjF;Ei^u%p|ReZCQ z`r5YTVK>Yh=~+IwfQMH2$X>xzs&8!aqFvv9(krsON{eukY1>8BD}d){kZ5 z_AYBFVu;acfGHopdIpiO%}slbwTF?LMa5K(*nMmYFIHpfx1jH0xa11P?BR%IxS4_j z!`Z#lYp2Jtx!nB7R63W+w_1DN?=-iu0T7e)MK%P5zH5W2#7+bPO|l6Z1&ibOolRhwcAaAnxR z%1O23PKW&a^E4IS6Y>wS4Gz8i7w;AT)`-joGKP+4NQPPL6Lt(@u1Z&-@N&cZBp9sc zO6X%{2;<&GqyY|4$Mg~y7>z$>H1STSa157wT_LM)S~FV&id3OV!`Df*I9`u5Zg}kh zD(wk;l*?x~Wt0rIkKPrjQN1@6`;DmxkuHzl#RRfe}+wY1X@wXq!b3& z)H@uJ9#sun30#7Zcw|JxH;yESVZ@w8L1ATtHklaBcFdR>k}5z=`BJKEQtoG2a`=H^ zI|!%j{nF7)*Dv_V10IuRc2|N53$jJ;Ss|k+a9>ryicZ=O-i5i~1~Y)!B2$Ed=ly;n z$agNkwoxJ%;2}}L$Z$VzJ9$o?!O}qTl23?q44Hb$$v;sjJ5fI#?$1 zN=SR*EQp(mQ*4Fgn4YNE7CBXdN7I1KT`_k>Yp$U0|J?;c7onAwvAENrPbz>*9GS!} z+9`}fm%_eroY!AgksCV3LCTuipKQXJT&bZszquNa)$8b2e;oiYDVyot(m~`0T2yof zpFwS06oCM{=Za*z>QE1@D@0_f_K_eA6>9r%8`PvRJ^-voqQ`dT6_88>K_Ycj)t^w`v&F9_k;LX0 zNzFRrOg!o5*YW=?xY}wjF}F<3TRK;IsX6_*I4dtSkillu!?ZHs%lUeYI9?${=gh23 zD-$GuK>oDz2U(PiX~DZ&ASjqc&WAibC))kL{>d#b&W9ij_DDiy9h|TRyO~hXo^0pT z$tO~`--w{vU*Lm-r}A5)s8Qiq;^Cor&rVDYK(*^`AFSw`Za;>bp=-HSYk|?n|07Z$ zO9zq0@&Zpr6SK^)VO#&Y-jcGEj3>|)xhZl+M&jvGm)rnBK)$~q+IvFPx+!&J73r{p zczGal4nPC-D4E5KwX-F8x8tsQ1`yR+5NHaMFbvaE^DT4#m+4a5{OU0%p#cB~a%gt* z-1RE=fX~7}!jsZKO&C`nhceaKcy{>ffJ0jo2((teK$BF^mY(bgtX zp8uVn!My)QxjOTr;;}U|hl*qOC;?}5^C~q-smSp^S^B4_}@$BU^dsjCzr(CdPIK8{wID+d8XB69Rab`X^KVS1sVr2dVVJi zldMx@e-+qN=|R#jIokVr#^#88X-7cyI?*a?j1{ji4FE*laUh;NafDY#6)kxBdjC4_ z*z6?&osiNxN`4`KjE7LNc)GNId`FWI%LH^|Gu-eiqzWf{XeCRx1$^_}qEp}PRZQB6 zyLu=su>&Etm?Rs5V0}kl4vxsa0e8C7<4dOJ+faZ(Uol8qwoBEuTf)UTx3@OVONoox-X;N7UroX^2n zLl*CbR;Gn{k&`Iz8Cl1uLZD7j_xdqz( zwVK>pWe=xi7`4bJ3AW{g&lo@Qh1IvEHf(yUoy7Ch*wWsRTOyqSxlY(s zA{+Fk(?fM=(Jrqok7#c`+nWrY6Uzmsn0)H_$fh{?m6Q9bs!dE)pFmKCT}b7EZd^x@ zzlcQx4+DgY7(bBPFvjL!I9tHDWuh?TPlN7P*)-O&9h!gQsXq8{mSjNO%wBzxAI z8x{l^+>FZx?Z@NHlk|ay)#z2;*ca0XX;{0JZ+q#=THtBonYCA2gd8-R!M+!D$I?kP zBdQE6Jze*}mig4bzC9ZsJi$gZ0q%n{Gm`sZ{XkSnh$8IxP}aDmy%N_A9cH;rtoiCS zd78z>N6d+-ej%?6y28qk_97l5HN;t}bs28vUl0OwvNo!8*74&}%>{4*nhGQ*;!cU6 za^A@etLM&EXAnJDh(>5J5a5^CTI^>oS;P0x@@jt7-wbt%eaVD=$$e@xgWg@wIVB{wavC3=(BG`@K9R8D#hs?N>yfUDfQLXeRkrBUz~n=Gq#%j zn4!CrsB@=$VxhBVr5mR_c%Ksn(do0E*9q{c>9KoG-RVN(4$VBhSTkmqM8yIM&i#C~ z^C1ujth63#g~Qa^yWQdcZIzScl;ny3#Yx+0rG8l35qnN`ca|{KVFFMP0b!kiIK5sa=%^*o73w-HhOVic)Y1XBQvrBr+x#Mw1P8LIc^YsYjV9;@`NPaFo$Ny$mW2E)tB<0`4D}u<}>F zLW#R%o)LX@^VUnTdfDsoDJZ5vDohm1u0;In$5O=XkM~0UOaTjSh{i(!fN}c(GQOFB z5_Nx*(Uk#i)beI^i<%R5w_zD@r`BFS^^Y~#>|ZP+lG5{Pi^~xpUwB+jv^n3m{IG3F zFmP%(4jfqE4Zr^iN`5b5;yVkG>;oRbxq~!-_@%59b$Aype88+Q)&QI}Pb~JY$y@B)X+#*=2FC$iVoLWbgFi@eW!rYe43NREu+g!~q7&_8=}k9Gbq9vTQ$9ZIs3z(1 ztjx{B|J)BCu`2sNTVPymQ(Ay_Yr`oztrQ#4ntfqxAjS0V&i;Cy6k!=D>ItakXASWj zzF%uiCsYFuas(2#MMdVUqL$R4x%5&NuG*yLa^DtsQH&v*)8}=283e1@5j`EeTz5`m~uwT zSoxW^Xpgu}d0A8KIA&$ry2#RI52`zZGn!63S*r zk7Q`LFN5@sk;!``yl_6^o3=33EY?$Tu=r*Zu3f0OjvVD9ps;b1jjMb%`z@E+Uv(|v z9iJ#j)`w7#)rN)t$UE1|jK>{(-KZonVCEG*@3 z`#fA7!pKt(#K@x#Npr-iT~3r(Y=+nSTot-&k2iE3 z-BHe)+QFYVdlK3qo0%F&QdyD$q>u-Nhz5YJ{4ec?F{3ub;-u2Nh%3D$8PIZ=O-O1y zcyW}Dd+IUPHq^(108eI`o~k&mblisY>uYrhIzgtU~Xtra{2yRT!QQ zP1ZnG`c`KFFk1#agxiY7V-HSU*$|N?e7w>$dY_hq8j797MGyWELdKHMUZImU;vgH} zKXu;XpL3S|ebC$)29F#GvN`#PbF@qzm*b#RMUb1kdjU9`|Lo3eQTLy$x`+DmQ&zI6 z*LJDJGjzo~gRm>`kIRtbn~ZY5YAHA|41pAMT{gDmBox;3oqS@&Fl`N8V zIXw2X%sC@ps1;-FhN0A(u5?t+R?{}&1 za$|CBWsJ<#_-A+9$R&kton4@y7PJK{QD$||+6DiS?3j#;+pol$q+T#F&RL)C@$3`~ zRiWW1o!}2T4eY&V4=yyc=uXo6+>7KP!_0dGz1E!x(=0qEln@*}ICnHPgwoZcl;Q7= z%S1+Y_JWbrL5RgO&A+bEg2bZNWxPz%0VE0^t?n5(01uZxnc}z$8A#r(LrzAgrNJhD z#X68=;|>Brc;j~HZ(cLaT6!msTF+TNG|rhDCwaEdaWr=m#X@(DG6X{^R#2OSG_>h1jFSU>fFrPSNQc^J~@eLdY{gBdW+Y%NDg#|Dph_$gFBlEUnd?ZY+#Q*J#o7 z>RCp3lgx8$bn>Cb_Qpgy7~g`t3?j~`MQn39EKxw$@STE?TorStTSHkN$AeKl#6eR} zQC1w5`o{}6>}6~8g9$CFpYIU~gU3~DDt&ST-*1}S4*irygX*dAYjyMg*|Wz-@;MI+K5HajhO-3`1XxM4AZN}I{XUwoZ9Su&lL z7yI#BkYIY$KXoB6B& z=-jOJ-xctGZKuf&(HXtJFM)=^REG1iUiwdf^{Y;NAnS^=;}sjV*Fn!jD%8Q z!?F~02;%*J0{y@_|DhX$crSPCOKk0z-*4GxMLk*zsA>0UfETNwS_klj?X$b4hi^IG z5Hao@szHtD5NXC|-FnamLN*bJzqsdCkxUTO?9!?jb3{*)Fo;lO2y}<=&oFewGTJbd zbT;T%5q6yo3cH-Rza#NIsZf%iNXP1)X?KYK#yL$^5%!AvDMq3PqSChlats72d?LX? z0Ncg`mPp9K)c8MS@y@GqNjkvpH~-dqAr=K$C}Y2N8mvfX2okB93;SX~q}3eUM^vlp zE9-?^?7S@&1ZHp(%bJxwx=olpwqG{LLMOnp1#&hG`kPOru_#qId4h_@}jHmv_ClNJX=rP*^-JoTEOnhQ2bG_PQdC20GEwi(YG(1cg5f<@h zvW#0mvxhr<nUjpvE@slsoIlBAMU8lqmlO3M1D*9a82oRV@V z4LsxuQozP6v)LV|_L5~ltHz~~XvIM!`Jt>i!{cn#zFnIn#Y2z)V;lw|*!IvAuuIZ8}TVOQU?$DCY8#44rc=18Bi>O@j1JneBq|@JMvETj<_?5z%X6YP-)%2bkr| znRXK5k}6h_1pj;#o`iGCH)jfYnaHXHlO9{jJ~z&I_Zp_!E3IRo9H}v9exy-L{k)fU zUd;e}Hq+6-#)0V<8kt0wqg84bVYz9Lq9sc#KKnPF0Qtlo%2+_dQz1%Gij*Scj5l_` zcO=|*llA=Y3DiO+N!a?XF6ldL%(}nyXwu-yd(m_RB zJ12Yp)16?U4N0Sk@L39$HA~&Ls7mf`GvxHe_$1$56f)<)hNnaqcrZLZg`e93tI$Ks zCJx#yz4oMU_90uig_Qws$Nj4IJ8WS8-;hzVc3UQYvHb5AEINSQV@Z&Yo!$)36`2;$ zcI{E7nQKHypy3DImkqLo%PWz-HODSLs6B=arIo_7h7U}~@>;z~o%7{}1&WMnPq0{=mw|sXyT?Tlk5*33h-YJ)a`G!?lo+Q*eWG-9EBe|aMuXrPcu6`EurIYW! zzmZd)+v}m3O2we|fAB1YGFCSNCvV}ic7a*f68%MACdurOL~E{#`pTs&r-C=P>cAVg z?V_F?FxWRmP!%>~o*)jDEbT7{P=Rz4^D4bbIsj=tL}Q}IZ%wj|D8Gx;84+7SfbrWi2P?sbEr7R(sq(n%-4H( zgV>qdQvEdLsI1h>(zH?qO?6$p4CJ44M<-g&Xby_{i>??rj-+uQ1>;o3^(t70s#HMf zDtxbqbjNHF{ZKq7W4b-29|2@~+fYxh3u_+QH!@WzR2)-94A^C0TQHEh8(Q?DOw*n4 zI(#NwtpzBrzDi1&pev2Rzk_z#{exHl2!ps@xl584JFA(_T%eIzO@Ko-ffY#{@kmxj zjFa{cw?gP76A(?u;k%&%>~^Jo!7Pr@mO=GPo%tWyDrpy<%uNX>tFeuOrM9!RiI1Ut z)69j$AHA`F)g12D-JT1bVxFKqyF!kS@PLU*z4%j|DPWeVA`Jz5g3VAa0Jg^jA=1WY z8VHVE_aFMK!fiwc% zxXFj2V!Jvvr%*1X1c?AHF+2ai{AJK&I<91Jo6w*&W~R@rx3^N(QjMsE>V6vOJ{Xvv11Apt>eVuE27$ee$F~vP?M?b)u}v zA3~hG8YKg)nL(IBx3$3o7A7{${JWOc=!@`b*mr?DWabf>oz)w_&5uG#=I~c{o?R{6 znEUo)>83`~%E2ib{!H7kYnr)PpY{tWG?*ORJDLT$x2~_UBLDeBQ)BXwJNCCQfy@ z$n60C)VI++q4QQq(85kdMHg57R4Mk%;BBhJRB0HZE5(FIq>~M zxv%lhzK0)q6LS%!UGdQTugqRfz8x0M81#{DhnL-=a_h%vrx|g#SBRDXOU}xjby>3T ziEO~(kd!S3&^T}Qc9FvxFxq{d&NBv(Mp*2X-*^?W*Jtgu0$!e1yUsfvfsHHB2(IQ; z3QcB?(i(HpHOmNNCW`;~paM_%%*GGtgt8_TPx>F?Jpi1TzN=EU@nsVa%N%;R8LnF( z`g2B*8!4(>V#`D|U36vM7UUY4s}1@BlyDNPU6hGCg^)gHK(X+YX2<1$W(9|+=wYFi zA;W`~t05|!xV{yBVl{+^zu~g zl2=lEYugjQw@7{5h_WQFh50`s1Ut_BrsJi;x%bRupcU5sS$UD86{ch&=-wb-MQT2! z<3%8S^E5@Cg1u@0i{L;%BDXU8?uJXz9h*S8z66jEOh?ScSdlD_Zj`}iwH*1t^?LxF zFnQ4hC?S<3NtEF!sY((%<>6g0RPa^Eh``U#f0s?~p5SG7+8aQx3+s{roi;)^s=#wC zH1CQAJWUoK!=Jd)|EwbFYO<|MGz%{a=#5_f+jUKBmVIS9q4~WE(~H` zTO6Eb%RrhTm!#rxe|AEUzgEYiN8>c%gf{Teq1z zq*ocbiq%CCIZUQnN1pX_?nX8Ip-ob);NS9F$itKdd6) ze_rue@eziJ3c9Kr@-pco&W1nsUPggsGBySD0$^0y%|JRS0%I}tf`X>1`S;tMEcfz?EV7YtZ(ldhsmgkDgX@i}I7Cgp*ZfD`nD?a{x_+kW~| zwoJ#8nJ;*~hmBE44jMAgH}ZuVes$clc=X;uz}YWH0udtr52vRAkqktRx0|3L38?9Q zz)V>spmB(}yK5hQ|5o%7#ZPkC;AMS3ytHR2@9G|ptmYnP;9-X7y?>iR^ z!^jgcV}ac|v>b|ew7o~g1(S_@Z)cFfAE@>#KE<@}0}S=ZVR_iw-5Q=&*_!^G5;v|? zNd(stc4@!jKIW4;*NQ;Eby}^1h$UXVRnIQ$YETJ4E|PEIiu!0aI&DcdI)d_aN>yf8 z*CO$&*ANmSZpTkc_o}P>e5&%zKCX!HbWGGTwApw=ONDYel?zQK>exkb70PV1`199@ zsosb!Aq9uo6n}FZE2C9T>q<0mUwf>8@2Qi5n~;{Y`nyIed1A4Umflz8FA6K51qokm zk|M+CMx<{^c8jNuNcVc#Fa@?$O8+G|1Oha=r0^`nW*r^JLTjttNtPj|W}-QZo9g2@ zXt1IqhIUXGxTY|}==kmc_!rcT9XpkeJg|2NJQC-0A=T@ht~iCPf@-ksd?_wtrSH2s zTdDLe#P`LXYDzW~i=yJJcG3>E(Zfk6S;Gg5-=?XTbjnrJZKLu7zA-3YAE z^kLBMs;d&D#^(<0??~1U*)EE|_WNknY8+OWSV8bdiH}OO#Zrz$qCoX)(x}@Qo0E<6 zplqi!x$SRRye(a@End4bnmB`Nt)Bp@MM&H$K zgm^*?y;eqKM8EKlF%OA?}-_^nY-9t_+b08yxj3fs5xEh5LznWSMwsBE#Dg`CP>z8yH ztr6-ixjY4}=Fo=DHk1R%oDwi`b#MH|@DJ$tWC$5@@J&b#YryqlRlW0NWdmm)dhO>d zy5t4ZRsONq!%AkeW%*NTxb%}_nM2s=uGri&0+OwxeC3x~*jC_#rI$c4Pb+OY77`E% z3tVSUH;gjUo`ruXv6>~ie}~R0W3iScAxxt}JHNHEu7td+@z2PwETxG<&<$3noAK@B zjLSwytm|m_O9?2I!HO-Yb{WwbC1yXv@`RU<)J*!WO{*+${vTOrb8d-N%{^=h7P1NY zYjm*Ao=y&#SoSfPc-RpXg=X(FKXrH4l6sguP+`B+X^yPg+P?OU`3G&@CBFGv)mEx5 zY#K%48E0dyB?fOt9f%xMpFOu!%VkLwvK%iQzy-wK42)T{)a{QcfEKbsbkLJa#)Ws#JbFw!fateBx1Mu1ZY1M;E2C`tH0g z(3LO6Y9Jiy>>(2IAf(aU+m~7Tb`319sv>;cb#(rRhc-YtP8n;|IR>y8@yuuSIcR2R< zIF*#l%<3lQ9z(92M|Y0e(5%;Qc7q3A7}u86Y;Nd+1#6)6O`P)aZux_ytDoyHFYv-6 z0#h^6Cz||@SZY{ABxxoB;weAj)f6E?qKG%MtV63$A?R2;%bzm@9yentR!i2q1z$}E z#a}q34J1|s07MVWUWJmsj_Xky;=(D=HEg~6s{=#f{**t%o#+D6jE9o=5^Y6|g$gt9z6 zX^0L`ZU;vY3eKyWJwMQ64!X|Xl7$j4Ph4WU>h^YKEcPcZLt4i``1e^WD*b%$i)*I( zyfZW`2X7nQ9TL_XpDUgGmewuAjTnZzfjr%7&?kA0>NDc0lu4jLCBc#T4}pZY_{qIG z_g~77Gov_;w&**b2w<$9V38miLgxGuau8a45p*FO)@F3>DPff_G$OylA-m|w^FO9M zJ1Yqp%C+BK9&AF_a(`ga00!x3v_Xa*k=z?7=&oS3)+ZXe z%NDMA7B}z}2hNGD%1-Q1Tr?}YVgpSO%p^D)>c0neT4EmMZ4pYNGMHI#-&Q+;(gjN4bfi`CEr;#@~@gPDs~h()B|Dl zaBp;WH(j5>_Yr#3+*lpAk!G51(q4zSBT$0}j6?OEJx|%@nb&u7G_Xv74P6K@+4HU3 zR+hP6Vc&)fTB@`=k}}t)-HabBRWz=C3yo9Ob_LQg>Vdm*>%1bqm;(>IY!y z(KwFGy>Td2C!*eIaHgU6%Xx^hOluC{$T6F*JPVgve4|SZV782^WrQdY0)om zXEeE+b$&Xv_y~bbwyPHlHcRvh7)DkI(}PvfC|Wz~seT`LBpkpDAhvO*5ZsCYktx(n#J)20-yzTbLo$z*>Nx&2N2vz%O|AOGUiod6Mt3Qf}&)MyWN8Ka53BtekSWC z`nNWbMseU)jXi*>-T06%!gAFsnGwBuB#!(=N_FpT7a*)7C%0_qC&j;fWUU^6;R!JI zDMG`M{V@m;s9FJC?FcKELcOgMx#fDsLGQ57DB5QI)GJ&^aXG_QQImH)$ouZ|{ePIA zyhpO@q)AKX+{`muU@Rouu3`qQh~f{Y?MjRGe_S`2O!f|Znd-v>a-1#DFw4I-(6e@o zf0_N?m4e)MCa4RkZ}Yb&CDIdItU{C;eXLeMHgOl%w81})-Q|!6o;!A>`+dkP4Xs2{9v7Csbd=!4WLw^;SGMVN{GlCHds>6>k9+S zT;#UXXyM=NvAG93LtC9td+@Oz$XO%J;~7I{mh){k+it#@#^h_Z>G3KDP0+ve$!+`u zRa54T%(An^yQ{((g3(H_SdTrSD3b=h?=XMX)2%n=*tq>^Bos>u0W`?Cy3ZT0<+fem zgR8*bbrTQa?Z*xJzS6r=o1jEQ#+vT#=X6@_hqB6uKcC)krxtj9X6e#p0nE@uK^6r$dPrzp5z_mIouAe0M0=*6VGZmpJBo;_E&SpLn z(-UZ20a{}!$QcX}nH;%w-Kt^Aodv(Ls9rmbOp9T?F=~edHM$>QE$QPGH$*Lj1HGD9 z@XO~AcAbbp>1Z9t_`NV@S{$`OkTp7_ILTN8ZwkMaoHCgL-6PXv9P~Z6nHYD}MyIs1 zB^)6-$tDQu8C1(|SxXybt;BEOr0g$ex7qd}TMLiAV;-d4c2<`P!J5bLm-}XFdYL_997hsP0JG#CJD38Wg^{B zE_kG|P$zLcmlH_>q%9H!ni*K*?z;6gi*aDq?QLJ+zR-5g^&#yn1|T;>F!fYuFv=16 zsFW>0jhyRE$mzXt;lU3%9DdQP1^a+$6;S%z&eIZv{5p*A5vIT}-pbTc)PZ8se}ibCP3z2O?l4G0%F&v)$(+ECe&1i`4Ir?A1a`cVmXYKQ>&RJ%ury z{Qh&n0M`=vhf>F%W?Eohnl|g5S0L9l3pl*O79v9}xVUJ}Eu|(-D35@GywTE&Zo;Ym z-cg4&ObX!|QD9T5h}YM<0i@EHdR#oO+ki%%`L4ri;wniH%0S1AtkX9UgQvP#ow&b%q>*DL5l!#w_ zUqQji<>~AZ72t4W(n_Y#|P12MmI7jO4stsZ-PoIZfb0>~Z-+`J zv_Wzyv9}+9Mgb56TLiGsxVI{CI<>nS&(Ls<$FGtANYV&nc^&nKFQF&!l0wTJ?%pEV zU#5hO4~Crn_SdlzkdG#qez$-CYSI9)L;AZj-ty>1%-A4|xYz>5HsCdvzHVd4` zPhJ8rGdGcl9N(!F@whA$>uYb9OU^?mCKOVcm4+6t_ybo&=N;vR|FL_YvKFQ1aOUuT z&s6NZML2JiyFcbq1(#HGq67PY}nmjhCWd*w7wGIb4tU! zPh#s7YJbbHQWokk?}{uFFX13ofk>%Or41x3;tgvMmr4E4+I-`YqfAFw3uhTP_TCL5 zXm3#{SszMlaG-?mYr>uU-LDh;aXj*dE%4+km`Z;gZ;)+Jen&ePhE~%M=R|GnH)aF% zqv+IhDVXebW+a)7L&6#ivgIMf_K)uT;{rdK^%rDDAw!XiLo*jRhRNNrs<>WJBhRe- z*I?#GnLQMYTFz@qf%JixjO6{HOig`a6ip{o3*}o4%5^w;K=j}i?4|yW`0tre?ukXRp-R2I9A-R$pV|oQHKf&&bEojnLauK3T**;>?mKpL zTstvkVvHsPR(V&xwjKWm3nEIm%eUvxK9`2Z{n@` zuN;8|Sa<%9Z?Tr>B!v1b82L0va7t78D$1muhGyg~_ZE{&Y1jzWJyW2apv;C~y3aob zNhO+O4E+&t368m8@n3d6&n+DO>fVs|zj}#Fqe|D$x7~WkK*cYFAz&;y5e3rCo6Nm` zm}el*TWjB38O27(0?(gbXgWzdl{F|{WMtJ>&7{8{hfhiEy@<9(sVbE2^sEV&M3IcF zS_~i;Oqr0k_UT3XxiX=!aYX7^S#CL(sIb2k-f9wTv=+H`lXKZ=?`~=ge3-aFjZm#CTy(wz0fWr$MnuE4V{_i~BQ=O_C)J=Zgg$Rya^zGiDmA%h) zq&l0ZcyOV)L?sG3mx2ldD`u;RXkJ|>z)N#1EU<(}ahen({GF~Yqmr9!>!WOZpr8xy z*^L8CbO1A%^vm2Ui@|X2D+Dnm%C&OoSay)VzPXHN+h%V&mK`&#D8AQB@^{dylmpD; zZJ>t76MC$jY<=3x*jY?$52mk+Pk@H>9Ut~mGUx6{N?bYBxQ2OE49wg0cdUhbCHLXO z{h4hKYYF>0?0&^}RPE(EUxof%|CPR~E)K-?sZfLQ@4SRr=p){i#<`mu=D*OjAJ$6h z?jtU|g->b;Wx@6?%y%2YwU)C4GVTcnCrA>e_+Ub|a(ZUOZoOwU zMw0?Ne|3BZ&EX>Gzjb8(>rJ$TPor?Oi85yrc>FTg7WLxQZy9kjEY;W0akjleYZctW zlhsPyus(L{XRZM2rttav$R;SF!USX)DdO)oqVK_2fvfIFS{f#@*8L;%w<2zY?CeHh z32FX6dLEUyAiWDd8OIL)4_;E@_?%b5pJKO{3DZ+*w2C8 zlWkbV^`xQoi<5jm$dy+5Vf9h$(ILQDF$oXojH$dph|-lS_Bh0jE~rt-vo88h^-M1I zy9TFN`9wi9+7U4Goj<1Jvh_OZg>L9@$|d%jmWU$y3U9B(uRDQ!uFr>) zUhwk)&rfP9wY1Cp_Z|zk8WYAGho<86tA*#OJ)^Sy`+Oa7-iP*$4gp*{`B8r7oaM$n z*>`L|x2+TMg*hqHFZaM@ka$oJ-S01mKnkKebN_Si`Jg}ySms)Me2>=f|61P;f24hI z5#X?p)zjhDj_=W{ZaCSyDOUa;F(c>(JSP>|)n`VRF<#;{CojF9d>(k{5bUOFI_74? zmdz)oW%;Wqqvu(7>z{4aKD2EVh_TK?A1$-PG7yP?rH#*0f`ay*w>NEtUGQ5v4>G;Q zwri^x28}r2XN@*G_s#H0Xv-M9fLom#HrX0A3cxM$ZMuL*dQIiDt`+bbF~h&<^hTn& zK2zcBLx9Mxu-ABY6hzb&lFid3o4X=wtCr~U*aH+IMC5hh;{ zOjsNjKf*kvt59sJ&Eg+gn$Cr_49lKmGQ>JZW#KK9n9fjXVDBp4EiHro|JvV~aR_~E z2^fY+mddz~cUJ%v`PgPTHms|4G;-2A%}nmwE229_F;Lb@VE&WseydIkpHoH^Imc0M@aJ7)zXA$Fx`pFu6U#hrc^AaKJTICb(%iAi=J zwJzI#&6H;TpQ@iz$g=eY2jC-2Z}z7iNXEeErfFvGGq`#!32oYbbS;0=c@&@_(y7b$ z9%usrTI4n5wv@gMf;ZCFlyfku>>U&Wf!`WOZxO?v8APl_+Q*7CLlmS zDHx^U*93iW)ovk$7K$2m4B~G!FW*rEx_BiHGuod7`V(OpiMoW%L7hjlaqHim-Qljj zFKymGAVSeN!iwp++4uUCl{&-=qHQ=(w=1x(HnwV_Nody6oM~{Qnhi1dTx1cBSV;T+ z>Z2KrlkD3N`z~51G*SY^b7A zH_P_!T(dIgq&sEdwMhHqrQPV~*U^`|@dGEF+ZD>ZB?(@4S#%@a% z)X8=V8+}Oq|4>a_BVswka)^_1GRKobOnTywF^huFwAM8j0FiN+apMtrz|1cj(_)af z6|559cvt>*X2Pi$tFtTf+-9rf)alD2LW(jgx#I%3T>*;z)mX>ev{Yr_HMMZ63;|f} ze8J?XYHo*AvU2w!@L7B5tcqZno=-415`ePbaVvQRpC6-+3F&Lg1|NPg+;boRkmC}{ zgliR6p{eoe^c)GcboWA$2{s{U!R2XN5?WafwEd5~RG=8fvdCIiY4Lsh48@usU{aH! zZPmP)5bGMoxU`b0g6tZpw`rCKDRq-C)B)^nf{E$k+yoeU4n6iB7WYP^&CT7a<6P$? zfnh>6Fp}}3EM2l?flGPtIx?n_*C&JiENflL<! zg6gzx)ZP)(O_x{gz=+ z+PZU87&PhI$N4guz>~s~HfqxO6;aY&`1tgIsA+L(dz7)i-ZSr|*d-@?Mb!|OP?*7C zgsfGGjb5>_<`~!WYmyrhiGf-so0vK1E}S9T)j&J;A%1y;Ij<8GJm&Xod(~Ayk2}4D zkXg}1@3!*ijdF9GPDrXxG!QZ)v&f;+I3H~VHzbAHE9VZQGmL$i=C5e4MAPF~F!u8N z`Wf`S-nNb73+~kv^3YQIINT&fE1K**L03qHlS;Z^?c-VcaG+jVyh6ZsMaV$+dk$(;D4tpF3zA5F~Pd3vdKHx;ja0GQn z8E+~WLXZ;Y|=DlbKaEkQlJkoe#|i6PmJnTB7+F9HF^ErIp#+prLazfkPwe zacj{y##QC2~Y%@9aV zEga=*(@M~|a2>jts{Rqk6AdwI;6o@|X`t{Tj}F5+;Q8I4^`xXl-Z(Ovs%;XM8j0L(B z#z~Zv=W~G0D;;FlVbdXg^9!@A5Pw!G+g(Y$= z>|hM+ki2faz_K3fbQIqVa$)QC+0R!aA#$zB+2)PsLtFV|iSgJ^Trync3;Lim-r#wB z;sw`~_VM8s3oUdy|4Yo1OmcX8>Y`O%fzVNR2APVL zsN63>Vt$iW;bdsr(g%+~9Iu(_F?>JA+&S z7EVJ0(-P{O~!_yL^Wrcv!oJwvAM-E0lsYjO~F zc*mwxMN_}oRaY*0mXY}7(8ULQo|BGbdUrA9drB(=IlB9p6GUxvVSpQRApET=16QK$RfRx*C8#&?W52Sen@^0o{ zG;q>wFqPOFnP&}<4Et;Qme9ji&RzE;bNl3d_MyGtx$(JWYVrEsQ>!<<5>?&T>$ih5qu1u<#7o z%&dXZPkt@belO^FY~qapJewGwk(w#*t*@$&Oo~zIt&31Yeu>@ki{{Xso$>8wxiAGc z;~r)h|MHCvG*dVMl+pX1E^BbKS-%P|+)a+oY4VMmnw-A=8or>rkrrqo@C)gVv4@S= zEZBJ0{zEx9lF4`bmre>({y~f&W`ppCKn{)Y6cOZWnWGZd8QlRF5u?6Yh8BCxM^8Y&*myrsP?01k?Y05F&k`C`+o05=7^4 z)J&_DQVNxI+-SYo$-N}m&b<lV1s=zF{Y@MWn9C4wen&e z>evsr1wZO`eh*?ElmNf-!5<=+6vBKZ)9M?=d<0`^!%^$Oy1ReJiDKr^z#=cf{o?Ts zU-UcqE{c@fjZ+oZu%OX(`HWNF{$pfv|xWASFhFVl7SB=lSXw7TNiB?v_VGU>O}dNmq3)zG8_Xf-=9#YaZBtTMEN~ zUI)f6q06aF_EzS2otdF7`g}of%5+D#bAn0%NnCW}~v~fw1-k;n3I9+p^cpA6)OXf5D`@bNN zg%RT|x7CbyDr8ag5YU*l?3b2_&I&Fx$%)DBFpdHTJv54@G!fuf9@nY@rYueotWcOkmXz6n~ET7-xud+hf@9N(Wp9(R|?$M*}tZ2e#e z#yP9w$P7Z%y;#WMRyY(bMvY0CY0sUcXMF50!*@1$vq+Ej>;rPL4woQ4kK$!KyS?S( zfdi$alJH-d$gm=KrQe53r)bqpR<#<24Qx-xa{uUQWhj-Qnn3l0kYE^mr-wKKhI(V8 zXuWM~#nV}imvG=!FErxC;r($@_hU`05>?I37N^$g?9{VYq_$8Pn9>?U`xcKIM(YQb z5YOQCo_ML8o?!?!HBG`+Z`y^L1{JX}RD*d*k4BkVIUXB) z&~+vmmo&w1_%hT6rD@y;a7N8gdR-rYy-vY@idudzQy~Ib&2yMU1sn;n^J{0;z)1)| zEj%xXL%r6z`u|~_ye}2(-={xP@%voa0&U32Ix3ETsH9f88MFN7C`m_K|$%G07^jUbcQtc%VtdE+SYkWcktbdVu z1ydk+l23YbD6&c1NG$J! z)%oW*vZKLDKYRfu(fa5z&)kS5U1?O(Ak+zcLeAB9VLAEpJCo!1jC-CJY&sOa1_;6* zCjyt&X6=P;1m<7^|BI{CE|dEs&r#OEj`DMKqHV2JFw`}Cuqe(`yKI_>K<@9)r@ole zJKpNptrDUXjW(-v63yD(cMcZI` zZtJ7#Bm1Y;)p$NS%cuxQW!5?@Ia|vR__=w$vA&AIi56^6`Gp^QE^w7**Q!-;KNC~X zM2;&{!YdZ_={Gp|Dt?#PPKxCQcF>~77Bu8xL-%B#P1#J9@qIFtAKh4ui6T#eVGm&y zOAJUcI+BtU;qttzG)DY+6-8MEy{<2!Pk9Ly^78vyq8t`%cu^~D7)o+r=vr#e!_^{) z90+(H7@j#GZs$?1i9~6yRFvDYxrz|M9jjtBtJ4nQOIpJdn)eSOqG)624Tj}2mS#*&qh($iNmdMzp8z%3mCO!1PiE53RJ%-O{e?=eRQ_zS#s ziC?*6;`Z-RB+V(qTartBCAd0CjJ682%T7%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/kernel/files/patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch b/kernel/kernel/files/patches/mageia/fs-MAINTAINERS-add-exfat-filesystem.patch deleted file mode 100644 index 750af057..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-Kconfig-and-Makefile.patch deleted file mode 100644 index 674116ff..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-bitmap-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-bitmap-operations.patch deleted file mode 100644 index 5505b308..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-directory-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-directory-operations.patch deleted file mode 100644 index 857c1dbb..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-exfat-cache.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-exfat-cache.patch deleted file mode 100644 index 179a1226..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-fat-entry-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-fat-entry-operations.patch deleted file mode 100644 index 5d0f4f35..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-file-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-file-operations.patch deleted file mode 100644 index 49fd0d83..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-in-memory-and-on-disk-structures-and-heade.patch deleted file mode 100644 index e347a9ee..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-inode-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-inode-operations.patch deleted file mode 100644 index 0b47e8a9..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-misc-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-misc-operations.patch deleted file mode 100644 index 5d461d19..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-module_alias_fs.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-module_alias_fs.patch deleted file mode 100644 index 6232c18b..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-nls-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-nls-operations.patch deleted file mode 100644 index 5c5792d5..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-add-super-block-operations.patch b/kernel/kernel/files/patches/mageia/fs-exfat-add-super-block-operations.patch deleted file mode 100644 index f51a2518..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-fix-discard-support.patch b/kernel/kernel/files/patches/mageia/fs-exfat-fix-discard-support.patch deleted file mode 100644 index 5de9917c..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-remove-from-staging.patch b/kernel/kernel/files/patches/mageia/fs-exfat-remove-from-staging.patch deleted file mode 100644 index 25268372..00000000 --- a/kernel/kernel/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/kernel/files/patches/mageia/fs-exfat-update-file-system-parameter-handling.patch b/kernel/kernel/files/patches/mageia/fs-exfat-update-file-system-parameter-handling.patch deleted file mode 100644 index 9e07cd45..00000000 --- a/kernel/kernel/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/kernel/pspec.xml b/kernel/kernel/pspec.xml index 6b61ec35..fc40e2cc 100644 --- a/kernel/kernel/pspec.xml +++ b/kernel/kernel/pspec.xml @@ -12,7 +12,7 @@ kernel

The Linux kernel (the core of the Linux operating system) for Pisi Linux kernel contains the Linux kernel, the core of any Linux operating system. The kernel handles the basic functions of the operating system: memory allocation, process allocation, device input and output, etc. - 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 configs/kernel-x86_64-config scripts/generate-module-list @@ -33,27 +33,11 @@ - 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 @@ -113,6 +97,17 @@ + + 2020-08-05 + 5.7.13 + Version bump. + security + + systemRestart + + Mustafa Cinasal + muscnsl@gmail.com + 2020-06-17 5.6.19