From b67469b3524ce4f555ab9b286712b21ff65d7610 Mon Sep 17 00:00:00 2001 From: Zhou Shihui Date: Mon, 8 Sep 2025 16:36:53 +0800 Subject: [PATCH] =?UTF-8?q?project=20quota=E5=88=A4=E6=96=AD=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Zhou Shihui --- .../include/installd/installd_operator.h | 2 ++ .../src/installd/installd_host_impl.cpp | 4 ++++ .../src/installd/installd_operator.cpp | 23 +++++++++++++++++++ .../bms_install_daemon_operator_test.cpp | 18 +++++++++++++++ .../bms_install_daemon_test.cpp | 2 +- 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/services/bundlemgr/include/installd/installd_operator.h b/services/bundlemgr/include/installd/installd_operator.h index 73de3badb3..7aaaffdf1f 100644 --- a/services/bundlemgr/include/installd/installd_operator.h +++ b/services/bundlemgr/include/installd/installd_operator.h @@ -231,6 +231,8 @@ public: static bool SetProjectIdForDir(const std::string &path, uint32_t projectId); + static bool HasProjectIdForDir(const std::string &path); + static int64_t GetProjectUsage(uint32_t projectId); static bool ScanDir( diff --git a/services/bundlemgr/src/installd/installd_host_impl.cpp b/services/bundlemgr/src/installd/installd_host_impl.cpp index 5039de8094..b1e31cafdf 100644 --- a/services/bundlemgr/src/installd/installd_host_impl.cpp +++ b/services/bundlemgr/src/installd/installd_host_impl.cpp @@ -1324,6 +1324,10 @@ int64_t InstalldHostImpl::GetEl2CacheSize(const int32_t projectId, const std::st LOG_I(BMS_TAG_INSTALLD, "%{public}s el2 cache dir empty", bundleNameDir.c_str()); return 0; } + if (!InstalldOperator::HasProjectIdForDir(cachePath)) { + LOG_I(BMS_TAG_INSTALLD, "%{public}s has no project id", bundleNameDir.c_str()); + return InstalldOperator::GetDiskUsage(cachePath); + } // quota result contains the size of base dir int64_t projectQuotaSize = InstalldOperator::GetProjectUsage(projectId) - EMPTY_FILE_SIZE; if (projectQuotaSize >= 0) { diff --git a/services/bundlemgr/src/installd/installd_operator.cpp b/services/bundlemgr/src/installd/installd_operator.cpp index 0e02903cda..851812cb2c 100644 --- a/services/bundlemgr/src/installd/installd_operator.cpp +++ b/services/bundlemgr/src/installd/installd_operator.cpp @@ -1264,6 +1264,29 @@ bool InstalldOperator::SetProjectIdForDir(const std::string &path, uint32_t proj return true; } +bool InstalldOperator::HasProjectIdForDir(const std::string &path) +{ + std::string realPath; + if (!PathToRealPath(path, realPath)) { + LOG_E(BMS_TAG_INSTALLD, "path(%{public}s) is not real path", path.c_str()); + return false; + } + int32_t fd = open(realPath.c_str(), O_RDONLY | O_DIRECTORY); + if (fd < 0) { + LOG_E(BMS_TAG_INSTALLD, "Failed to open directory: %{public}s, errno: %{public}d", realPath.c_str(), errno); + return false; + } + + struct fsxattr fsx; + if (ioctl(fd, FS_IOC_FSGETXATTR, &fsx) < 0) { + LOG_W(BMS_TAG_INSTALLD, "Failed to get fsxattr for %{public}s, errno: %{public}d", path.c_str(), errno); + close(fd); + return false; + } + close(fd); + return (fsx.fsx_xflags & FS_XFLAG_PROJINHERIT) != 0; +} + int64_t InstalldOperator::GetProjectUsage(uint32_t projectId) { std::lock_guard lock(mMountsLock); diff --git a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp index 6d6c66bda0..7fb1fa635b 100755 --- a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp +++ b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_operator_test.cpp @@ -2367,4 +2367,22 @@ HWTEST_F(BmsInstallDaemonOperatorTest, InstalldOperatorTest_14000, Function | Sm "/data/app/el1/100/base/InstalldOperatorTest_14000/test1.txt", 14000)); EXPECT_TRUE(InstalldOperator::DeleteDir("/data/app/el1/100/base/InstalldOperatorTest_14000")); } + +/** + * @tc.number: InstalldOperatorTest_14100 + * @tc.name: test function of InstalldOperator + * @tc.desc: 1. calling HasProjectIdForDir and GetProjectUsage of InstalldOperator + */ +HWTEST_F(BmsInstallDaemonOperatorTest, InstalldOperatorTest_14100, Function | SmallTest | Level0) +{ + EXPECT_FALSE(InstalldOperator::HasProjectIdForDir("/invalid/path")); + + EXPECT_TRUE(InstalldOperator::MkRecursiveDir("/data/app/el1/100/base/InstalldOperatorTest_14100", true)); + EXPECT_FALSE(InstalldOperator::HasProjectIdForDir("/data/app/el1/100/base/InstalldOperatorTest_14100")); + + EXPECT_TRUE(InstalldOperator::SetProjectIdForDir("/data/app/el1/100/base/InstalldOperatorTest_14100", 14000)); + EXPECT_TRUE(InstalldOperator::HasProjectIdForDir("/data/app/el1/100/base/InstalldOperatorTest_14100")); + + EXPECT_TRUE(InstalldOperator::DeleteDir("/data/app/el1/100/base/InstalldOperatorTest_14100")); +} } // OHOS \ No newline at end of file diff --git a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp index 20edabf71d..29f1008ea0 100644 --- a/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp +++ b/services/bundlemgr/test/unittest/bms_install_daemon_test/bms_install_daemon_test.cpp @@ -984,7 +984,7 @@ HWTEST_F(BmsInstallDaemonTest, GetBundleStats_0400, Function | SmallTest | Level EXPECT_NE(stats[1], 0); EXPECT_EQ(stats[2], 0); // distributed file does not exist EXPECT_EQ(stats[3], 0); - EXPECT_NE(stats[4], 0); + EXPECT_EQ(stats[4], 0); OHOS::ForceRemoveDirectory(BUNDLE_DATA_DIR_CACHE); OHOS::ForceRemoveDirectory(BUNDLE_DATA_DIR_TEMP); OHOS::ForceRemoveDirectory(BUNDLE_CODE_DIR_CODE); -- Gitee