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