作者:gzshun. 原创作品,转载请标明出处!
上篇文章分析到了handleBlockEvent函数,该函数包含了以下6个处理函数:
void handleDiskAdded(const char *devpath, NetlinkEvent *evt);
void handleDiskRemoved(const char *devpath, NetlinkEvent *evt);
void handleDiskChanged(const char *devpath, NetlinkEvent *evt);
void handlePartitionAdded(const char *devpath, NetlinkEvent *evt);
void handlePartitionRemoved(const char *devpath, NetlinkEvent *evt);
void handlePartitionChanged(const char *devpath, NetlinkEvent *evt);
以下是精简版的handleBlockEvent函数:
if (action == NetlinkEvent::NlActionAdd) {
...
if (!strcmp(devtype, "disk")) {
handleDiskAdded(dp, evt);
} else {
handlePartitionAdded(dp, evt);
}
}
else if (action == NetlinkEvent::NlActionRemove) {
if (!strcmp(devtype, "disk")) {
handleDiskRemoved(dp, evt);
} else {
handlePartitionRemoved(dp, evt);
}
}
else if (action == NetlinkEvent::NlActionChange) {
if (!strcmp(devtype, "disk")) {
handleDiskChanged(dp, evt);
}
else {
handlePartitionChanged(dp, evt);
}
}
这样看起来就比较清楚每个函数的作用了,贴源码其实是比较直接的方法,程序员对代码都比较敏感,一看就明白意思,好,开始分析。
void DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) {
mDiskMajor = atoi(evt->findParam("MAJOR"));
mDiskMinor = atoi(evt->findParam("MINOR"));
const char *tmp = evt->findParam("NPARTS");
if (tmp) {
mDiskNumParts = atoi(tmp);
} else {
SLOGW("Kernel block uevent missing 'NPARTS'");
mDiskNumParts = 0;
}
/**********************************************************************************
**mPendingPartsCount是一个全局变量,用来保存该存储设备的分区数量;这里需要说明一个
**存储设备识别的顺序:
**当插入一块5个分区的硬盘,首先会调用handleDiskAdded函数获取该存储设备的事件信息,
**随后会调用若干次handlePa