xref: /aosp_15_r20/system/vold/model/Disk.h (revision f40fafd4c6c2594924d919feffc1a1fd6e3b30f3)
1*f40fafd4SAndroid Build Coastguard Worker /*
2*f40fafd4SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*f40fafd4SAndroid Build Coastguard Worker  *
4*f40fafd4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*f40fafd4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*f40fafd4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*f40fafd4SAndroid Build Coastguard Worker  *
8*f40fafd4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*f40fafd4SAndroid Build Coastguard Worker  *
10*f40fafd4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*f40fafd4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*f40fafd4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f40fafd4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*f40fafd4SAndroid Build Coastguard Worker  * limitations under the License.
15*f40fafd4SAndroid Build Coastguard Worker  */
16*f40fafd4SAndroid Build Coastguard Worker 
17*f40fafd4SAndroid Build Coastguard Worker #ifndef ANDROID_VOLD_DISK_H
18*f40fafd4SAndroid Build Coastguard Worker #define ANDROID_VOLD_DISK_H
19*f40fafd4SAndroid Build Coastguard Worker 
20*f40fafd4SAndroid Build Coastguard Worker #include "StubVolume.h"
21*f40fafd4SAndroid Build Coastguard Worker #include "Utils.h"
22*f40fafd4SAndroid Build Coastguard Worker #include "VolumeBase.h"
23*f40fafd4SAndroid Build Coastguard Worker 
24*f40fafd4SAndroid Build Coastguard Worker #include <utils/Errors.h>
25*f40fafd4SAndroid Build Coastguard Worker 
26*f40fafd4SAndroid Build Coastguard Worker #include <vector>
27*f40fafd4SAndroid Build Coastguard Worker 
28*f40fafd4SAndroid Build Coastguard Worker namespace android {
29*f40fafd4SAndroid Build Coastguard Worker namespace vold {
30*f40fafd4SAndroid Build Coastguard Worker 
31*f40fafd4SAndroid Build Coastguard Worker class VolumeBase;
32*f40fafd4SAndroid Build Coastguard Worker 
33*f40fafd4SAndroid Build Coastguard Worker /*
34*f40fafd4SAndroid Build Coastguard Worker  * Representation of detected physical media.
35*f40fafd4SAndroid Build Coastguard Worker  *
36*f40fafd4SAndroid Build Coastguard Worker  * Knows how to create volumes based on the partition tables found, and also
37*f40fafd4SAndroid Build Coastguard Worker  * how to repartition itself.
38*f40fafd4SAndroid Build Coastguard Worker  */
39*f40fafd4SAndroid Build Coastguard Worker class Disk {
40*f40fafd4SAndroid Build Coastguard Worker   public:
41*f40fafd4SAndroid Build Coastguard Worker     Disk(const std::string& eventPath, dev_t device, const std::string& nickname, int flags);
42*f40fafd4SAndroid Build Coastguard Worker     virtual ~Disk();
43*f40fafd4SAndroid Build Coastguard Worker 
44*f40fafd4SAndroid Build Coastguard Worker     enum Flags {
45*f40fafd4SAndroid Build Coastguard Worker         /* Flag that disk is adoptable */
46*f40fafd4SAndroid Build Coastguard Worker         kAdoptable = 1 << 0,
47*f40fafd4SAndroid Build Coastguard Worker         /* Flag that disk is considered primary when the user hasn't
48*f40fafd4SAndroid Build Coastguard Worker          * explicitly picked a primary storage location */
49*f40fafd4SAndroid Build Coastguard Worker         kDefaultPrimary = 1 << 1,
50*f40fafd4SAndroid Build Coastguard Worker         /* Flag that disk is SD card */
51*f40fafd4SAndroid Build Coastguard Worker         kSd = 1 << 2,
52*f40fafd4SAndroid Build Coastguard Worker         /* Flag that disk is USB disk */
53*f40fafd4SAndroid Build Coastguard Worker         kUsb = 1 << 3,
54*f40fafd4SAndroid Build Coastguard Worker         /* Flag that disk is EMMC internal */
55*f40fafd4SAndroid Build Coastguard Worker         kEmmc = 1 << 4,
56*f40fafd4SAndroid Build Coastguard Worker         /* Flag that disk is an invisible Stub disk, i.e., disk that is managed from outside
57*f40fafd4SAndroid Build Coastguard Worker          * Android (e.g., ARC++) and invisible to apps. */
58*f40fafd4SAndroid Build Coastguard Worker         kStubInvisible = 1 << 5,
59*f40fafd4SAndroid Build Coastguard Worker         /* Flag that disk is a visible Stub disk, i.e., disk that is managed from outside
60*f40fafd4SAndroid Build Coastguard Worker          * Android (e.g., ARC++) and visible to apps. */
61*f40fafd4SAndroid Build Coastguard Worker         kStubVisible = 1 << 6,
62*f40fafd4SAndroid Build Coastguard Worker     };
63*f40fafd4SAndroid Build Coastguard Worker 
getId()64*f40fafd4SAndroid Build Coastguard Worker     const std::string& getId() const { return mId; }
getEventPath()65*f40fafd4SAndroid Build Coastguard Worker     const std::string& getEventPath() const { return mEventPath; }
getSysPath()66*f40fafd4SAndroid Build Coastguard Worker     const std::string& getSysPath() const { return mSysPath; }
getDevPath()67*f40fafd4SAndroid Build Coastguard Worker     const std::string& getDevPath() const { return mDevPath; }
getDevice()68*f40fafd4SAndroid Build Coastguard Worker     dev_t getDevice() const { return mDevice; }
getSize()69*f40fafd4SAndroid Build Coastguard Worker     uint64_t getSize() const { return mSize; }
getLabel()70*f40fafd4SAndroid Build Coastguard Worker     const std::string& getLabel() const { return mLabel; }
getFlags()71*f40fafd4SAndroid Build Coastguard Worker     int getFlags() const { return mFlags; }
72*f40fafd4SAndroid Build Coastguard Worker 
isStub()73*f40fafd4SAndroid Build Coastguard Worker     bool isStub() const { return (mFlags & kStubInvisible) || (mFlags & kStubVisible); }
74*f40fafd4SAndroid Build Coastguard Worker 
75*f40fafd4SAndroid Build Coastguard Worker     std::shared_ptr<VolumeBase> findVolume(const std::string& id);
76*f40fafd4SAndroid Build Coastguard Worker 
77*f40fafd4SAndroid Build Coastguard Worker     void listVolumes(VolumeBase::Type type, std::list<std::string>& list) const;
78*f40fafd4SAndroid Build Coastguard Worker 
79*f40fafd4SAndroid Build Coastguard Worker     std::vector<std::shared_ptr<VolumeBase>> getVolumes() const;
80*f40fafd4SAndroid Build Coastguard Worker 
81*f40fafd4SAndroid Build Coastguard Worker     status_t create();
82*f40fafd4SAndroid Build Coastguard Worker     status_t destroy();
83*f40fafd4SAndroid Build Coastguard Worker 
84*f40fafd4SAndroid Build Coastguard Worker     status_t readMetadata();
85*f40fafd4SAndroid Build Coastguard Worker     status_t readPartitions();
86*f40fafd4SAndroid Build Coastguard Worker     void initializePartition(std::shared_ptr<StubVolume> vol);
87*f40fafd4SAndroid Build Coastguard Worker 
88*f40fafd4SAndroid Build Coastguard Worker     status_t unmountAll();
89*f40fafd4SAndroid Build Coastguard Worker 
90*f40fafd4SAndroid Build Coastguard Worker     status_t partitionPublic();
91*f40fafd4SAndroid Build Coastguard Worker     status_t partitionPrivate();
92*f40fafd4SAndroid Build Coastguard Worker     status_t partitionMixed(int8_t ratio);
93*f40fafd4SAndroid Build Coastguard Worker 
94*f40fafd4SAndroid Build Coastguard Worker   private:
95*f40fafd4SAndroid Build Coastguard Worker     /* ID that uniquely references this disk */
96*f40fafd4SAndroid Build Coastguard Worker     std::string mId;
97*f40fafd4SAndroid Build Coastguard Worker     /* Original event path */
98*f40fafd4SAndroid Build Coastguard Worker     std::string mEventPath;
99*f40fafd4SAndroid Build Coastguard Worker     /* Device path under sysfs */
100*f40fafd4SAndroid Build Coastguard Worker     std::string mSysPath;
101*f40fafd4SAndroid Build Coastguard Worker     /* Device path under dev */
102*f40fafd4SAndroid Build Coastguard Worker     std::string mDevPath;
103*f40fafd4SAndroid Build Coastguard Worker     /* Kernel device representing disk */
104*f40fafd4SAndroid Build Coastguard Worker     dev_t mDevice;
105*f40fafd4SAndroid Build Coastguard Worker     /* Size of disk, in bytes */
106*f40fafd4SAndroid Build Coastguard Worker     uint64_t mSize;
107*f40fafd4SAndroid Build Coastguard Worker     /* User-visible label, such as manufacturer */
108*f40fafd4SAndroid Build Coastguard Worker     std::string mLabel;
109*f40fafd4SAndroid Build Coastguard Worker     /* Current partitions on disk */
110*f40fafd4SAndroid Build Coastguard Worker     std::vector<std::shared_ptr<VolumeBase>> mVolumes;
111*f40fafd4SAndroid Build Coastguard Worker     /* Nickname for this disk */
112*f40fafd4SAndroid Build Coastguard Worker     std::string mNickname;
113*f40fafd4SAndroid Build Coastguard Worker     /* Flags applicable to this disk */
114*f40fafd4SAndroid Build Coastguard Worker     int mFlags;
115*f40fafd4SAndroid Build Coastguard Worker     /* Flag indicating object is created */
116*f40fafd4SAndroid Build Coastguard Worker     bool mCreated;
117*f40fafd4SAndroid Build Coastguard Worker     /* Flag that we just partitioned and should format all volumes */
118*f40fafd4SAndroid Build Coastguard Worker     bool mJustPartitioned;
119*f40fafd4SAndroid Build Coastguard Worker 
120*f40fafd4SAndroid Build Coastguard Worker     void createPublicVolume(dev_t device);
121*f40fafd4SAndroid Build Coastguard Worker     void createPrivateVolume(dev_t device, const std::string& partGuid);
122*f40fafd4SAndroid Build Coastguard Worker     void createStubVolume();
123*f40fafd4SAndroid Build Coastguard Worker 
124*f40fafd4SAndroid Build Coastguard Worker     void destroyAllVolumes();
125*f40fafd4SAndroid Build Coastguard Worker 
126*f40fafd4SAndroid Build Coastguard Worker     int getMaxMinors();
127*f40fafd4SAndroid Build Coastguard Worker 
128*f40fafd4SAndroid Build Coastguard Worker     DISALLOW_COPY_AND_ASSIGN(Disk);
129*f40fafd4SAndroid Build Coastguard Worker };
130*f40fafd4SAndroid Build Coastguard Worker 
131*f40fafd4SAndroid Build Coastguard Worker }  // namespace vold
132*f40fafd4SAndroid Build Coastguard Worker }  // namespace android
133*f40fafd4SAndroid Build Coastguard Worker 
134*f40fafd4SAndroid Build Coastguard Worker #endif
135