OSDN Git Service

Checking LOADER_USAGE_STATS before enabling read logs.
authorAlex Buynytskyy <alexbuy@google.com>
Tue, 31 Mar 2020 21:46:25 +0000 (14:46 -0700)
committerAlex Buynytskyy <alexbuy@google.com>
Tue, 31 Mar 2020 23:28:30 +0000 (16:28 -0700)
Bug: b/152633648
Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest
Change-Id: I29bf16d06a013566c8dd08e64be2a23ad805e37d

VoldNativeService.cpp
VoldNativeService.h
binder/android/os/IVold.aidl

index 1beb29c..d1d7d86 100644 (file)
@@ -53,6 +53,7 @@ namespace vold {
 namespace {
 
 constexpr const char* kDump = "android.permission.DUMP";
+constexpr const char* kDataUsageStats = "android.permission.LOADER_USAGE_STATS";
 
 static binder::Status error(const std::string& msg) {
     PLOG(ERROR) << msg;
@@ -893,7 +894,8 @@ binder::Status VoldNativeService::mountIncFs(
     auto control = IncFs_Mount(backingPath.c_str(), targetDir.c_str(),
                                {.flags = IncFsMountFlags(flags),
                                 .defaultReadTimeoutMs = INCFS_DEFAULT_READ_TIMEOUT_MS,
-                                .readLogBufferPages = 4});
+                                // Mount with read logs disabled.
+                                .readLogBufferPages = 0});
     if (control == nullptr) {
         return translate(-1);
     }
@@ -915,6 +917,28 @@ binder::Status VoldNativeService::unmountIncFs(const std::string& dir) {
     return translate(IncFs_Unmount(dir.c_str()));
 }
 
+binder::Status VoldNativeService::setIncFsMountOptions(
+        const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
+        bool enableReadLogs) {
+    auto status = CheckPermission(kDataUsageStats);
+    if (!status.isOk()) {
+        return status;
+    }
+
+    auto incfsControl = IncFs_CreateControl(dup(control.cmd.get()), dup(control.pendingReads.get()),
+                                            dup(control.log.get()));
+    if (auto error = IncFs_SetOptions(
+                incfsControl,
+                {.defaultReadTimeoutMs = INCFS_DEFAULT_READ_TIMEOUT_MS,
+                 .readLogBufferPages = enableReadLogs ? INCFS_DEFAULT_PAGE_READ_BUFFER_PAGES : 0});
+        error < 0) {
+        status = binder::Status::fromServiceSpecificError(error);
+    }
+    IncFs_DeleteControl(incfsControl);
+
+    return status;
+}
+
 binder::Status VoldNativeService::bindMount(const std::string& sourceDir,
                                             const std::string& targetDir) {
     ENFORCE_SYSTEM_OR_ROOT;
index 2f4b6eb..060d704 100644 (file)
@@ -154,6 +154,9 @@ class VoldNativeService : public BinderService<VoldNativeService>, public os::Bn
             const std::string& backingPath, const std::string& targetDir, int32_t flags,
             ::android::os::incremental::IncrementalFileSystemControlParcel* _aidl_return) override;
     binder::Status unmountIncFs(const std::string& dir) override;
+    binder::Status setIncFsMountOptions(
+            const ::android::os::incremental::IncrementalFileSystemControlParcel& control,
+            bool enableReadLogs) override;
     binder::Status bindMount(const std::string& sourceDir, const std::string& targetDir) override;
 };
 
index 1d5657f..68e2ba9 100644 (file)
@@ -135,6 +135,7 @@ interface IVold {
     boolean incFsEnabled();
     IncrementalFileSystemControlParcel mountIncFs(@utf8InCpp String backingPath, @utf8InCpp String targetDir, int flags);
     void unmountIncFs(@utf8InCpp String dir);
+    void setIncFsMountOptions(in IncrementalFileSystemControlParcel control, boolean enableReadLogs);
     void bindMount(@utf8InCpp String sourceDir, @utf8InCpp String targetDir);
 
     const int ENCRYPTION_FLAG_NO_UI = 4;