Merge "Add aconfig flag to control release of unmounting changes" into main
diff --git a/Checkpoint.cpp b/Checkpoint.cpp
index 76e46fb..195a137 100644
--- a/Checkpoint.cpp
+++ b/Checkpoint.cpp
@@ -136,13 +136,16 @@
return error(ENOTSUP, "Checkpoints not supported");
if (retry < -1) return error(EINVAL, "Retry count must be more than -1");
- std::string content = std::to_string(retry + 1);
+ std::string content;
if (retry == -1) {
+ content = std::to_string(-1);
auto module = BootControlClient::WaitForService();
if (module) {
std::string suffix = module->GetSuffix(module->GetCurrentSlot());
if (!suffix.empty()) content += " " + suffix;
}
+ } else {
+ content = std::to_string(retry + 1);
}
if (!android::base::WriteStringToFile(content, kMetadataCPFile))
return error("Failed to write checkpoint file");
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index dcf92be..c8dbf77 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -3,6 +3,3 @@
[Builtin Hooks Options]
clang_format = --commit ${PREUPLOAD_COMMIT} --style file --extensions c,h,cc,cpp
-
-[Hook Scripts]
-aosp_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "."
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 93938b6..50bd3da 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -17,9 +17,6 @@
},
{
"name": "CtsScopedStorageRedactUriTest"
- },
- {
- "name": "AdoptableHostTest"
}
],
"hwasan-postsubmit": [
@@ -40,9 +37,6 @@
},
{
"name": "CtsScopedStorageRedactUriTest"
- },
- {
- "name": "AdoptableHostTest"
}
]
}
diff --git a/VolumeManager.cpp b/VolumeManager.cpp
index 657f051..49a8b2b 100644
--- a/VolumeManager.cpp
+++ b/VolumeManager.cpp
@@ -452,36 +452,41 @@
if (mStartedUsers.find(userId) == mStartedUsers.end()) {
createEmulatedVolumesForUser(userId);
- std::list<std::string> public_vols;
- listVolumes(VolumeBase::Type::kPublic, public_vols);
- for (const std::string& id : public_vols) {
- PublicVolume* pvol = static_cast<PublicVolume*>(findVolume(id).get());
- if (pvol->getState() != VolumeBase::State::kMounted) {
- continue;
- }
- if (pvol->isVisible() == 0) {
- continue;
- }
- userid_t mountUserId = pvol->getMountUserId();
- if (userId == mountUserId) {
- // No need to bind mount for the user that owns the mount
- continue;
- }
- if (mountUserId != VolumeManager::Instance()->getSharedStorageUser(userId)) {
- // No need to bind if the user does not share storage with the mount owner
- continue;
- }
- // Create mount directory for the user as there is a chance that no other Volume is
- // mounted for the user (ex: if the user is just started), so /mnt/user/user_id does
- // not exist yet.
- auto mountDirStatus = android::vold::PrepareMountDirForUser(userId);
- if (mountDirStatus != OK) {
- LOG(ERROR) << "Failed to create Mount Directory for user " << userId;
- }
- auto bindMountStatus = pvol->bindMountForUser(userId);
- if (bindMountStatus != OK) {
- LOG(ERROR) << "Bind Mounting Public Volume: " << pvol << " for user: " << userId
- << "Failed. Error: " << bindMountStatus;
+
+ userid_t sharedStorageUserId = VolumeManager::Instance()->getSharedStorageUser(userId);
+ if (sharedStorageUserId != USER_UNKNOWN) {
+ std::list<std::string> public_vols;
+ listVolumes(VolumeBase::Type::kPublic, public_vols);
+ for (const std::string& id : public_vols) {
+ PublicVolume *pvol = static_cast<PublicVolume *>(findVolume(id).get());
+ if (pvol->getState() != VolumeBase::State::kMounted) {
+ continue;
+ }
+ if (pvol->isVisible() == 0) {
+ continue;
+ }
+ userid_t mountUserId = pvol->getMountUserId();
+ if (userId == mountUserId) {
+ // No need to bind mount for the user that owns the mount
+ continue;
+ }
+
+ if (mountUserId != sharedStorageUserId) {
+ // No need to bind if the user does not share storage with the mount owner
+ continue;
+ }
+ // Create mount directory for the user as there is a chance that no other Volume is
+ // mounted for the user (ex: if the user is just started),
+ // so /mnt/user/user_id does not exist yet.
+ auto mountDirStatus = android::vold::PrepareMountDirForUser(userId);
+ if (mountDirStatus != OK) {
+ LOG(ERROR) << "Failed to create Mount Directory for user " << userId;
+ }
+ auto bindMountStatus = pvol->bindMountForUser(userId);
+ if (bindMountStatus != OK) {
+ LOG(ERROR) << "Bind Mounting Public Volume: " << pvol << " for user: " << userId
+ << "Failed. Error: " << bindMountStatus;
+ }
}
}
}
@@ -497,6 +502,36 @@
if (mStartedUsers.find(userId) != mStartedUsers.end()) {
destroyEmulatedVolumesForUser(userId);
+
+ userid_t sharedStorageUserId = VolumeManager::Instance()->getSharedStorageUser(userId);
+ if (sharedStorageUserId != USER_UNKNOWN) {
+ std::list<std::string> public_vols;
+ listVolumes(VolumeBase::Type::kPublic, public_vols);
+ for (const std::string &id: public_vols) {
+ PublicVolume *pvol = static_cast<PublicVolume *>(findVolume(id).get());
+ if (pvol->getState() != VolumeBase::State::kMounted) {
+ continue;
+ }
+ if (pvol->isVisible() == 0) {
+ continue;
+ }
+ userid_t mountUserId = pvol->getMountUserId();
+ if (userId == mountUserId) {
+ // No need to remove bind mount for the user that owns the mount
+ continue;
+ }
+ if (mountUserId != sharedStorageUserId) {
+ // No need to remove bind mount
+ // if the user does not share storage with the mount owner
+ continue;
+ }
+ LOG(INFO) << "Removing Public Volume Bind Mount for: " << userId;
+ auto mountPath = GetFuseMountPathForUser(userId, pvol->getStableName());
+ android::vold::ForceUnmount(mountPath);
+ rmdir(mountPath.c_str());
+ }
+ }
+
}
mStartedUsers.erase(userId);
diff --git a/model/PublicVolume.cpp b/model/PublicVolume.cpp
index 91b1ca2..747598a 100644
--- a/model/PublicVolume.cpp
+++ b/model/PublicVolume.cpp
@@ -88,6 +88,15 @@
return OK;
}
+std::string PublicVolume::getStableName() {
+ // Use UUID as stable name, if available
+ std::string stableName = getId();
+ if (!mFsUuid.empty()) {
+ stableName = mFsUuid;
+ }
+ return stableName;
+}
+
status_t PublicVolume::doCreate() {
return CreateDeviceNode(mDevPath, mDevice);
}
@@ -115,11 +124,7 @@
return -EIO;
}
- // Use UUID as stable name, if available
- std::string stableName = getId();
- if (!mFsUuid.empty()) {
- stableName = mFsUuid;
- }
+ std::string stableName = getStableName();
mRawPath = StringPrintf("/mnt/media_rw/%s", stableName.c_str());
@@ -286,10 +291,7 @@
status_t PublicVolume::bindMountForUser(userid_t user_id) {
userid_t mountUserId = getMountUserId();
- std::string stableName = getId();
- if (!mFsUuid.empty()) {
- stableName = mFsUuid;
- }
+ std::string stableName = getStableName();
LOG(INFO) << "Bind Mounting Public Volume for user: " << user_id
<< ".Mount owner: " << mountUserId;
@@ -310,11 +312,7 @@
KillProcessesUsingPath(getPath());
if (mFuseMounted) {
- // Use UUID as stable name, if available
- std::string stableName = getId();
- if (!mFsUuid.empty()) {
- stableName = mFsUuid;
- }
+ std::string stableName = getStableName();
// Unmount bind mounts for running users
auto vol_manager = VolumeManager::Instance();
diff --git a/model/PublicVolume.h b/model/PublicVolume.h
index ca553b0..5eff35e 100644
--- a/model/PublicVolume.h
+++ b/model/PublicVolume.h
@@ -43,6 +43,7 @@
virtual ~PublicVolume();
status_t bindMountForUser(userid_t user_id);
+ std::string getStableName();
protected:
status_t doCreate() override;