summaryrefslogtreecommitdiffstats
path: root/DirectVolume.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'DirectVolume.cpp')
-rw-r--r--DirectVolume.cpp17
1 files changed, 16 insertions, 1 deletions
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");
+ }
}
}