From 5ec8658abcb5be66a380190d7e4aa39510f3b1af Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Mon, 4 May 2020 14:57:35 +0200 Subject: [PATCH] Introduce postMount() VolumeBase helper. When we're mounting a private volume, we create stacked emulated volumes on top of it. Due to the ordering there, we would broadcast the emulated volumes being created *before* the "mounted" status update. This in turn could cause us to try and mount these emulated volumes before the underlying private volume is really mounted. This is problematic in particular on devices that support a filesystem keyring, where we need to do some additional setup before the devices can be used. While we could modify StorageManagerService to delay the mount, a safer fix at this stage of the release is to just fix the ordering of these events. To achieve that, add a simple postMount() helper, that is called after a succesful mount. This allows us to setup the volume properly before trying to mount any stacked volumes. Bug: 151079464 Test: atest AdoptableHostTest Change-Id: I2cc4113d4d71d89aa629bb9c0fa9be441355c079 --- model/PrivateVolume.cpp | 6 ++++-- model/PrivateVolume.h | 1 + model/VolumeBase.cpp | 5 +++++ model/VolumeBase.h | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/model/PrivateVolume.cpp b/model/PrivateVolume.cpp index 75757f7..e146633 100644 --- a/model/PrivateVolume.cpp +++ b/model/PrivateVolume.cpp @@ -177,6 +177,10 @@ status_t PrivateVolume::doMount() { return -EIO; } + return OK; +} + +void PrivateVolume::doPostMount() { auto vol_manager = VolumeManager::Instance(); std::string mediaPath(mPath + "/media"); @@ -189,8 +193,6 @@ status_t PrivateVolume::doMount() { addVolume(vol); vol->create(); } - - return OK; } status_t PrivateVolume::doUnmount() { diff --git a/model/PrivateVolume.h b/model/PrivateVolume.h index 9780485..607c4d1 100644 --- a/model/PrivateVolume.h +++ b/model/PrivateVolume.h @@ -49,6 +49,7 @@ class PrivateVolume : public VolumeBase { status_t doCreate() override; status_t doDestroy() override; status_t doMount() override; + void doPostMount() override; status_t doUnmount() override; status_t doFormat(const std::string& fsType) override; diff --git a/model/VolumeBase.cpp b/model/VolumeBase.cpp index 687d4f7..27448da 100644 --- a/model/VolumeBase.cpp +++ b/model/VolumeBase.cpp @@ -232,9 +232,14 @@ status_t VolumeBase::mount() { status_t res = doMount(); setState(res == OK ? State::kMounted : State::kUnmountable); + if (res == OK) { + doPostMount(); + } return res; } +void VolumeBase::doPostMount() {} + status_t VolumeBase::unmount() { if (mState != State::kMounted) { LOG(WARNING) << getId() << " unmount requires state mounted"; diff --git a/model/VolumeBase.h b/model/VolumeBase.h index 078bb0c..689750d 100644 --- a/model/VolumeBase.h +++ b/model/VolumeBase.h @@ -120,6 +120,7 @@ class VolumeBase { virtual status_t doCreate(); virtual status_t doDestroy(); virtual status_t doMount() = 0; + virtual void doPostMount(); virtual status_t doUnmount() = 0; virtual status_t doFormat(const std::string& fsType);