vold2: Some more work on partitioning support
Signed-off-by: San Mehat <san@google.com>
This commit is contained in:
parent
49e2bce5b7
commit
dd9b8e92aa
4 changed files with 73 additions and 10 deletions
|
@ -31,6 +31,8 @@ DirectVolume::DirectVolume(const char *label, const char *mount_point, int partI
|
|||
mPartIdx = partIdx;
|
||||
|
||||
mPaths = new PathCollection();
|
||||
for (int i = 0; i < MAX_PARTITIONS; i++)
|
||||
mPartMinors[i] = -1;
|
||||
}
|
||||
|
||||
DirectVolume::~DirectVolume() {
|
||||
|
@ -80,7 +82,8 @@ int DirectVolume::handleBlockEvent(NetlinkEvent *evt) {
|
|||
}
|
||||
|
||||
void DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) {
|
||||
mDiskMaj = atoi(evt->findParam("MAJOR"));
|
||||
mDiskMajor = atoi(evt->findParam("MAJOR"));
|
||||
mDiskMinor = atoi(evt->findParam("MAJOR"));
|
||||
mDiskNumParts = atoi(evt->findParam("NPARTS"));
|
||||
|
||||
int partmask = 0;
|
||||
|
@ -105,6 +108,12 @@ void DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt)
|
|||
int minor = atoi(evt->findParam("MINOR"));
|
||||
int part_num = atoi(evt->findParam("PARTN"));
|
||||
|
||||
if (major != mDiskMajor) {
|
||||
LOGE("Partition '%s' has a different major than its disk!", devpath);
|
||||
return;
|
||||
}
|
||||
mPartMinors[part_num -1] = minor;
|
||||
|
||||
mPendingPartMap &= ~(1 << part_num);
|
||||
if (!mPendingPartMap) {
|
||||
LOGD("Dv:partAdd: Got all partitions - ready to rock!");
|
||||
|
@ -120,7 +129,37 @@ void DirectVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) {
|
|||
void DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt) {
|
||||
}
|
||||
|
||||
/*
|
||||
* Called from Volume to determine the major/minor numbers
|
||||
* to be used for mounting
|
||||
*/
|
||||
int DirectVolume::prepareToMount(int *major, int *minor) {
|
||||
errno = ENOSYS;
|
||||
return -1;
|
||||
*major = mDiskMajor;
|
||||
|
||||
if (mPartIdx == -1) {
|
||||
/* No specific partition specified */
|
||||
|
||||
if (!mDiskNumParts) {
|
||||
*minor = mDiskMinor;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX: Use first partition for now.
|
||||
* The right thing to do would be to choose
|
||||
* this based on the partition type.
|
||||
*
|
||||
*/
|
||||
|
||||
*minor = mPartMinors[0];
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mPartIdx - 1 > mDiskNumParts) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*minor = mPartMinors[mPartIdx-1];
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -21,13 +21,19 @@
|
|||
|
||||
#include "Volume.h"
|
||||
|
||||
#define MAX_PARTS 4
|
||||
|
||||
typedef android::List<char *> PathCollection;
|
||||
|
||||
class DirectVolume : public Volume {
|
||||
public:
|
||||
static const int MAX_PARTITIONS = 4;
|
||||
protected:
|
||||
PathCollection *mPaths;
|
||||
int mPartIdx;
|
||||
int mDiskMaj;
|
||||
int mDiskMajor;
|
||||
int mDiskMinor;
|
||||
int mPartMinors[MAX_PARTITIONS];
|
||||
int mDiskNumParts;
|
||||
unsigned char mPendingPartMap;
|
||||
|
||||
|
|
28
Volume.cpp
28
Volume.cpp
|
@ -56,6 +56,17 @@ void Volume::setState(int state) {
|
|||
mState = state;
|
||||
}
|
||||
|
||||
int Volume::createDeviceNode(const char *path, int major, int minor) {
|
||||
mode_t mode = 0660 | S_IFBLK;
|
||||
dev_t dev = (major << 8) | minor;
|
||||
if (mknod(path, mode, dev) < 0) {
|
||||
if (errno != EEXIST) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Volume::mount() {
|
||||
char nodepath[255];
|
||||
int major = -1, minor = -1;
|
||||
|
@ -65,22 +76,27 @@ int Volume::mount() {
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* Create device nodes */
|
||||
mode_t mode = 0660 | S_IFBLK;
|
||||
dev_t dev = (major << 8) | minor;
|
||||
sprintf(nodepath, "/dev/block/vold/%d:%d", major, minor);
|
||||
if (mknod(nodepath, mode, dev) < 0) {
|
||||
LOGE("Error making device nodes for '%s' (%s)",
|
||||
nodepath, strerror(errno));
|
||||
|
||||
LOGD("nodepath = %s\n", nodepath);
|
||||
|
||||
/* Create device nodes */
|
||||
if (createDeviceNode(nodepath, major, minor)) {
|
||||
LOGE("Error making device nodes for '%s' (%s)", nodepath,
|
||||
strerror(errno));
|
||||
// XXX: cleanup will be needed eventually
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Run disk checker */
|
||||
if (checkFilesystem(nodepath)) {
|
||||
LOGE("Error checking filesystem (%s)", strerror(errno));
|
||||
setState(Volume::State_Idle);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
setState(Volume::State_Idle);
|
||||
return 0;
|
||||
}
|
||||
|
|
2
Volume.h
2
Volume.h
|
@ -55,6 +55,8 @@ protected:
|
|||
|
||||
virtual int prepareToMount(int *major, int *minor) = 0;
|
||||
|
||||
int createDeviceNode(const char *path, int major, int minor);
|
||||
|
||||
private:
|
||||
int checkFilesystem(const char *nodepath);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue