Lock while partitioning.
Otherwise we get really excited and trip over ourselves while
partitions are still being created.
Bug: 19993667
Change-Id: I034e56b3063a71d73f9311a945c05ea2ae255f7d
diff --git a/Disk.cpp b/Disk.cpp
index 04c43cf..51eeba8 100644
--- a/Disk.cpp
+++ b/Disk.cpp
@@ -223,6 +223,8 @@
}
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::partitionPublic() {
+ std::lock_guard<std::mutex> lock(mLock);
+
// TODO: improve this code
destroyAllVolumes();
mJustPartitioned = true;
@@ -357,6 +361,8 @@
}
status_t Disk::partitionMixed(int8_t ratio) {
+ std::lock_guard<std::mutex> lock(mLock);
+
int res;
destroyAllVolumes();
diff --git a/Disk.h b/Disk.h
index a8461fb..5ba6bae 100644
--- a/Disk.h
+++ b/Disk.h
@@ -21,6 +21,7 @@
#include <utils/Errors.h>
+#include <mutex>
#include <vector>
namespace android {
@@ -100,6 +101,8 @@
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;
diff --git a/VolumeManager.cpp b/VolumeManager.cpp
index 86e3fd4..dcadd14 100644
--- a/VolumeManager.cpp
+++ b/VolumeManager.cpp
@@ -310,6 +310,7 @@
break;
}
case NetlinkEvent::Action::kChange: {
+ LOG(DEBUG) << "Disk at " << major << ":" << minor << " changed";
for (auto disk : mDisks) {
if (disk->getDevice() == device) {
disk->readMetadata();