xref: /aosp_15_r20/system/apex/apexd/apexd_loop.h (revision 33f3758387333dbd2962d7edbd98681940d895da)
1*33f37583SAndroid Build Coastguard Worker /*
2*33f37583SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*33f37583SAndroid Build Coastguard Worker  *
4*33f37583SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*33f37583SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*33f37583SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*33f37583SAndroid Build Coastguard Worker  *
8*33f37583SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*33f37583SAndroid Build Coastguard Worker  *
10*33f37583SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*33f37583SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*33f37583SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33f37583SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*33f37583SAndroid Build Coastguard Worker  * limitations under the License.
15*33f37583SAndroid Build Coastguard Worker  */
16*33f37583SAndroid Build Coastguard Worker 
17*33f37583SAndroid Build Coastguard Worker #ifndef ANDROID_APEXD_APEXD_LOOP_H_
18*33f37583SAndroid Build Coastguard Worker #define ANDROID_APEXD_APEXD_LOOP_H_
19*33f37583SAndroid Build Coastguard Worker 
20*33f37583SAndroid Build Coastguard Worker #include <android-base/result.h>
21*33f37583SAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
22*33f37583SAndroid Build Coastguard Worker 
23*33f37583SAndroid Build Coastguard Worker #include <functional>
24*33f37583SAndroid Build Coastguard Worker #include <string>
25*33f37583SAndroid Build Coastguard Worker 
26*33f37583SAndroid Build Coastguard Worker namespace android {
27*33f37583SAndroid Build Coastguard Worker namespace apex {
28*33f37583SAndroid Build Coastguard Worker namespace loop {
29*33f37583SAndroid Build Coastguard Worker 
30*33f37583SAndroid Build Coastguard Worker using android::base::unique_fd;
31*33f37583SAndroid Build Coastguard Worker 
32*33f37583SAndroid Build Coastguard Worker struct LoopbackDeviceUniqueFd {
33*33f37583SAndroid Build Coastguard Worker   unique_fd device_fd;
34*33f37583SAndroid Build Coastguard Worker   std::string name;
35*33f37583SAndroid Build Coastguard Worker 
LoopbackDeviceUniqueFdLoopbackDeviceUniqueFd36*33f37583SAndroid Build Coastguard Worker   LoopbackDeviceUniqueFd() {}
LoopbackDeviceUniqueFdLoopbackDeviceUniqueFd37*33f37583SAndroid Build Coastguard Worker   LoopbackDeviceUniqueFd(unique_fd&& fd, const std::string& name)
38*33f37583SAndroid Build Coastguard Worker       : device_fd(std::move(fd)), name(name) {}
39*33f37583SAndroid Build Coastguard Worker 
LoopbackDeviceUniqueFdLoopbackDeviceUniqueFd40*33f37583SAndroid Build Coastguard Worker   LoopbackDeviceUniqueFd(LoopbackDeviceUniqueFd&& fd) noexcept
41*33f37583SAndroid Build Coastguard Worker       : device_fd(std::move(fd.device_fd)), name(std::move(fd.name)) {}
42*33f37583SAndroid Build Coastguard Worker   LoopbackDeviceUniqueFd& operator=(LoopbackDeviceUniqueFd&& other) noexcept {
43*33f37583SAndroid Build Coastguard Worker     MaybeCloseBad();
44*33f37583SAndroid Build Coastguard Worker     device_fd = std::move(other.device_fd);
45*33f37583SAndroid Build Coastguard Worker     name = std::move(other.name);
46*33f37583SAndroid Build Coastguard Worker     return *this;
47*33f37583SAndroid Build Coastguard Worker   }
48*33f37583SAndroid Build Coastguard Worker 
~LoopbackDeviceUniqueFdLoopbackDeviceUniqueFd49*33f37583SAndroid Build Coastguard Worker   ~LoopbackDeviceUniqueFd() { MaybeCloseBad(); }
50*33f37583SAndroid Build Coastguard Worker 
51*33f37583SAndroid Build Coastguard Worker   void MaybeCloseBad();
52*33f37583SAndroid Build Coastguard Worker 
CloseGoodLoopbackDeviceUniqueFd53*33f37583SAndroid Build Coastguard Worker   void CloseGood() { device_fd.reset(-1); }
54*33f37583SAndroid Build Coastguard Worker 
GetLoopbackDeviceUniqueFd55*33f37583SAndroid Build Coastguard Worker   int Get() { return device_fd.get(); }
56*33f37583SAndroid Build Coastguard Worker };
57*33f37583SAndroid Build Coastguard Worker 
58*33f37583SAndroid Build Coastguard Worker android::base::Result<void> ConfigureQueueDepth(
59*33f37583SAndroid Build Coastguard Worker     const std::string& loop_device_path, const std::string& file_path);
60*33f37583SAndroid Build Coastguard Worker 
61*33f37583SAndroid Build Coastguard Worker android::base::Result<void> ConfigureReadAhead(const std::string& device_path);
62*33f37583SAndroid Build Coastguard Worker 
63*33f37583SAndroid Build Coastguard Worker android::base::Result<void> PreAllocateLoopDevices(size_t num);
64*33f37583SAndroid Build Coastguard Worker 
65*33f37583SAndroid Build Coastguard Worker android::base::Result<LoopbackDeviceUniqueFd> CreateAndConfigureLoopDevice(
66*33f37583SAndroid Build Coastguard Worker     const std::string& target, uint32_t image_offset, size_t image_size);
67*33f37583SAndroid Build Coastguard Worker 
68*33f37583SAndroid Build Coastguard Worker using DestroyLoopFn =
69*33f37583SAndroid Build Coastguard Worker     std::function<void(const std::string&, const std::string&)>;
70*33f37583SAndroid Build Coastguard Worker void DestroyLoopDevice(const std::string& path, const DestroyLoopFn& extra);
71*33f37583SAndroid Build Coastguard Worker 
72*33f37583SAndroid Build Coastguard Worker }  // namespace loop
73*33f37583SAndroid Build Coastguard Worker }  // namespace apex
74*33f37583SAndroid Build Coastguard Worker }  // namespace android
75*33f37583SAndroid Build Coastguard Worker 
76*33f37583SAndroid Build Coastguard Worker #endif  // ANDROID_APEXD_APEXD_LOOP_H_
77