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