Lock while partitioning.

Otherwise we get really excited and trip over ourselves while
partitions are still being created.

Bug: 19993667
Change-Id: I034e56b3063a71d73f9311a945c05ea2ae255f7d
This commit is contained in:
Jeff Sharkey 2015-04-14 23:14:23 -07:00
parent ffeb007978
commit 7d9d011865
3 changed files with 10 additions and 0 deletions

View file

@ -223,6 +223,8 @@ status_t Disk::readMetadata() {
}
status_t Disk::readPartitions() {
std::lock_guard<std::mutex> lock(mLock);
int8_t maxMinors = getMaxMinors();
if (maxMinors < 0) {
return -ENOTSUP;
@ -311,6 +313,8 @@ status_t Disk::unmountAll() {
}
status_t Disk::partitionPublic() {
std::lock_guard<std::mutex> lock(mLock);
// TODO: improve this code
destroyAllVolumes();
mJustPartitioned = true;
@ -357,6 +361,8 @@ status_t Disk::partitionPrivate() {
}
status_t Disk::partitionMixed(int8_t ratio) {
std::lock_guard<std::mutex> lock(mLock);
int res;
destroyAllVolumes();

3
Disk.h
View file

@ -21,6 +21,7 @@
#include <utils/Errors.h>
#include <mutex>
#include <vector>
namespace android {
@ -100,6 +101,8 @@ private:
int mFlags;
/* Flag indicating object is created */
bool mCreated;
/* Lock held while partitioning */
std::mutex mLock;
/* Flag that we just partitioned and should format all volumes */
bool mJustPartitioned;

View file

@ -310,6 +310,7 @@ void VolumeManager::handleBlockEvent(NetlinkEvent *evt) {
break;
}
case NetlinkEvent::Action::kChange: {
LOG(DEBUG) << "Disk at " << major << ":" << minor << " changed";
for (auto disk : mDisks) {
if (disk->getDevice() == device) {
disk->readMetadata();