1deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey/*
2deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Copyright (C) 2015 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_DISK_H
18deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#define ANDROID_VOLD_DISK_H
19deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
20deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include "Utils.h"
21c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey#include "VolumeBase.h"
22deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
23deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <utils/Errors.h>
24deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
25deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#include <vector>
26deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
27deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeynamespace android {
28deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeynamespace vold {
29deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
30deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyclass VolumeBase;
31deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
32deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey/*
33deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Representation of detected physical media.
34deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey *
35deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * Knows how to create volumes based on the partition tables found, and also
36deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey * how to repartition itself.
37deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey */
38deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyclass Disk {
39deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeypublic:
4036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    Disk(const std::string& eventPath, dev_t device, const std::string& nickname, int flags);
41deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    virtual ~Disk();
42deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
4336801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    enum Flags {
4436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        /* Flag that disk is adoptable */
4536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kAdoptable = 1 << 0,
4636801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        /* Flag that disk is considered primary when the user hasn't
4736801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey         * explicitly picked a primary storage location */
4836801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kDefaultPrimary = 1 << 1,
4936801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        /* Flag that disk is SD card */
5036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kSd = 1 << 2,
5136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        /* Flag that disk is USB disk */
5236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey        kUsb = 1 << 3,
535a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey        /* Flag that disk is EMMC internal */
545a6bfca1638760b87cf64c5ffb48ff3557cc0563Jeff Sharkey        kEmmc = 1 << 4,
5536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    };
5636801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
57deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    const std::string& getId() { return mId; }
5836801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    const std::string& getEventPath() { return mEventPath; }
59deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    const std::string& getSysPath() { return mSysPath; }
60deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    const std::string& getDevPath() { return mDevPath; }
61deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    dev_t getDevice() { return mDevice; }
62deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    uint64_t getSize() { return mSize; }
63deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    const std::string& getLabel() { return mLabel; }
6436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    int getFlags() { return mFlags; }
65deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
66deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    std::shared_ptr<VolumeBase> findVolume(const std::string& id);
67deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
68c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey    void listVolumes(VolumeBase::Type type, std::list<std::string>& list);
69c86ab6f538bec63638c168d6c843fe7cf73add3bJeff Sharkey
7036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    status_t create();
7136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    status_t destroy();
7236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
73deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t readMetadata();
74deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t readPartitions();
75deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
769c48498f4529f623650c56d03e63324c8d813032Jeff Sharkey    status_t unmountAll();
779c48498f4529f623650c56d03e63324c8d813032Jeff Sharkey
78deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t partitionPublic();
79deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t partitionPrivate();
80deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    status_t partitionMixed(int8_t ratio);
81deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
82ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    void notifyEvent(int msg);
83ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    void notifyEvent(int msg, const std::string& value);
84ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey
85deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkeyprivate:
86deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* ID that uniquely references this disk */
87deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    std::string mId;
8836801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* Original event path */
8936801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    std::string mEventPath;
90deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Device path under sysfs */
91deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    std::string mSysPath;
92deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Device path under dev */
93deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    std::string mDevPath;
94deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Kernel device representing disk */
95deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    dev_t mDevice;
96deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Size of disk, in bytes */
97deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    uint64_t mSize;
98deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* User-visible label, such as manufacturer */
99deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    std::string mLabel;
100deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    /* Current partitions on disk */
10136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    std::vector<std::shared_ptr<VolumeBase>> mVolumes;
10236801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* Nickname for this disk */
10336801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    std::string mNickname;
10436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* Flags applicable to this disk */
10536801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    int mFlags;
10636801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    /* Flag indicating object is created */
10736801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    bool mCreated;
108ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    /* Flag that we just partitioned and should format all volumes */
109ce6a913aeac7db94a41362c63bab74092767bb3eJeff Sharkey    bool mJustPartitioned;
11036801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
11136801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    void createPublicVolume(dev_t device);
1129c48498f4529f623650c56d03e63324c8d813032Jeff Sharkey    void createPrivateVolume(dev_t device, const std::string& partGuid);
11336801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey
11436801cccf27152c9eca5aab6ba3527221525110fJeff Sharkey    void destroyAllVolumes();
115deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
116deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    int getMaxMinors();
117deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
118deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey    DISALLOW_COPY_AND_ASSIGN(Disk);
119deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey};
120deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
121deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey}  // namespace vold
122deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey}  // namespace android
123deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey
124deb240573754daf36fa8ea10a05240f9f31e7b2cJeff Sharkey#endif
125