diff --git a/DeviceVolume.cpp b/DeviceVolume.cpp index 187e97f..d744180 100644 --- a/DeviceVolume.cpp +++ b/DeviceVolume.cpp @@ -15,12 +15,14 @@ */ #include -#include +#include #include +#include #define LOG_TAG "Vold" #include +#include #include "DeviceVolume.h" @@ -44,30 +46,68 @@ int DeviceVolume::addPath(const char *path) { return 0; } -int DeviceVolume::handleDiskInsertion(const char *dp, int maj, int min, - int nr_parts) { - PathCollection::iterator it; +int DeviceVolume::handleBlockEvent(NetlinkEvent *evt) { + const char *dp = evt->findParam("DEVPATH"); - LOGD("Dv::diskInsertion - %s %d %d %d", dp, maj, min, nr_parts); + PathCollection::iterator it; for (it = mPaths->begin(); it != mPaths->end(); ++it) { - LOGD("Dv::chk %s", *it); if (!strncmp(dp, *it, strlen(*it))) { - /* - * We can handle this disk. If there are no partitions then we're - * good to go son! - */ - mDiskMaj = maj; - mDiskNumParts = nr_parts; - if (nr_parts == 0) { - LOGD("Dv::diskIns - No partitions - good to go"); - setState(Volume::State_Idle); + /* We can handle this disk */ + int action = evt->getAction(); + const char *devtype = evt->findParam("DEVTYPE"); + + if (!strcmp(devtype, "disk")) { + if (action == NetlinkEvent::NlActionAdd) + handleDiskAdded(dp, evt); + else if (action == NetlinkEvent::NlActionRemove) + handleDiskRemoved(dp, evt); + else + LOGD("Ignoring non add/remove event"); } else { - LOGD("Dv::diskIns - waiting for %d partitions", nr_parts); - setState(Volume::State_Pending); + if (action == NetlinkEvent::NlActionAdd) + handlePartitionAdded(dp, evt); + else if (action == NetlinkEvent::NlActionRemove) + handlePartitionRemoved(dp, evt); + else + LOGD("Ignoring non add/remove event"); } + return 0; } } errno = ENODEV; return -1; } + +void DeviceVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) { + mDiskMaj = atoi(evt->findParam("MAJOR")); + mDiskNumParts = atoi(evt->findParam("NPARTS")); + + int partmask = 0; + int i; + for (i = 0; i < mDiskNumParts; i++) { + partmask |= (1 << i); + } + mPendingPartMap = partmask; + + if (mDiskNumParts == 0) { + LOGD("Dv::diskIns - No partitions - good to go son!"); + setState(Volume::State_Idle); + } else { + LOGD("Dv::diskIns - waiting for %d partitions (mask 0x%x)", + mDiskNumParts, mPendingPartMap); + setState(Volume::State_Pending); + } +} + +void DeviceVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) { + int major = atoi(evt->findParam("MAJOR")); + int minor = atoi(evt->findParam("MINOR")); + int part_num = atoi(evt->findParam("PARTN")); +} + +void DeviceVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) { +} + +void DeviceVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt) { +} diff --git a/DeviceVolume.h b/DeviceVolume.h index edf4c98..e535344 100644 --- a/DeviceVolume.h +++ b/DeviceVolume.h @@ -29,6 +29,7 @@ protected: int mPartIdx; int mDiskMaj; int mDiskNumParts; + unsigned char mPendingPartMap; public: DeviceVolume(const char *label, const char *mount_point, int partIdx); @@ -36,7 +37,13 @@ public: int addPath(const char *path); - int handleDiskInsertion(const char *dp, int maj, int min, int nr_parts); + int handleBlockEvent(NetlinkEvent *evt); + +private: + void handleDiskAdded(const char *devpath, NetlinkEvent *evt); + void handleDiskRemoved(const char *devpath, NetlinkEvent *evt); + void handlePartitionAdded(const char *devpath, NetlinkEvent *evt); + void handlePartitionRemoved(const char *devpath, NetlinkEvent *evt); }; typedef android::List DeviceVolumeCollection; diff --git a/NetlinkHandler.cpp b/NetlinkHandler.cpp index 156079f..19ec932 100644 --- a/NetlinkHandler.cpp +++ b/NetlinkHandler.cpp @@ -44,7 +44,6 @@ int NetlinkHandler::stop() { void NetlinkHandler::onEvent(NetlinkEvent *evt) { VolumeManager *vm = VolumeManager::Instance(); const char *subsys = evt->getSubsystem(); - int action = evt->getAction(); if (!subsys) { LOGW("No subsystem found in netlink event"); @@ -52,37 +51,7 @@ void NetlinkHandler::onEvent(NetlinkEvent *evt) { } if (!strcmp(subsys, "block")) { - const char *devpath = evt->findParam("DEVPATH"); - const char *devtype = evt->findParam("DEVTYPE"); - int major = atoi(evt->findParam("MAJOR")); - int minor = atoi(evt->findParam("MINOR")); - - LOGI("Block event %d, type %s, %d:%d, path '%s'", action, devtype, major, minor, devpath); - - if (!strcmp(devtype, "disk")) { - const char *tmp = evt->findParam("NPARTS"); - - if (!tmp) { - LOGE("Disk uevent missing 'NPARTS' parameter"); - return; - } - if (action == NetlinkEvent::NlActionAdd) - vm->handleDiskInserted(devpath, major, minor, atoi(tmp)); - else if (action == NetlinkEvent::NlActionRemove) - vm->handleDiskRemoved(major, minor); - } else { - const char *tmp = evt->findParam("PARTN"); - - if (!tmp) { - LOGE("Partition uevent missing 'PARTN' parameter"); - return; - } - if (action == NetlinkEvent::NlActionAdd) - vm->handlePartCreated(devpath, major, minor, atoi(tmp)); - else if (action == NetlinkEvent::NlActionRemove) - vm->handlePartRemoved(major, minor); - } - LOGD("Block event handled"); + vm->handleBlockEvent(evt); } else if (!strcmp(subsys, "battery")) { } else if (!strcmp(subsys, "power_supply")) { } else { diff --git a/Volume.cpp b/Volume.cpp index aaccb2b..52d02cf 100644 --- a/Volume.cpp +++ b/Volume.cpp @@ -35,7 +35,7 @@ Volume::~Volume() { free(mMountpoint); } -int Volume::handleDiskInsertion(const char *dp, int maj, int min, int nr_parts) { +int Volume::handleBlockEvent(NetlinkEvent *evt) { errno = ENOSYS; return -1; } diff --git a/Volume.h b/Volume.h index bf2a799..f428e91 100644 --- a/Volume.h +++ b/Volume.h @@ -19,6 +19,8 @@ #include +class NetlinkEvent; + class Volume { private: int mState; @@ -43,7 +45,7 @@ public: const char *getMountpoint() { return mMountpoint; } int getState() { return mState; } - virtual int handleDiskInsertion(const char *dp, int maj, int min, int nr_parts); + virtual int handleBlockEvent(NetlinkEvent *evt); protected: void setState(int state); diff --git a/VolumeManager.cpp b/VolumeManager.cpp index ffe4e22..a383651 100644 --- a/VolumeManager.cpp +++ b/VolumeManager.cpp @@ -15,12 +15,16 @@ */ #include +#include +#include #include #define LOG_TAG "Vold" #include +#include + #include "VolumeManager.h" #include "DeviceVolume.h" #include "ErrorCode.h" @@ -56,37 +60,24 @@ int VolumeManager::addVolume(Volume *v) { return 0; } -void VolumeManager::handleDiskInserted(const char *devpath, int maj, int min, - int nr_parts) { +void VolumeManager::handleBlockEvent(NetlinkEvent *evt) { + const char *devpath = evt->findParam("DEVPATH"); - /* Lookup possible candidate DeviceVolumes */ + /* Lookup a volume to handle this device */ VolumeCollection::iterator it; bool hit = false; for (it = mVolumes->begin(); it != mVolumes->end(); ++it) { - if (!(*it)->handleDiskInsertion(devpath, maj, min, nr_parts)) { + if (!(*it)->handleBlockEvent(evt)) { hit = true; - LOGD("Volume '%s' has handled disk insertion for '%s'", - (*it)->getLabel(), devpath); break; } } if (!hit) { - LOGW("No volumes handled insertion of disk '%s'", devpath); + LOGW("No volumes handled block event for '%s'", devpath); } } -void VolumeManager::handleDiskRemoved(int maj, int min) { -} - -void VolumeManager::handlePartCreated(const char *devpath, int maj, int min, - int part_no) { -} - -void VolumeManager::handlePartRemoved(int maj, int min) { -} - - int VolumeManager::listVolumes(SocketClient *cli) { VolumeCollection::iterator i; diff --git a/VolumeManager.h b/VolumeManager.h index 8263805..c6beb2a 100644 --- a/VolumeManager.h +++ b/VolumeManager.h @@ -41,13 +41,7 @@ public: int start(); int stop(); - void handleDiskInserted(const char *devpath, int maj, int min, - int nr_parts); - void handleDiskRemoved(int maj, int min); - - void handlePartCreated(const char *devpath, int maj, int min, - int part_no); - void handlePartRemoved(int maj, int min); + void handleBlockEvent(NetlinkEvent *evt); int addVolume(Volume *v);