DirectVolume.cpp revision fd7f5875129adfe2845f4f3fffb17db3a89eea25
1f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat/* 2f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Copyright (C) 2008 The Android Open Source Project 3f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 4f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Licensed under the Apache License, Version 2.0 (the "License"); 5f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * you may not use this file except in compliance with the License. 6f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * You may obtain a copy of the License at 7f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 8f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * http://www.apache.org/licenses/LICENSE-2.0 9f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * 10f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * Unless required by applicable law or agreed to in writing, software 11f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * distributed under the License is distributed on an "AS IS" BASIS, 12f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * See the License for the specific language governing permissions and 14f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat * limitations under the License. 15f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat */ 16f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 17f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <stdio.h> 18fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat#include <stdlib.h> 19f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <string.h> 20fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat#include <errno.h> 21f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 22f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#define LOG_TAG "Vold" 23f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 24f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 25fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat#include <sysutils/NetlinkEvent.h> 26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 27f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include "DeviceVolume.h" 28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 29f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatDeviceVolume::DeviceVolume(const char *label, const char *mount_point, int partIdx) : 30f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat Volume(label, mount_point) { 31f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mPartIdx = partIdx; 32f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 33f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mPaths = new PathCollection(); 34f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 35f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 36f1b736bc5605e92e917ab27f5abf3ba839be2270San MehatDeviceVolume::~DeviceVolume() { 37f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat PathCollection::iterator it; 38f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 39f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (it = mPaths->begin(); it != mPaths->end(); ++it) 40f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat free(*it); 41f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat delete mPaths; 42f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 43f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 44f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehatint DeviceVolume::addPath(const char *path) { 45f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mPaths->push_back(strdup(path)); 46f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 47f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 48f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 49fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehatint DeviceVolume::handleBlockEvent(NetlinkEvent *evt) { 50fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat const char *dp = evt->findParam("DEVPATH"); 51f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 52fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat PathCollection::iterator it; 53f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (it = mPaths->begin(); it != mPaths->end(); ++it) { 54f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat if (!strncmp(dp, *it, strlen(*it))) { 55fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat /* We can handle this disk */ 56fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int action = evt->getAction(); 57fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat const char *devtype = evt->findParam("DEVTYPE"); 58fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 59fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat if (!strcmp(devtype, "disk")) { 60fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat if (action == NetlinkEvent::NlActionAdd) 61fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat handleDiskAdded(dp, evt); 62fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat else if (action == NetlinkEvent::NlActionRemove) 63fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat handleDiskRemoved(dp, evt); 64fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat else 65fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat LOGD("Ignoring non add/remove event"); 66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } else { 67fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat if (action == NetlinkEvent::NlActionAdd) 68fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat handlePartitionAdded(dp, evt); 69fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat else if (action == NetlinkEvent::NlActionRemove) 70fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat handlePartitionRemoved(dp, evt); 71fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat else 72fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat LOGD("Ignoring non add/remove event"); 73f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 74fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 75f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 76f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 77f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 78f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat errno = ENODEV; 79f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return -1; 80f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 81fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 82fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehatvoid DeviceVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) { 83fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat mDiskMaj = atoi(evt->findParam("MAJOR")); 84fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat mDiskNumParts = atoi(evt->findParam("NPARTS")); 85fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 86fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int partmask = 0; 87fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int i; 88fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat for (i = 0; i < mDiskNumParts; i++) { 89fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat partmask |= (1 << i); 90fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat } 91fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat mPendingPartMap = partmask; 92fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 93fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat if (mDiskNumParts == 0) { 94fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat LOGD("Dv::diskIns - No partitions - good to go son!"); 95fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat setState(Volume::State_Idle); 96fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat } else { 97fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat LOGD("Dv::diskIns - waiting for %d partitions (mask 0x%x)", 98fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat mDiskNumParts, mPendingPartMap); 99fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat setState(Volume::State_Pending); 100fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat } 101fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 102fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 103fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehatvoid DeviceVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) { 104fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int major = atoi(evt->findParam("MAJOR")); 105fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int minor = atoi(evt->findParam("MINOR")); 106fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int part_num = atoi(evt->findParam("PARTN")); 107fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 108fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 109fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehatvoid DeviceVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) { 110fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 111fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 112fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehatvoid DeviceVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt) { 113fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 114