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 22a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include <linux/kdev_t.h> 23a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 24a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#define LOG_TAG "DirectVolume" 25f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 26f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat#include <cutils/log.h> 27fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat#include <sysutils/NetlinkEvent.h> 28f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 29ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehat#include "DirectVolume.h" 30a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include "VolumeManager.h" 31a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#include "ResponseCode.h" 3229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall#include "cryptfs.h" 33a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 34a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat// #define PARTITION_DEBUG 35f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 36ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff SharkeyDirectVolume::DirectVolume(VolumeManager *vm, const fstab_rec* rec, int flags) : 37ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey Volume(vm, rec, flags) { 38f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mPaths = new PathCollection(); 39dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat for (int i = 0; i < MAX_PARTITIONS; i++) 40dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat mPartMinors[i] = -1; 41a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat mPendingPartMap = 0; 42a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat mDiskMajor = -1; 43a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat mDiskMinor = -1; 44a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat mDiskNumParts = 0; 45a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 46ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey if (strcmp(rec->mount_point, "auto") != 0) { 47ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey ALOGE("Vold managed volumes must have auto mount point; ignoring %s", 48ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey rec->mount_point); 49ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey } 50ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey 51ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey char mount[PATH_MAX]; 52ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey 53ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey snprintf(mount, PATH_MAX, "%s/%s", Volume::MEDIA_DIR, rec->label); 54ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey mMountpoint = strdup(mount); 55ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey snprintf(mount, PATH_MAX, "%s/%s", Volume::FUSE_DIR, rec->label); 56ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey mFuseMountpoint = strdup(mount); 57ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey 58a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat setState(Volume::State_NoMedia); 59f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 60f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 61ae10b91044bf76b40b77d81c169e48e0bbdf6d75San MehatDirectVolume::~DirectVolume() { 62f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat PathCollection::iterator it; 63f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 64f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (it = mPaths->begin(); it != mPaths->end(); ++it) 65f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat free(*it); 66f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat delete mPaths; 67f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 68f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 69ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehatint DirectVolume::addPath(const char *path) { 70f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat mPaths->push_back(strdup(path)); 71f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 72f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 73f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 74a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatdev_t DirectVolume::getDiskDevice() { 75a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return MKDEV(mDiskMajor, mDiskMinor); 76a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 77a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 782dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwooddev_t DirectVolume::getShareDevice() { 792dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood if (mPartIdx != -1) { 802dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood return MKDEV(mDiskMajor, mPartIdx); 812dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood } else { 822dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood return MKDEV(mDiskMajor, mDiskMinor); 832dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood } 842dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood} 852dfe297ec47559dbe2297a72bea71cf515c03797Mike Lockwood 86a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatvoid DirectVolume::handleVolumeShared() { 87a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat setState(Volume::State_Shared); 88a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 89a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 90a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatvoid DirectVolume::handleVolumeUnshared() { 91a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat setState(Volume::State_Idle); 92a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 93a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 94ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehatint DirectVolume::handleBlockEvent(NetlinkEvent *evt) { 95fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat const char *dp = evt->findParam("DEVPATH"); 96f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat 97fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat PathCollection::iterator it; 98f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat for (it = mPaths->begin(); it != mPaths->end(); ++it) { 99f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat if (!strncmp(dp, *it, strlen(*it))) { 100fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat /* We can handle this disk */ 101fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int action = evt->getAction(); 102fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat const char *devtype = evt->findParam("DEVTYPE"); 103fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 104a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (action == NetlinkEvent::NlActionAdd) { 105a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int major = atoi(evt->findParam("MAJOR")); 106a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int minor = atoi(evt->findParam("MINOR")); 107a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat char nodepath[255]; 108a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 109a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat snprintf(nodepath, 110a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat sizeof(nodepath), "/dev/block/vold/%d:%d", 111a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat major, minor); 112a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (createDeviceNode(nodepath, major, minor)) { 11397ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGE("Error making device node '%s' (%s)", nodepath, 114a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat strerror(errno)); 115a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 116a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (!strcmp(devtype, "disk")) { 117fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat handleDiskAdded(dp, evt); 118a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 119fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat handlePartitionAdded(dp, evt); 120a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 1213dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn /* Send notification iff disk is ready (ie all partitions found) */ 1223dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn if (getState() == Volume::State_Idle) { 1233dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn char msg[255]; 1243dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn 1253dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn snprintf(msg, sizeof(msg), 1263dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn "Volume %s %s disk inserted (%d:%d)", getLabel(), 127ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey getFuseMountpoint(), mDiskMajor, mDiskMinor); 1283dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeDiskInserted, 1293dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn msg, false); 1303dafc26e4f3adb9607e82ab0bd52ead5f76859a1Magnus Malmborn } 131a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else if (action == NetlinkEvent::NlActionRemove) { 132a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (!strcmp(devtype, "disk")) { 133a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat handleDiskRemoved(dp, evt); 134a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 135fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat handlePartitionRemoved(dp, evt); 136a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 137a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else if (action == NetlinkEvent::NlActionChange) { 138a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (!strcmp(devtype, "disk")) { 139a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat handleDiskChanged(dp, evt); 140a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 141a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat handlePartitionChanged(dp, evt); 142a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 143a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 14497ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGW("Ignoring non add/remove/change event"); 145f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 146fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 147f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return 0; 148f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 149f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat } 150f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat errno = ENODEV; 151f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat return -1; 152f1b736bc5605e92e917ab27f5abf3ba839be2270San Mehat} 153fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 154ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehatvoid DirectVolume::handleDiskAdded(const char *devpath, NetlinkEvent *evt) { 155da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root mDiskMajor = atoi(evt->findParam("MAJOR")); 156da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root mDiskMinor = atoi(evt->findParam("MINOR")); 1577b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat 1587b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat const char *tmp = evt->findParam("NPARTS"); 1597b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat if (tmp) { 1607b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat mDiskNumParts = atoi(tmp); 1617b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat } else { 16297ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGW("Kernel block uevent missing 'NPARTS'"); 1637b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat mDiskNumParts = 1; 1647b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat } 1657b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat 166fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int partmask = 0; 167fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat int i; 16859abc3c56b432089abfe868c04cdbc3b6d28aee2San Mehat for (i = 1; i <= mDiskNumParts; i++) { 169fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat partmask |= (1 << i); 170fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat } 171fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat mPendingPartMap = partmask; 172fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 173fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat if (mDiskNumParts == 0) { 174a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#ifdef PARTITION_DEBUG 17597ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Dv::diskIns - No partitions - good to go son!"); 176a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#endif 177fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat setState(Volume::State_Idle); 178fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat } else { 179a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#ifdef PARTITION_DEBUG 18097ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Dv::diskIns - waiting for %d partitions (mask 0x%x)", 181fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat mDiskNumParts, mPendingPartMap); 182a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#endif 183fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat setState(Volume::State_Pending); 184fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat } 185fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 186fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 187ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehatvoid DirectVolume::handlePartitionAdded(const char *devpath, NetlinkEvent *evt) { 188da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int major = atoi(evt->findParam("MAJOR")); 189da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int minor = atoi(evt->findParam("MINOR")); 1907b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat 1917b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat int part_num; 1927b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat 1937b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat const char *tmp = evt->findParam("PARTN"); 1947b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat 1957b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat if (tmp) { 1967b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat part_num = atoi(tmp); 1977b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat } else { 19897ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGW("Kernel block uevent missing 'PARTN'"); 1997b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat part_num = 1; 2007b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat } 20159abc3c56b432089abfe868c04cdbc3b6d28aee2San Mehat 202f3d3ce5e53ab7928f4c292c183c417a1bd051151Nick Kralevich if (part_num > MAX_PARTITIONS || part_num < 1) { 203cc8e96c8dccea1e8041db3146d389175582d3890Nick Kralevich SLOGE("Invalid 'PARTN' value"); 204cc8e96c8dccea1e8041db3146d389175582d3890Nick Kralevich return; 205f3d3ce5e53ab7928f4c292c183c417a1bd051151Nick Kralevich } 206f3d3ce5e53ab7928f4c292c183c417a1bd051151Nick Kralevich 2072a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat if (part_num > mDiskNumParts) { 2082a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat mDiskNumParts = part_num; 2092a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat } 2102a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat 211dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat if (major != mDiskMajor) { 21297ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGE("Partition '%s' has a different major than its disk!", devpath); 213dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat return; 214dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat } 215a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#ifdef PARTITION_DEBUG 21697ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Dv:partAdd: part_num = %d, minor = %d\n", part_num, minor); 217a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#endif 218d11b833201ae72265d52d606fa084841b44e9a65Bruce Beare if (part_num >= MAX_PARTITIONS) { 219d11b833201ae72265d52d606fa084841b44e9a65Bruce Beare SLOGE("Dv:partAdd: ignoring part_num = %d (max: %d)\n", part_num, MAX_PARTITIONS-1); 220d766090b7a72562be9e64700e13882663004650eBruce Beare } else { 221d766090b7a72562be9e64700e13882663004650eBruce Beare mPartMinors[part_num -1] = minor; 222d766090b7a72562be9e64700e13882663004650eBruce Beare } 22359abc3c56b432089abfe868c04cdbc3b6d28aee2San Mehat mPendingPartMap &= ~(1 << part_num); 224d766090b7a72562be9e64700e13882663004650eBruce Beare 22559abc3c56b432089abfe868c04cdbc3b6d28aee2San Mehat if (!mPendingPartMap) { 226a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#ifdef PARTITION_DEBUG 22797ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Dv:partAdd: Got all partitions - ready to rock!"); 228a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#endif 2292a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat if (getState() != Volume::State_Formatting) { 2302a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat setState(Volume::State_Idle); 231507d31b86b38dffe7c60ca5c54b5e631f5a7cab3Joseph Lehrer if (mRetryMount == true) { 232507d31b86b38dffe7c60ca5c54b5e631f5a7cab3Joseph Lehrer mRetryMount = false; 233507d31b86b38dffe7c60ca5c54b5e631f5a7cab3Joseph Lehrer mountVol(); 234507d31b86b38dffe7c60ca5c54b5e631f5a7cab3Joseph Lehrer } 2352a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat } 23659abc3c56b432089abfe868c04cdbc3b6d28aee2San Mehat } else { 237a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#ifdef PARTITION_DEBUG 23897ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Dv:partAdd: pending mask now = 0x%x", mPendingPartMap); 239a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat#endif 240a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 241a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 242a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 243a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatvoid DirectVolume::handleDiskChanged(const char *devpath, NetlinkEvent *evt) { 244da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int major = atoi(evt->findParam("MAJOR")); 245da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int minor = atoi(evt->findParam("MINOR")); 246a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 247a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if ((major != mDiskMajor) || (minor != mDiskMinor)) { 248a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return; 249a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 250a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 25197ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGI("Volume %s disk has changed", getLabel()); 2527b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat const char *tmp = evt->findParam("NPARTS"); 2537b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat if (tmp) { 2547b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat mDiskNumParts = atoi(tmp); 2557b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat } else { 25697ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGW("Kernel block uevent missing 'NPARTS'"); 2577b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat mDiskNumParts = 1; 2587b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat } 2597b8f2db4b07deaaa2f6f5ffbee0386a394032b08San Mehat 260a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int partmask = 0; 261a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int i; 262a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat for (i = 1; i <= mDiskNumParts; i++) { 263a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat partmask |= (1 << i); 264a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 265a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat mPendingPartMap = partmask; 266a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 2672a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat if (getState() != Volume::State_Formatting) { 2682a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat if (mDiskNumParts == 0) { 2692a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat setState(Volume::State_Idle); 2702a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat } else { 2712a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat setState(Volume::State_Pending); 2722a5b8ce09b8836a8463ef9beaaff865c36ca5e6aSan Mehat } 27359abc3c56b432089abfe868c04cdbc3b6d28aee2San Mehat } 274a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat} 275a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 276a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatvoid DirectVolume::handlePartitionChanged(const char *devpath, NetlinkEvent *evt) { 277da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int major = atoi(evt->findParam("MAJOR")); 278da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int minor = atoi(evt->findParam("MINOR")); 27997ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Volume %s %s partition %d:%d changed\n", getLabel(), getMountpoint(), major, minor); 280fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 281fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 282ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehatvoid DirectVolume::handleDiskRemoved(const char *devpath, NetlinkEvent *evt) { 283da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int major = atoi(evt->findParam("MAJOR")); 284da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int minor = atoi(evt->findParam("MINOR")); 285a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat char msg[255]; 286627366196859339d72ab9f68a817dd395a13468fLars Svensson bool enabled; 287627366196859339d72ab9f68a817dd395a13468fLars Svensson 288627366196859339d72ab9f68a817dd395a13468fLars Svensson if (mVm->shareEnabled(getLabel(), "ums", &enabled) == 0 && enabled) { 289627366196859339d72ab9f68a817dd395a13468fLars Svensson mVm->unshareVolume(getLabel(), "ums"); 290627366196859339d72ab9f68a817dd395a13468fLars Svensson } 291a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 29297ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Volume %s %s disk %d:%d removed\n", getLabel(), getMountpoint(), major, minor); 293a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat snprintf(msg, sizeof(msg), "Volume %s %s disk removed (%d:%d)", 294ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey getLabel(), getFuseMountpoint(), major, minor); 295a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeDiskRemoved, 296a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat msg, false); 297a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat setState(Volume::State_NoMedia); 298fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 299fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat 300ae10b91044bf76b40b77d81c169e48e0bbdf6d75San Mehatvoid DirectVolume::handlePartitionRemoved(const char *devpath, NetlinkEvent *evt) { 301da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int major = atoi(evt->findParam("MAJOR")); 302da62e7c00259f6b98696cedb7d031f04951caef0Kenny Root int minor = atoi(evt->findParam("MINOR")); 303a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat char msg[255]; 30475a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan int state; 305a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 30697ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Volume %s %s partition %d:%d removed\n", getLabel(), getMountpoint(), major, minor); 307a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 308a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat /* 309a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat * The framework doesn't need to get notified of 310a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat * partition removal unless it's mounted. Otherwise 311a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat * the removal notification will be sent on the Disk 312a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat * itself 313a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat */ 31475a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan state = getState(); 31575a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan if (state != Volume::State_Mounted && state != Volume::State_Shared) { 316a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return; 317a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 318a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 319a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if ((dev_t) MKDEV(major, minor) == mCurrentlyMountedKdev) { 320a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat /* 321a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat * Yikes, our mounted partition is going away! 322a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat */ 323a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat 324a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat snprintf(msg, sizeof(msg), "Volume %s %s bad removal (%d:%d)", 325ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey getLabel(), getFuseMountpoint(), major, minor); 326a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval, 327a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat msg, false); 3281a06edaf4db4e9c520624bcc06e0e13ee470d90eSan Mehat 3291a06edaf4db4e9c520624bcc06e0e13ee470d90eSan Mehat if (mVm->cleanupAsec(this, true)) { 3301a06edaf4db4e9c520624bcc06e0e13ee470d90eSan Mehat SLOGE("Failed to cleanup ASEC - unmount will probably fail!"); 3311a06edaf4db4e9c520624bcc06e0e13ee470d90eSan Mehat } 3321a06edaf4db4e9c520624bcc06e0e13ee470d90eSan Mehat 3330b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall if (Volume::unmountVol(true, false)) { 33497ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGE("Failed to unmount volume on bad removal (%s)", 335a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat strerror(errno)); 336a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat // XXX: At this point we're screwed for now 337a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } else { 33897ac40e4e6f3ed0bd5d6878d7d8d4a54fcaecb76San Mehat SLOGD("Crisis averted"); 339a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 34075a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan } else if (state == Volume::State_Shared) { 34175a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan /* removed during mass storage */ 34275a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan snprintf(msg, sizeof(msg), "Volume %s bad removal (%d:%d)", 34375a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan getLabel(), major, minor); 34475a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan mVm->getBroadcaster()->sendBroadcast(ResponseCode::VolumeBadRemoval, 34575a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan msg, false); 34675a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan 34775a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan if (mVm->unshareVolume(getLabel(), "ums")) { 34875a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan SLOGE("Failed to unshare volume on bad removal (%s)", 34975a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan strerror(errno)); 35075a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan } else { 35175a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan SLOGD("Crisis averted"); 35275a3e1a95af0a2790de1b12aeca0008bfdc61649Ethan } 353a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 354fd7f5875129adfe2845f4f3fffb17db3a89eea25San Mehat} 35549e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat 356dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat/* 357a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat * Called from base to get a list of devicenodes for mounting 358dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat */ 359a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehatint DirectVolume::getDeviceNodes(dev_t *devs, int max) { 360dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat 361dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat if (mPartIdx == -1) { 362a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat // If the disk has no partitions, try the disk itself 363dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat if (!mDiskNumParts) { 364a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat devs[0] = MKDEV(mDiskMajor, mDiskMinor); 365a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 1; 366dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat } 367dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat 368a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat int i; 369a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat for (i = 0; i < mDiskNumParts; i++) { 370a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat if (i == max) 371a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat break; 372a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat devs[i] = MKDEV(mDiskMajor, mPartMinors[i]); 373a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat } 374a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return mDiskNumParts; 375dd9b8e92aaf330b48ddb40a7380588ef92b53de6San Mehat } 376a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat devs[0] = MKDEV(mDiskMajor, mPartMinors[mPartIdx -1]); 377a2677e4ad01f250b0765f04adf0acfa6627efc98San Mehat return 1; 37849e2bce5b74129c26a35e25d4693cbfe98c4688eSan Mehat} 37929d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 38029d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall/* 38129d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * Called from base to update device info, 38229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * e.g. When setting up an dm-crypt mapping for the sd card. 38329d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall */ 38429d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrallint DirectVolume::updateDeviceInfo(char *new_path, int new_major, int new_minor) 38529d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall{ 38629d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall PathCollection::iterator it; 38729d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 38829d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall if (mPartIdx == -1) { 38929d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall SLOGE("Can only change device info on a partition\n"); 39029d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall return -1; 39129d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall } 39229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 39329d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall /* 39429d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * This is to change the sysfs path associated with a partition, in particular, 39529d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * for an internal SD card partition that is encrypted. Thus, the list is 39629d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * expected to be only 1 entry long. Check that and bail if not. 39729d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall */ 39829d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall if (mPaths->size() != 1) { 39929d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall SLOGE("Cannot change path if there are more than one for a volume\n"); 40029d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall return -1; 40129d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall } 40229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 40329d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall it = mPaths->begin(); 40429d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall free(*it); /* Free the string storage */ 40529d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall mPaths->erase(it); /* Remove it from the list */ 40629d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall addPath(new_path); /* Put the new path on the list */ 40729d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 4080b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall /* Save away original info so we can restore it when doing factory reset. 4090b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall * Then, when doing the format, it will format the original device in the 4100b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall * clear, otherwise it just formats the encrypted device which is not 4110b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall * readable when the device boots unencrypted after the reset. 4120b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall */ 4130b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall mOrigDiskMajor = mDiskMajor; 4140b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall mOrigDiskMinor = mDiskMinor; 4150b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall mOrigPartIdx = mPartIdx; 4160b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall memcpy(mOrigPartMinors, mPartMinors, sizeof(mPartMinors)); 4170b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall 41829d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall mDiskMajor = new_major; 41929d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall mDiskMinor = new_minor; 42029d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall /* Ugh, virual block devices don't use minor 0 for whole disk and minor > 0 for 42129d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * partition number. They don't have partitions, they are just virtual block 42229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * devices, and minor number 0 is the first dm-crypt device. Luckily the first 42329d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * dm-crypt device is for the userdata partition, which gets minor number 0, and 42429d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * it is not managed by vold. So the next device is minor number one, which we 42529d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * will call partition one. 42629d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall */ 42729d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall mPartIdx = new_minor; 42829d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall mPartMinors[new_minor-1] = new_minor; 42929d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 43029d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall mIsDecrypted = 1; 43129d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 43229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall return 0; 43329d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall} 43429d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 43529d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall/* 4360b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall * Called from base to revert device info to the way it was before a 4370b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall * crypto mapping was created for it. 4380b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall */ 4390b8b59719357fb80c330442787f7d5b1e332263bKen Sumrallvoid DirectVolume::revertDeviceInfo(void) 4400b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall{ 4410b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall if (mIsDecrypted) { 4420b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall mDiskMajor = mOrigDiskMajor; 4430b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall mDiskMinor = mOrigDiskMinor; 4440b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall mPartIdx = mOrigPartIdx; 4450b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall memcpy(mPartMinors, mOrigPartMinors, sizeof(mPartMinors)); 4460b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall 4470b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall mIsDecrypted = 0; 4480b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall } 4490b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall 4500b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall return; 4510b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall} 4520b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall 4530b8b59719357fb80c330442787f7d5b1e332263bKen Sumrall/* 45429d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall * Called from base to give cryptfs all the info it needs to encrypt eligible volumes 45529d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall */ 45629d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrallint DirectVolume::getVolInfo(struct volume_info *v) 45729d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall{ 45829d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall strcpy(v->label, mLabel); 45929d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall strcpy(v->mnt_point, mMountpoint); 460ba6ae8db137d012c9b8e11f9f8321c7771698e92Jeff Sharkey v->flags = getFlags(); 46129d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall /* Other fields of struct volume_info are filled in by the caller or cryptfs.c */ 46229d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall 46329d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall return 0; 46429d8da8cefa99e436c13295d4c9bad060ca18a6dKen Sumrall} 465