diff options
author | Hung-ying Tyan <tyanh@google.com> | 2024-01-12 09:30:12 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-01-12 09:30:12 +0000 |
commit | 3a7d8a2c6ce1470555a132d37dcd567441d88b87 (patch) | |
tree | e2a69fb44a4685ef9dfe826f4d9dbd26d03c2c0c | |
parent | b3cbc4fb7514ae45ae276afe8eaeb29e8ad63cbd (diff) | |
parent | 506413449e3de8995df4d2dc5ad2b1af6281ef13 (diff) | |
download | vold-android14-gsi.tar.gz |
Merge "Add vdc volume getStorageSize" into android14-gsiandroid14-gsi
-rw-r--r-- | VoldNativeService.cpp | 5 | ||||
-rw-r--r-- | VoldNativeService.h | 2 | ||||
-rw-r--r-- | VolumeManager.cpp | 67 | ||||
-rw-r--r-- | VolumeManager.h | 6 | ||||
-rw-r--r-- | binder/android/os/IVold.aidl | 2 | ||||
-rw-r--r-- | vdc.cpp | 4 |
6 files changed, 86 insertions, 0 deletions
diff --git a/VoldNativeService.cpp b/VoldNativeService.cpp index 5a89ea70..bcca50a4 100644 --- a/VoldNativeService.cpp +++ b/VoldNativeService.cpp @@ -930,5 +930,10 @@ binder::Status VoldNativeService::destroyDsuMetadataKey(const std::string& dsuSl return translateBool(destroy_dsu_metadata_key(dsuSlot)); } +binder::Status VoldNativeService::getStorageSize(int64_t* storageSize) { + ENFORCE_SYSTEM_OR_ROOT; + return translate(GetStorageSize(storageSize)); +} + } // namespace vold } // namespace android diff --git a/VoldNativeService.h b/VoldNativeService.h index b3b4411e..6debe771 100644 --- a/VoldNativeService.h +++ b/VoldNativeService.h @@ -160,6 +160,8 @@ class VoldNativeService : public BinderService<VoldNativeService>, public os::Bn binder::Status bindMount(const std::string& sourceDir, const std::string& targetDir) override; binder::Status destroyDsuMetadataKey(const std::string& dsuSlot) override; + + binder::Status getStorageSize(int64_t* storageSize) override; }; } // namespace vold diff --git a/VolumeManager.cpp b/VolumeManager.cpp index e29b9206..dc6fae98 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -36,6 +36,7 @@ #include <linux/kdev_t.h> #include <ApexProperties.sysprop.h> +#include <android-base/file.h> #include <android-base/logging.h> #include <android-base/parseint.h> #include <android-base/properties.h> @@ -53,6 +54,7 @@ #include <private/android_filesystem_config.h> #include <fscrypt/fscrypt.h> +#include <libdm/dm.h> #include "AppFuseUtil.h" #include "FsCrypt.h" @@ -1196,3 +1198,68 @@ int VolumeManager::unmountAppFuse(uid_t uid, int mountId) { int VolumeManager::openAppFuseFile(uid_t uid, int mountId, int fileId, int flags) { return android::vold::OpenAppFuseFile(uid, mountId, fileId, flags); } + +android::status_t android::vold::GetStorageSize(int64_t* storageSize) { + // Start with the /data mount point from fs_mgr + auto entry = android::fs_mgr::GetEntryForMountPoint(&fstab_default, DATA_MNT_POINT); + if (entry == nullptr) { + LOG(ERROR) << "No mount point entry for " << DATA_MNT_POINT; + return EINVAL; + } + + // Follow any symbolic links + std::string blkDevice = entry->blk_device; + std::string dataDevice; + if (!android::base::Realpath(blkDevice, &dataDevice)) { + dataDevice = blkDevice; + } + + // Handle mapped volumes. + auto& dm = android::dm::DeviceMapper::Instance(); + for (;;) { + auto parent = dm.GetParentBlockDeviceByPath(dataDevice); + if (!parent.has_value()) break; + dataDevice = *parent; + } + + // Get the potential /sys/block entry + std::size_t leaf = dataDevice.rfind('/'); + if (leaf == std::string::npos) { + LOG(ERROR) << "data device " << dataDevice << " is not a path"; + return EINVAL; + } + if (dataDevice.substr(0, leaf) != "/dev/block") { + LOG(ERROR) << "data device " << dataDevice << " is not a block device"; + return EINVAL; + } + std::string sysfs = std::string() + "/sys/block/" + dataDevice.substr(leaf + 1); + + // Look for a directory in /sys/block containing size where the name is a shortened + // version of the name we now have + // Typically we start with something like /sys/block/sda2, and we want /sys/block/sda + // Note that this directory only contains actual disks, not partitions, so this is + // not going to find anything other than the disks + std::string size; + std::string sizeFile; + for (std::string sysfsDir = sysfs;; sysfsDir = sysfsDir.substr(0, sysfsDir.size() - 1)) { + if (sysfsDir.back() == '/') { + LOG(ERROR) << "Could not find valid block device from " << sysfs; + return EINVAL; + } + sizeFile = sysfsDir + "/size"; + if (android::base::ReadFileToString(sizeFile, &size, true)) { + break; + } + } + + // Read the size file and be done + std::stringstream ssSize(size); + ssSize >> *storageSize; + if (ssSize.fail()) { + LOG(ERROR) << sizeFile << " cannot be read as an integer"; + return EINVAL; + } + + *storageSize *= 512; + return OK; +}
\ No newline at end of file diff --git a/VolumeManager.h b/VolumeManager.h index 943a144c..2d6b968a 100644 --- a/VolumeManager.h +++ b/VolumeManager.h @@ -242,4 +242,10 @@ class VolumeManager { bool mSecureKeyguardShowing; }; +namespace android { +namespace vold { +android::status_t GetStorageSize(int64_t* storageSize); +} +} // namespace android + #endif diff --git a/binder/android/os/IVold.aidl b/binder/android/os/IVold.aidl index 25dcb324..19e8e91c 100644 --- a/binder/android/os/IVold.aidl +++ b/binder/android/os/IVold.aidl @@ -134,6 +134,8 @@ interface IVold { void destroyDsuMetadataKey(@utf8InCpp String dsuSlot); + long getStorageSize(); + const int FSTRIM_FLAG_DEEP_TRIM = 1; const int MOUNT_FLAG_PRIMARY = 1; @@ -122,6 +122,10 @@ int main(int argc, char** argv) { checkStatus(args, vold->shutdown()); } else if (args[0] == "volume" && args[1] == "reset") { checkStatus(args, vold->reset()); + } else if (args[0] == "volume" && args[1] == "getStorageSize") { + int64_t size; + checkStatus(args, vold->getStorageSize(&size)); + LOG(INFO) << size; } else if (args[0] == "cryptfs" && args[1] == "bindkeys") { bindkeys(args, vold); } else if (args[0] == "cryptfs" && args[1] == "mountFstab" && args.size() == 5) { |