summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHung-ying Tyan <tyanh@google.com>2024-01-12 09:30:12 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-01-12 09:30:12 +0000
commit3a7d8a2c6ce1470555a132d37dcd567441d88b87 (patch)
treee2a69fb44a4685ef9dfe826f4d9dbd26d03c2c0c
parentb3cbc4fb7514ae45ae276afe8eaeb29e8ad63cbd (diff)
parent506413449e3de8995df4d2dc5ad2b1af6281ef13 (diff)
downloadvold-android14-gsi.tar.gz
Merge "Add vdc volume getStorageSize" into android14-gsiandroid14-gsi
-rw-r--r--VoldNativeService.cpp5
-rw-r--r--VoldNativeService.h2
-rw-r--r--VolumeManager.cpp67
-rw-r--r--VolumeManager.h6
-rw-r--r--binder/android/os/IVold.aidl2
-rw-r--r--vdc.cpp4
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;
diff --git a/vdc.cpp b/vdc.cpp
index b63abbb6..ee74146f 100644
--- a/vdc.cpp
+++ b/vdc.cpp
@@ -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) {