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