From 3dafc26e4f3adb9607e82ab0bd52ead5f76859a1 Mon Sep 17 00:00:00 2001 From: Magnus Malmborn Date: Wed, 19 Jan 2011 12:26:52 +0100 Subject: Delay disk inserted broadcast until disk is ready Delay sending of "VolumeDiskInserted" broadcast until the disk is ready (ie until all the partitions have been received from kernel). This solves a race with MountService, otherwise there is a risk that MountService tries to mount the SD-card before the partition(s) have been received and the card will fail to mount. Change-Id: Ie2a28227ae9a7d6fe9106fb6875f469a0e899014 --- DirectVolume.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/DirectVolume.cpp b/DirectVolume.cpp index 4acee76..9a064e7 100644 --- a/DirectVolume.cpp +++ b/DirectVolume.cpp @@ -113,6 +113,16 @@ int DirectVolume::handleBlockEvent(NetlinkEvent *evt) { } else { handlePartitionAdded(dp, evt); } + /* Send notification iff disk is ready (ie all partitions found) */ + if (getState() == Volume::State_Idle) { + char msg[255]; + + snprintf(msg, sizeof(msg), + "Volume %s %s disk inserted (%d:%d)", getLabel(), + getMountpoint(), mDiskMajor, mDiskMinor); + mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeDiskInserted, + msg, false); + } } else if (action == NetlinkEvent::NlActionRemove) { if (!strcmp(devtype, "disk")) { handleDiskRemoved(dp, evt); @@ -148,8 +158,6 @@ void DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) { mDiskNumParts = 1; } - char msg[255]; - int partmask = 0; int i; for (i = 1; i <= mDiskNumParts; i++) { @@ -169,11 +177,6 @@ void DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) { #endif setState(Volume::State_Pending); } - - snprintf(msg, sizeof(msg), "Volume %s %s disk inserted (%d:%d)", - getLabel(), getMountpoint(), mDiskMajor, mDiskMinor); - mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeDiskInserted, - msg, false); } void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) { -- cgit v1.1