Lock while partitioning.

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

Bug: 19993667
Change-Id: I034e56b3063a71d73f9311a945c05ea2ae255f7d
gugelfrei
Jeff Sharkey 9 years ago
parent ffeb007978
commit 7d9d011865

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

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

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

Loading…
Cancel
Save