From 75a3e1a95af0a2790de1b12aeca0008bfdc61649 Mon Sep 17 00:00:00 2001 From: Ethan Date: Wed, 21 Jul 2010 23:07:51 +0800 Subject: [PATCH] VOLD - make volume daemon to handle state change from shared to no_media When volume state changed from shared to no_media, volume is not properly unshared. Change-Id: I0117d67da95440d982275746a166ef6f4ac1c0e2 Signed-off-by: Ethan --- DirectVolume.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/DirectVolume.cpp b/DirectVolume.cpp index 23a21a0..02c83d1 100644 --- a/DirectVolume.cpp +++ b/DirectVolume.cpp @@ -266,6 +266,7 @@ void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt int major = atoi(evt->findParam("MAJOR")); int minor = atoi(evt->findParam("MINOR")); char msg[255]; + int state; SLOGD("Volume %s %s partition %d:%d removed\n", getLabel(), getMountpoint(), major, minor); @@ -275,7 +276,8 @@ void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt * the removal notification will be sent on the Disk * itself */ - if (getState() != Volume::State_Mounted) { + state = getState(); + if (state != Volume::State_Mounted && state != Volume::State_Shared) { return; } @@ -300,6 +302,19 @@ void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt } else { SLOGD("Crisis averted"); } + } else if (state == Volume::State_Shared) { + /* removed during mass storage */ + snprintf(msg, sizeof(msg), "Volume %s bad removal (%d:%d)", + getLabel(), major, minor); + mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval, + msg, false); + + if (mVm->unshareVolume(getLabel(), "ums")) { + SLOGE("Failed to unshare volume on bad removal (%s)", + strerror(errno)); + } else { + SLOGD("Crisis averted"); + } } }