格式化手机内置sdcard失败
小弟在做一个firefox os手机项目, 这个系统底层和android都是一样的,只是框架层不用。 在firefox settings应用有个功能是格式手机内置的sdcard, 很不幸的是格式化失败,格式化后文件并没有被删除掉。
从错误日志上看, 在格式化的时候,android下面的vold并没有能正确的获取到这个设备所对应的设备节点。在设备上这个内置sdcard所对应的节点是 /dev/block/vold/179:30, 而日志里是 /dev/block/vold/179:62。
01-01 00:27:31.579: I/newfs_msdos(234): /system/bin/newfs_msdos: /dev/block/vold/179:62: No such file or directory
01-01 00:27:31.579: E/Vold(234): Format failed (unknown exit code 1)
在系统里,在格式化之后,都会对这个设备进行再一次mount, 从日志里看到,在mount时却成功了,找到了正确的设备节点
01-01 00:27:31.579: I/AutoMounter(253): UpdateState: Mounting sdcard
01-01 00:27:31.579: I/Vold(234): /dev/block/vold/179:30 being considered for volume sdcard
01-01 00:27:31.579: D/Vold(234): Volume sdcard state changing 1 (Idle-Unmounted) -> 3 (Checking)
在格式化的时候回去查找这个设备节点根据主设备号和次设备号
dev_t diskNode = getDiskDevice();
dev_t partNode =
MKDEV(MAJOR(diskNode),
MINOR(diskNode) + (formatEntireDevice ? 1 : mPartIdx));
而在mount的时候是通过以下去获取设备号
int DirectVolume::getDeviceNodes(dev_t *devs, int max) {
if (mPartIdx == -1) {
// If the disk has no partitions, try the disk itself
if (!mDiskNumParts) {
devs[0] = MKDEV(mDiskMajor, mDiskMinor);
return 1;
}
int i;
for (i = 0; i < mDiskNumParts; i++) {
if (i == max)
break;
devs[i] = MKDEV(mDiskMajor, mPartMinors[i]);
}
return mDiskNumParts;
}
devs[0] = MKDEV(mDiskMajor, mPartMinors[mPartIdx -1]);
return 1;
}
我有以下几个地方不明白:
1. mPartIdx是指的什么东西? 分区索引?
2. 为什么当格式化整个设备的时候, 需要在次设备号上加1,如果不是格式化整个设备就加上mPartIdx。
3. mPartMinors 和 mPartIdx有什么关系。
希望哪位指点以下,不甚感激。