1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #pragma once 17 18 #include <stdint.h> 19 #include <sys/mman.h> 20 21 #include <memory> 22 #include <string> 23 24 #include <android-base/unique_fd.h> 25 #include <android/gsi/IGsiService.h> 26 #include <android/gsi/MappedImage.h> 27 #include <libfiemap/image_manager.h> 28 #include <liblp/builder.h> 29 30 namespace android { 31 namespace gsi { 32 33 class GsiService; 34 35 class PartitionInstaller final { 36 using ImageManager = android::fiemap::ImageManager; 37 using MappedDevice = android::fiemap::MappedDevice; 38 39 public: 40 // Constructor for a new GSI installation. 41 PartitionInstaller(GsiService* service, const std::string& installDir, const std::string& name, 42 const std::string& active_dsu, int64_t size, bool read_only); 43 ~PartitionInstaller(); 44 45 // Methods for a clean GSI install. 46 int StartInstall(); 47 bool CommitGsiChunk(int stream_fd, int64_t bytes); 48 bool CommitGsiChunk(const void* data, size_t bytes); 49 bool MapAshmem(int fd, size_t size); 50 bool CommitGsiChunk(size_t bytes); 51 int GetPartitionFd(); 52 53 static int WipeWritable(const std::string& active_dsu, const std::string& install_dir, 54 const std::string& name); 55 56 // Returns the minimum free space to reserve for /data. 57 static std::optional<uint64_t> GetMinimumFreeSpaceThreshold(const std::string& install_dir); 58 59 // Finish a partition installation and release resources. 60 // If the installation is incomplete or corrupted, the backing image would 61 // be cleaned up and an error code is returned. 62 // No method other than FinishInstall() and ~PartitionInstaller() should be 63 // called after calling this method. 64 // This method is also called by the destructor to free up resources. 65 int FinishInstall(); 66 install_dir()67 const std::string& install_dir() const { return install_dir_; } 68 69 private: 70 int PerformSanityChecks(); 71 int Preallocate(); 72 bool Format(); 73 bool CreateImage(const std::string& name, uint64_t size); 74 std::unique_ptr<MappedDevice> OpenPartition(const std::string& name); 75 int CheckInstallState(); 76 static const std::string GetBackingFile(std::string name); 77 bool IsFinishedWriting(); 78 bool IsAshmemMapped(); 79 void UnmapAshmem(); 80 81 GsiService* service_; 82 83 std::string install_dir_; 84 std::string name_; 85 std::string active_dsu_; 86 std::unique_ptr<ImageManager> images_; 87 uint64_t size_ = 0; 88 bool readOnly_; 89 // Remaining data we're waiting to receive for the GSI image. 90 uint64_t gsi_bytes_written_ = 0; 91 uint64_t ashmem_size_ = -1; 92 void* ashmem_data_ = MAP_FAILED; 93 94 bool finished_ = false; 95 int finished_status_ = 0; 96 97 std::unique_ptr<MappedDevice> system_device_; 98 }; 99 100 } // namespace gsi 101 } // namespace android 102