VolumeBase.h revision deb240573754daf36fa8ea10a05240f9f31e7b2c
1deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey/* 2deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Copyright (C) 2008 The Android Open Source Project 3deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * 4deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * you may not use this file except in compliance with the License. 6deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * You may obtain a copy of the License at 7deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * 8deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * 10deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Unless required by applicable law or agreed to in writing, software 11deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * See the License for the specific language governing permissions and 14deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * limitations under the License. 15deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey */ 16deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 17deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#ifndef ANDROID_VOLD_VOLUME_BASE_H 18deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#define ANDROID_VOLD_VOLUME_BASE_H 19deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 20deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include "Utils.h" 21deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 22deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <utils/Errors.h> 23deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 24deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <sys/types.h> 25deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <list> 26deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <string> 27deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 28deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeynamespace android { 29deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeynamespace vold { 30deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 31deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyenum class VolumeState { 32deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kUnmounted, 33deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kMounting, 34deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kMounted, 35deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kCorrupt, 36deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kFormatting, 37deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kUnmounting, 38deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey}; 39deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 40deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyenum class VolumeType { 41deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kPublic, 42deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kPrivate, 43deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kEmulated, 44deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kAsec, 45deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey kObb, 46deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey}; 47deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 48deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// events: 49deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume_created private:127:4 50deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume_state private:127:4 mounted 51deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume_meta private:127:4 [fsGuid] [label] 52deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume_destroyed public:127:4 53deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 54deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// commands: 55deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume mount public:127:4 [primary] 56deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume unmount public:127:4 57deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume bind_user public:127:4 [userId] 58deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume unbind_user public:127:4 [userId] 59deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume bind_package private:4:1 [userId] [package] 60deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey// volume unbind_package private:4:1 [userId] [package] 61deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 62deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey/* 63deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Representation of a mounted volume ready for presentation. 64deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * 65deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Various subclasses handle the different mounting prerequisites, such as 66deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * encryption details, etc. Volumes can also be "stacked" above other 67deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * volumes to help communicate dependencies. For example, an ASEC volume 68deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * can be stacked on a vfat volume. 69deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * 70deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Mounted volumes can be asked to manage bind mounts to present themselves 71deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * to specific users on the device. 72deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * 73deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * When an unmount is requested, the volume recursively unmounts any stacked 74deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * volumes and removes any bind mounts before finally unmounting itself. 75deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey */ 76deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyclass VolumeBase { 77deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeypublic: 78deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey virtual ~VolumeBase(); 79deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 80deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey VolumeType getType() { return mType; } 81deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey const std::string& getId() { return mId; } 82deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey VolumeState getState() { return mState; } 83deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 84deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey void stackVolume(const std::shared_ptr<VolumeBase>& volume); 85deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey void unstackVolume(const std::shared_ptr<VolumeBase>& volume); 86deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 87deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey status_t mount(); 88deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey status_t unmount(); 89deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey status_t format(); 90deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 91deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyprotected: 92deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey explicit VolumeBase(VolumeType type); 93deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 94deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey /* ID that uniquely references this disk */ 95deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey std::string mId; 96deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 97deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey /* Manage bind mounts for this volume */ 98deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey status_t mountBind(const std::string& source, const std::string& target); 99deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey status_t unmountBind(const std::string& target); 100deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 101deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey virtual status_t doMount() = 0; 102deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey virtual status_t doUnmount() = 0; 103deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey virtual status_t doFormat(); 104deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 105deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyprivate: 106deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey /* Volume type */ 107deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey VolumeType mType; 108deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey /* Current state of volume */ 109deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey VolumeState mState; 110deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 111deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey /* Volumes stacked on top of this volume */ 112deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey std::list<std::shared_ptr<VolumeBase>> mStacked; 113deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey /* Currently active bind mounts */ 114deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey std::list<std::string> mBindTargets; 115deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 116deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey void setState(VolumeState state); 117deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 118deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey DISALLOW_COPY_AND_ASSIGN(VolumeBase); 119deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey}; 120deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 121deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey} // namespace vold 122deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey} // namespace android 123deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey 124deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#endif 125