From 4cff06d45faa4cf62f471f56550006e5f0a2d7db Mon Sep 17 00:00:00 2001 From: Oleksiy Avramchenko Date: Wed, 23 May 2018 18:59:48 +0200 Subject: [PATCH] Use exFAT for SDXC cards When both VFAT and exFAT are supported VFAT will only be used to format card. Use exFAT for cards larger than 32GB per SDXC standard. Test: build, manual, mount exFAT volume Bug: 80202067 Change-Id: If504f9685256a669c5801a69d69d5a214ad27455 --- model/PublicVolume.cpp | 57 ++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/model/PublicVolume.cpp b/model/PublicVolume.cpp index 7420c79..fc1c9e2 100644 --- a/model/PublicVolume.cpp +++ b/model/PublicVolume.cpp @@ -246,28 +246,53 @@ status_t PublicVolume::doUnmount() { } status_t PublicVolume::doFormat(const std::string& fsType) { - if ((fsType == "vfat" || fsType == "auto") && vfat::IsSupported()) { - if (WipeBlockDevice(mDevPath) != OK) { - LOG(WARNING) << getId() << " failed to wipe"; + bool useVfat = vfat::IsSupported(); + bool useExfat = exfat::IsSupported(); + status_t res = OK; + + // Resolve the target filesystem type + if (fsType == "auto" && useVfat && useExfat) { + uint64_t size = 0; + + res = GetBlockDevSize(mDevPath, &size); + if (res != OK) { + LOG(ERROR) << "Couldn't get device size " << mDevPath; + return res; } - if (vfat::Format(mDevPath, 0)) { - LOG(ERROR) << getId() << " failed to format"; - return -errno; - } - } else if ((fsType == "exfat" || fsType == "auto") && exfat::IsSupported()) { - if (WipeBlockDevice(mDevPath) != OK) { - LOG(WARNING) << getId() << " failed to wipe"; - } - if (exfat::Format(mDevPath)) { - LOG(ERROR) << getId() << " failed to format"; - return -errno; + + // If both vfat & exfat are supported use exfat for SDXC (>~32GiB) cards + if (size > 32896LL * 1024 * 1024) { + useVfat = false; + } else { + useExfat = false; } - } else { + } else if (fsType == "vfat") { + useExfat = false; + } else if (fsType == "exfat") { + useVfat = false; + } + + if (!useVfat && !useExfat) { LOG(ERROR) << "Unsupported filesystem " << fsType; return -EINVAL; } - return OK; + if (WipeBlockDevice(mDevPath) != OK) { + LOG(WARNING) << getId() << " failed to wipe"; + } + + if (useVfat) { + res = vfat::Format(mDevPath, 0); + } else if (useExfat) { + res = exfat::Format(mDevPath); + } + + if (res != OK) { + LOG(ERROR) << getId() << " failed to format"; + res = -errno; + } + + return res; } } // namespace vold