1*9190c2a8SAndroid Build Coastguard Worker /*
2*9190c2a8SAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*9190c2a8SAndroid Build Coastguard Worker *
4*9190c2a8SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*9190c2a8SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*9190c2a8SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*9190c2a8SAndroid Build Coastguard Worker *
8*9190c2a8SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*9190c2a8SAndroid Build Coastguard Worker *
10*9190c2a8SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*9190c2a8SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*9190c2a8SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9190c2a8SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*9190c2a8SAndroid Build Coastguard Worker * limitations under the License.
15*9190c2a8SAndroid Build Coastguard Worker */
16*9190c2a8SAndroid Build Coastguard Worker
17*9190c2a8SAndroid Build Coastguard Worker #ifndef ANDROID_INCREMENTAL_FILE_SYSTEM_NDK_H
18*9190c2a8SAndroid Build Coastguard Worker #define ANDROID_INCREMENTAL_FILE_SYSTEM_NDK_H
19*9190c2a8SAndroid Build Coastguard Worker
20*9190c2a8SAndroid Build Coastguard Worker #include <linux/incrementalfs.h>
21*9190c2a8SAndroid Build Coastguard Worker #include <stdbool.h>
22*9190c2a8SAndroid Build Coastguard Worker #include <stddef.h>
23*9190c2a8SAndroid Build Coastguard Worker #include <stdint.h>
24*9190c2a8SAndroid Build Coastguard Worker #include <string.h>
25*9190c2a8SAndroid Build Coastguard Worker #include <sys/cdefs.h>
26*9190c2a8SAndroid Build Coastguard Worker
27*9190c2a8SAndroid Build Coastguard Worker __BEGIN_DECLS
28*9190c2a8SAndroid Build Coastguard Worker
29*9190c2a8SAndroid Build Coastguard Worker #define INCFS_LIBRARY_NAME "libincfs.so"
30*9190c2a8SAndroid Build Coastguard Worker
31*9190c2a8SAndroid Build Coastguard Worker typedef struct {
32*9190c2a8SAndroid Build Coastguard Worker union {
33*9190c2a8SAndroid Build Coastguard Worker char data[16];
34*9190c2a8SAndroid Build Coastguard Worker int64_t for_alignment;
35*9190c2a8SAndroid Build Coastguard Worker };
36*9190c2a8SAndroid Build Coastguard Worker } IncFsFileId;
37*9190c2a8SAndroid Build Coastguard Worker
38*9190c2a8SAndroid Build Coastguard Worker static const IncFsFileId kIncFsInvalidFileId = {
39*9190c2a8SAndroid Build Coastguard Worker {{(char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1,
40*9190c2a8SAndroid Build Coastguard Worker (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1, (char)-1}}};
41*9190c2a8SAndroid Build Coastguard Worker
42*9190c2a8SAndroid Build Coastguard Worker static const int kIncFsFileIdStringLength = sizeof(IncFsFileId) * 2;
43*9190c2a8SAndroid Build Coastguard Worker
44*9190c2a8SAndroid Build Coastguard Worker typedef enum {
45*9190c2a8SAndroid Build Coastguard Worker INCFS_FEATURE_NONE = 0,
46*9190c2a8SAndroid Build Coastguard Worker INCFS_FEATURE_CORE = 1 << 0,
47*9190c2a8SAndroid Build Coastguard Worker INCFS_FEATURE_V2 = 1 << 1,
48*9190c2a8SAndroid Build Coastguard Worker INCFS_FEATURE_MAPPING_FILES_PROGRESS_FIXED = 1 << 2,
49*9190c2a8SAndroid Build Coastguard Worker
50*9190c2a8SAndroid Build Coastguard Worker } IncFsFeatures;
51*9190c2a8SAndroid Build Coastguard Worker
52*9190c2a8SAndroid Build Coastguard Worker typedef int IncFsErrorCode;
53*9190c2a8SAndroid Build Coastguard Worker typedef int64_t IncFsSize;
54*9190c2a8SAndroid Build Coastguard Worker typedef int32_t IncFsBlockIndex;
55*9190c2a8SAndroid Build Coastguard Worker typedef int IncFsFd;
56*9190c2a8SAndroid Build Coastguard Worker typedef struct IncFsControl IncFsControl;
57*9190c2a8SAndroid Build Coastguard Worker typedef int IncFsUid;
58*9190c2a8SAndroid Build Coastguard Worker
59*9190c2a8SAndroid Build Coastguard Worker static const IncFsUid kIncFsNoUid = -1;
60*9190c2a8SAndroid Build Coastguard Worker
61*9190c2a8SAndroid Build Coastguard Worker typedef struct {
62*9190c2a8SAndroid Build Coastguard Worker const char* data;
63*9190c2a8SAndroid Build Coastguard Worker IncFsSize size;
64*9190c2a8SAndroid Build Coastguard Worker } IncFsSpan;
65*9190c2a8SAndroid Build Coastguard Worker
66*9190c2a8SAndroid Build Coastguard Worker typedef enum {
67*9190c2a8SAndroid Build Coastguard Worker CMD,
68*9190c2a8SAndroid Build Coastguard Worker PENDING_READS,
69*9190c2a8SAndroid Build Coastguard Worker LOGS,
70*9190c2a8SAndroid Build Coastguard Worker BLOCKS_WRITTEN,
71*9190c2a8SAndroid Build Coastguard Worker FDS_COUNT,
72*9190c2a8SAndroid Build Coastguard Worker } IncFsFdType;
73*9190c2a8SAndroid Build Coastguard Worker
74*9190c2a8SAndroid Build Coastguard Worker typedef enum {
75*9190c2a8SAndroid Build Coastguard Worker INCFS_DEFAULT_READ_TIMEOUT_MS = 10000,
76*9190c2a8SAndroid Build Coastguard Worker INCFS_DEFAULT_PENDING_READ_BUFFER_SIZE = 24,
77*9190c2a8SAndroid Build Coastguard Worker INCFS_DEFAULT_PAGE_READ_BUFFER_PAGES = 4,
78*9190c2a8SAndroid Build Coastguard Worker } IncFsDefaults;
79*9190c2a8SAndroid Build Coastguard Worker
80*9190c2a8SAndroid Build Coastguard Worker typedef enum {
81*9190c2a8SAndroid Build Coastguard Worker INCFS_MOUNT_CREATE_ONLY = 1,
82*9190c2a8SAndroid Build Coastguard Worker INCFS_MOUNT_TRUNCATE = 2,
83*9190c2a8SAndroid Build Coastguard Worker } IncFsMountFlags;
84*9190c2a8SAndroid Build Coastguard Worker
85*9190c2a8SAndroid Build Coastguard Worker typedef enum {
86*9190c2a8SAndroid Build Coastguard Worker INCFS_HASH_NONE,
87*9190c2a8SAndroid Build Coastguard Worker INCFS_HASH_SHA256,
88*9190c2a8SAndroid Build Coastguard Worker } IncFsHashAlgortithm;
89*9190c2a8SAndroid Build Coastguard Worker
90*9190c2a8SAndroid Build Coastguard Worker typedef struct {
91*9190c2a8SAndroid Build Coastguard Worker IncFsMountFlags flags;
92*9190c2a8SAndroid Build Coastguard Worker int32_t defaultReadTimeoutMs;
93*9190c2a8SAndroid Build Coastguard Worker int32_t readLogBufferPages;
94*9190c2a8SAndroid Build Coastguard Worker int32_t readLogDisableAfterTimeoutMs;
95*9190c2a8SAndroid Build Coastguard Worker const char* sysfsName;
96*9190c2a8SAndroid Build Coastguard Worker } IncFsMountOptions;
97*9190c2a8SAndroid Build Coastguard Worker
98*9190c2a8SAndroid Build Coastguard Worker typedef enum {
99*9190c2a8SAndroid Build Coastguard Worker INCFS_COMPRESSION_KIND_NONE,
100*9190c2a8SAndroid Build Coastguard Worker INCFS_COMPRESSION_KIND_LZ4,
101*9190c2a8SAndroid Build Coastguard Worker INCFS_COMPRESSION_KIND_ZSTD,
102*9190c2a8SAndroid Build Coastguard Worker } IncFsCompressionKind;
103*9190c2a8SAndroid Build Coastguard Worker
104*9190c2a8SAndroid Build Coastguard Worker typedef enum {
105*9190c2a8SAndroid Build Coastguard Worker INCFS_BLOCK_KIND_DATA,
106*9190c2a8SAndroid Build Coastguard Worker INCFS_BLOCK_KIND_HASH,
107*9190c2a8SAndroid Build Coastguard Worker } IncFsBlockKind;
108*9190c2a8SAndroid Build Coastguard Worker
109*9190c2a8SAndroid Build Coastguard Worker typedef struct {
110*9190c2a8SAndroid Build Coastguard Worker IncFsFd fileFd;
111*9190c2a8SAndroid Build Coastguard Worker IncFsBlockIndex pageIndex;
112*9190c2a8SAndroid Build Coastguard Worker IncFsCompressionKind compression;
113*9190c2a8SAndroid Build Coastguard Worker IncFsBlockKind kind;
114*9190c2a8SAndroid Build Coastguard Worker uint32_t dataSize;
115*9190c2a8SAndroid Build Coastguard Worker const char* data;
116*9190c2a8SAndroid Build Coastguard Worker } IncFsDataBlock;
117*9190c2a8SAndroid Build Coastguard Worker
118*9190c2a8SAndroid Build Coastguard Worker typedef struct {
119*9190c2a8SAndroid Build Coastguard Worker IncFsSize size;
120*9190c2a8SAndroid Build Coastguard Worker IncFsSpan metadata;
121*9190c2a8SAndroid Build Coastguard Worker IncFsSpan signature;
122*9190c2a8SAndroid Build Coastguard Worker } IncFsNewFileParams;
123*9190c2a8SAndroid Build Coastguard Worker
124*9190c2a8SAndroid Build Coastguard Worker typedef struct {
125*9190c2a8SAndroid Build Coastguard Worker IncFsFileId sourceId;
126*9190c2a8SAndroid Build Coastguard Worker IncFsSize sourceOffset;
127*9190c2a8SAndroid Build Coastguard Worker IncFsSize size;
128*9190c2a8SAndroid Build Coastguard Worker } IncFsNewMappedFileParams;
129*9190c2a8SAndroid Build Coastguard Worker
130*9190c2a8SAndroid Build Coastguard Worker typedef struct {
131*9190c2a8SAndroid Build Coastguard Worker IncFsFileId id;
132*9190c2a8SAndroid Build Coastguard Worker uint64_t bootClockTsUs;
133*9190c2a8SAndroid Build Coastguard Worker IncFsBlockIndex block;
134*9190c2a8SAndroid Build Coastguard Worker uint32_t serialNo;
135*9190c2a8SAndroid Build Coastguard Worker } IncFsReadInfo;
136*9190c2a8SAndroid Build Coastguard Worker
137*9190c2a8SAndroid Build Coastguard Worker typedef struct {
138*9190c2a8SAndroid Build Coastguard Worker IncFsFileId id;
139*9190c2a8SAndroid Build Coastguard Worker uint64_t bootClockTsUs;
140*9190c2a8SAndroid Build Coastguard Worker IncFsBlockIndex block;
141*9190c2a8SAndroid Build Coastguard Worker uint32_t serialNo;
142*9190c2a8SAndroid Build Coastguard Worker IncFsUid uid;
143*9190c2a8SAndroid Build Coastguard Worker } IncFsReadInfoWithUid;
144*9190c2a8SAndroid Build Coastguard Worker
145*9190c2a8SAndroid Build Coastguard Worker typedef struct {
146*9190c2a8SAndroid Build Coastguard Worker IncFsBlockIndex begin;
147*9190c2a8SAndroid Build Coastguard Worker IncFsBlockIndex end;
148*9190c2a8SAndroid Build Coastguard Worker } IncFsBlockRange;
149*9190c2a8SAndroid Build Coastguard Worker
150*9190c2a8SAndroid Build Coastguard Worker typedef struct {
151*9190c2a8SAndroid Build Coastguard Worker IncFsBlockRange* dataRanges;
152*9190c2a8SAndroid Build Coastguard Worker IncFsBlockRange* hashRanges;
153*9190c2a8SAndroid Build Coastguard Worker int32_t dataRangesCount;
154*9190c2a8SAndroid Build Coastguard Worker int32_t hashRangesCount;
155*9190c2a8SAndroid Build Coastguard Worker IncFsBlockIndex endIndex;
156*9190c2a8SAndroid Build Coastguard Worker } IncFsFilledRanges;
157*9190c2a8SAndroid Build Coastguard Worker
158*9190c2a8SAndroid Build Coastguard Worker typedef struct {
159*9190c2a8SAndroid Build Coastguard Worker IncFsSize totalDataBlocks;
160*9190c2a8SAndroid Build Coastguard Worker IncFsSize filledDataBlocks;
161*9190c2a8SAndroid Build Coastguard Worker IncFsSize totalHashBlocks;
162*9190c2a8SAndroid Build Coastguard Worker IncFsSize filledHashBlocks;
163*9190c2a8SAndroid Build Coastguard Worker } IncFsBlockCounts;
164*9190c2a8SAndroid Build Coastguard Worker
165*9190c2a8SAndroid Build Coastguard Worker typedef struct {
166*9190c2a8SAndroid Build Coastguard Worker IncFsUid uid;
167*9190c2a8SAndroid Build Coastguard Worker uint32_t minTimeUs;
168*9190c2a8SAndroid Build Coastguard Worker uint32_t minPendingTimeUs;
169*9190c2a8SAndroid Build Coastguard Worker uint32_t maxPendingTimeUs;
170*9190c2a8SAndroid Build Coastguard Worker } IncFsUidReadTimeouts;
171*9190c2a8SAndroid Build Coastguard Worker
172*9190c2a8SAndroid Build Coastguard Worker typedef struct {
173*9190c2a8SAndroid Build Coastguard Worker uint32_t readsDelayedMin;
174*9190c2a8SAndroid Build Coastguard Worker uint64_t readsDelayedMinUs;
175*9190c2a8SAndroid Build Coastguard Worker uint32_t readsDelayedPending;
176*9190c2a8SAndroid Build Coastguard Worker uint64_t readsDelayedPendingUs;
177*9190c2a8SAndroid Build Coastguard Worker uint32_t readsFailedHashVerification;
178*9190c2a8SAndroid Build Coastguard Worker uint32_t readsFailedOther;
179*9190c2a8SAndroid Build Coastguard Worker uint32_t readsFailedTimedOut;
180*9190c2a8SAndroid Build Coastguard Worker uint64_t reserved;
181*9190c2a8SAndroid Build Coastguard Worker uint64_t reserved1;
182*9190c2a8SAndroid Build Coastguard Worker } IncFsMetrics;
183*9190c2a8SAndroid Build Coastguard Worker
184*9190c2a8SAndroid Build Coastguard Worker typedef struct {
185*9190c2a8SAndroid Build Coastguard Worker IncFsFileId id;
186*9190c2a8SAndroid Build Coastguard Worker uint64_t timestampUs;
187*9190c2a8SAndroid Build Coastguard Worker IncFsBlockIndex block;
188*9190c2a8SAndroid Build Coastguard Worker uint32_t errorNo;
189*9190c2a8SAndroid Build Coastguard Worker IncFsUid uid;
190*9190c2a8SAndroid Build Coastguard Worker } IncFsLastReadError;
191*9190c2a8SAndroid Build Coastguard Worker
192*9190c2a8SAndroid Build Coastguard Worker // All functions return -errno in case of failure.
193*9190c2a8SAndroid Build Coastguard Worker // All IncFsFd functions return >=0 in case of success.
194*9190c2a8SAndroid Build Coastguard Worker // All IncFsFileId functions return invalid IncFsFileId on error.
195*9190c2a8SAndroid Build Coastguard Worker // All IncFsErrorCode functions return 0 in case of success.
196*9190c2a8SAndroid Build Coastguard Worker
197*9190c2a8SAndroid Build Coastguard Worker bool IncFs_IsEnabled();
198*9190c2a8SAndroid Build Coastguard Worker IncFsFeatures IncFs_Features();
199*9190c2a8SAndroid Build Coastguard Worker
200*9190c2a8SAndroid Build Coastguard Worker bool IncFs_IsIncFsFd(int fd);
201*9190c2a8SAndroid Build Coastguard Worker bool IncFs_IsIncFsPath(const char* path);
202*9190c2a8SAndroid Build Coastguard Worker
IncFs_IsValidFileId(IncFsFileId fileId)203*9190c2a8SAndroid Build Coastguard Worker static inline bool IncFs_IsValidFileId(IncFsFileId fileId) {
204*9190c2a8SAndroid Build Coastguard Worker return memcmp(&fileId, &kIncFsInvalidFileId, sizeof(fileId)) != 0;
205*9190c2a8SAndroid Build Coastguard Worker }
206*9190c2a8SAndroid Build Coastguard Worker
207*9190c2a8SAndroid Build Coastguard Worker int IncFs_FileIdToString(IncFsFileId id, char* out);
208*9190c2a8SAndroid Build Coastguard Worker IncFsFileId IncFs_FileIdFromString(const char* in);
209*9190c2a8SAndroid Build Coastguard Worker
210*9190c2a8SAndroid Build Coastguard Worker IncFsFileId IncFs_FileIdFromMetadata(IncFsSpan metadata);
211*9190c2a8SAndroid Build Coastguard Worker
212*9190c2a8SAndroid Build Coastguard Worker IncFsControl* IncFs_Mount(const char* backingPath, const char* targetDir,
213*9190c2a8SAndroid Build Coastguard Worker IncFsMountOptions options);
214*9190c2a8SAndroid Build Coastguard Worker IncFsControl* IncFs_Open(const char* dir);
215*9190c2a8SAndroid Build Coastguard Worker IncFsControl* IncFs_CreateControl(IncFsFd cmd, IncFsFd pendingReads, IncFsFd logs,
216*9190c2a8SAndroid Build Coastguard Worker IncFsFd blocksWritten);
217*9190c2a8SAndroid Build Coastguard Worker void IncFs_DeleteControl(IncFsControl* control);
218*9190c2a8SAndroid Build Coastguard Worker IncFsFd IncFs_GetControlFd(const IncFsControl* control, IncFsFdType type);
219*9190c2a8SAndroid Build Coastguard Worker IncFsSize IncFs_ReleaseControlFds(IncFsControl* control, IncFsFd out[], IncFsSize outSize);
220*9190c2a8SAndroid Build Coastguard Worker
221*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_SetOptions(const IncFsControl* control, IncFsMountOptions options);
222*9190c2a8SAndroid Build Coastguard Worker
223*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_BindMount(const char* sourceDir, const char* targetDir);
224*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Unmount(const char* dir);
225*9190c2a8SAndroid Build Coastguard Worker
226*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Root(const IncFsControl* control, char buffer[], size_t* bufferSize);
227*9190c2a8SAndroid Build Coastguard Worker
228*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeFile(const IncFsControl* control, const char* path, int32_t mode,
229*9190c2a8SAndroid Build Coastguard Worker IncFsFileId id, IncFsNewFileParams params);
230*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeMappedFile(const IncFsControl* control, const char* path, int32_t mode,
231*9190c2a8SAndroid Build Coastguard Worker IncFsNewMappedFileParams params);
232*9190c2a8SAndroid Build Coastguard Worker
233*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeDir(const IncFsControl* control, const char* path, int32_t mode);
234*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_MakeDirs(const IncFsControl* control, const char* path, int32_t mode);
235*9190c2a8SAndroid Build Coastguard Worker
236*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetMetadataById(const IncFsControl* control, IncFsFileId id, char buffer[],
237*9190c2a8SAndroid Build Coastguard Worker size_t* bufferSize);
238*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetMetadataByPath(const IncFsControl* control, const char* path, char buffer[],
239*9190c2a8SAndroid Build Coastguard Worker size_t* bufferSize);
240*9190c2a8SAndroid Build Coastguard Worker
241*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetSignatureById(const IncFsControl* control, IncFsFileId id, char buffer[],
242*9190c2a8SAndroid Build Coastguard Worker size_t* bufferSize);
243*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetSignatureByPath(const IncFsControl* control, const char* path,
244*9190c2a8SAndroid Build Coastguard Worker char buffer[], size_t* bufferSize);
245*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_UnsafeGetSignatureByPath(const char* path, char buffer[], size_t* bufferSize);
246*9190c2a8SAndroid Build Coastguard Worker
247*9190c2a8SAndroid Build Coastguard Worker IncFsFileId IncFs_GetId(const IncFsControl* control, const char* path);
248*9190c2a8SAndroid Build Coastguard Worker
249*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Link(const IncFsControl* control, const char* sourcePath,
250*9190c2a8SAndroid Build Coastguard Worker const char* targetPath);
251*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_Unlink(const IncFsControl* control, const char* path);
252*9190c2a8SAndroid Build Coastguard Worker
253*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPendingReads(const IncFsControl* control, int32_t timeoutMs,
254*9190c2a8SAndroid Build Coastguard Worker IncFsReadInfo buffer[], size_t* bufferSize);
255*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPageReads(const IncFsControl* control, int32_t timeoutMs,
256*9190c2a8SAndroid Build Coastguard Worker IncFsReadInfo buffer[], size_t* bufferSize);
257*9190c2a8SAndroid Build Coastguard Worker
258*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPendingReadsWithUid(const IncFsControl* control, int32_t timeoutMs,
259*9190c2a8SAndroid Build Coastguard Worker IncFsReadInfoWithUid buffer[], size_t* bufferSize);
260*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForPageReadsWithUid(const IncFsControl* control, int32_t timeoutMs,
261*9190c2a8SAndroid Build Coastguard Worker IncFsReadInfoWithUid buffer[], size_t* bufferSize);
262*9190c2a8SAndroid Build Coastguard Worker
263*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForFsWrittenBlocksChange(const IncFsControl* control, int32_t timeoutMs,
264*9190c2a8SAndroid Build Coastguard Worker IncFsSize* count);
265*9190c2a8SAndroid Build Coastguard Worker
266*9190c2a8SAndroid Build Coastguard Worker IncFsFd IncFs_OpenForSpecialOpsByPath(const IncFsControl* control, const char* path);
267*9190c2a8SAndroid Build Coastguard Worker IncFsFd IncFs_OpenForSpecialOpsById(const IncFsControl* control, IncFsFileId id);
268*9190c2a8SAndroid Build Coastguard Worker
269*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WriteBlocks(const IncFsDataBlock blocks[], size_t blocksCount);
270*9190c2a8SAndroid Build Coastguard Worker
271*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_SetUidReadTimeouts(const IncFsControl* control,
272*9190c2a8SAndroid Build Coastguard Worker const IncFsUidReadTimeouts timeouts[], size_t count);
273*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetUidReadTimeouts(const IncFsControl* control,
274*9190c2a8SAndroid Build Coastguard Worker IncFsUidReadTimeouts timeoutsBuffer[], size_t* bufferSize);
275*9190c2a8SAndroid Build Coastguard Worker
276*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFileBlockCountByPath(const IncFsControl* control, const char* path,
277*9190c2a8SAndroid Build Coastguard Worker IncFsBlockCounts* blockCount);
278*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFileBlockCountById(const IncFsControl* control, IncFsFileId id,
279*9190c2a8SAndroid Build Coastguard Worker IncFsBlockCounts* blockCount);
280*9190c2a8SAndroid Build Coastguard Worker
281*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ListIncompleteFiles(const IncFsControl* control, IncFsFileId ids[],
282*9190c2a8SAndroid Build Coastguard Worker size_t* bufferSize);
283*9190c2a8SAndroid Build Coastguard Worker
284*9190c2a8SAndroid Build Coastguard Worker // Calls a passed callback for each file on the mounted filesystem, or, in the second case,
285*9190c2a8SAndroid Build Coastguard Worker // for each incomplete file (only for v2 IncFS).
286*9190c2a8SAndroid Build Coastguard Worker // Callback can stop the iteration early by returning |false|.
287*9190c2a8SAndroid Build Coastguard Worker // Return codes:
288*9190c2a8SAndroid Build Coastguard Worker // >=0 - number of files iterated,
289*9190c2a8SAndroid Build Coastguard Worker // <0 - -errno
290*9190c2a8SAndroid Build Coastguard Worker typedef bool (*FileCallback)(void* context, const IncFsControl* control, IncFsFileId fileId);
291*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ForEachFile(const IncFsControl* control, void* context, FileCallback cb);
292*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ForEachIncompleteFile(const IncFsControl* control, void* context,
293*9190c2a8SAndroid Build Coastguard Worker FileCallback cb);
294*9190c2a8SAndroid Build Coastguard Worker
295*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_WaitForLoadingComplete(const IncFsControl* control, int32_t timeoutMs);
296*9190c2a8SAndroid Build Coastguard Worker
297*9190c2a8SAndroid Build Coastguard Worker // Gets a collection of filled ranges in the file from IncFS. Uses the |outBuffer| memory, it has
298*9190c2a8SAndroid Build Coastguard Worker // to be big enough to fit all the ranges the caller is expecting.
299*9190c2a8SAndroid Build Coastguard Worker // Return codes:
300*9190c2a8SAndroid Build Coastguard Worker // 0 - success,
301*9190c2a8SAndroid Build Coastguard Worker // -ERANGE - input buffer is too small. filledRanges are still valid up to the outBuffer.size,
302*9190c2a8SAndroid Build Coastguard Worker // but there are more,
303*9190c2a8SAndroid Build Coastguard Worker // <0 - error, |filledRanges| is not valid.
304*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFilledRanges(int fd, IncFsSpan outBuffer, IncFsFilledRanges* filledRanges);
305*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetFilledRangesStartingFrom(int fd, int startBlockIndex, IncFsSpan outBuffer,
306*9190c2a8SAndroid Build Coastguard Worker IncFsFilledRanges* filledRanges);
307*9190c2a8SAndroid Build Coastguard Worker // Check if the file is fully loaded. Return codes:
308*9190c2a8SAndroid Build Coastguard Worker // 0 - fully loaded,
309*9190c2a8SAndroid Build Coastguard Worker // -ENODATA - some blocks are missing,
310*9190c2a8SAndroid Build Coastguard Worker // <0 - error from the syscall.
311*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsFullyLoaded(int fd);
312*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsFullyLoadedByPath(const IncFsControl* control, const char* path);
313*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsFullyLoadedById(const IncFsControl* control, IncFsFileId fileId);
314*9190c2a8SAndroid Build Coastguard Worker
315*9190c2a8SAndroid Build Coastguard Worker // Check if all files on the mount are fully loaded. Return codes:
316*9190c2a8SAndroid Build Coastguard Worker // 0 - fully loaded,
317*9190c2a8SAndroid Build Coastguard Worker // -ENODATA - some blocks are missing,
318*9190c2a8SAndroid Build Coastguard Worker // <0 - error from the syscall.
319*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_IsEverythingFullyLoaded(const IncFsControl* control);
320*9190c2a8SAndroid Build Coastguard Worker
321*9190c2a8SAndroid Build Coastguard Worker // Reserve |size| bytes for the file. Trims reserved space to the current file size when |size = -1|
322*9190c2a8SAndroid Build Coastguard Worker static const IncFsSize kIncFsTrimReservedSpace = -1;
323*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ReserveSpaceByPath(const IncFsControl* control, const char* path,
324*9190c2a8SAndroid Build Coastguard Worker IncFsSize size);
325*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_ReserveSpaceById(const IncFsControl* control, IncFsFileId id, IncFsSize size);
326*9190c2a8SAndroid Build Coastguard Worker
327*9190c2a8SAndroid Build Coastguard Worker // Gets the metrics of a mount by specifying the corresponding sysfs subpath.
328*9190c2a8SAndroid Build Coastguard Worker // Return codes:
329*9190c2a8SAndroid Build Coastguard Worker // =0 - success
330*9190c2a8SAndroid Build Coastguard Worker // <0 - -errno
331*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetMetrics(const char* sysfsName, IncFsMetrics* metrics);
332*9190c2a8SAndroid Build Coastguard Worker
333*9190c2a8SAndroid Build Coastguard Worker // Gets information about the last read error of a mount.
334*9190c2a8SAndroid Build Coastguard Worker // Return codes:
335*9190c2a8SAndroid Build Coastguard Worker // =0 - success
336*9190c2a8SAndroid Build Coastguard Worker // <0 - -errno
337*9190c2a8SAndroid Build Coastguard Worker // When there is no read error, still returns success. Fields in IncFsLastReadError will be all 0.
338*9190c2a8SAndroid Build Coastguard Worker // Possible values of IncFsLastReadError.errorNo:
339*9190c2a8SAndroid Build Coastguard Worker // -ETIME for read timeout;
340*9190c2a8SAndroid Build Coastguard Worker // -EBADMSG for hash verification failure;
341*9190c2a8SAndroid Build Coastguard Worker // Other negative values for other types of errors.
342*9190c2a8SAndroid Build Coastguard Worker IncFsErrorCode IncFs_GetLastReadError(const IncFsControl* control,
343*9190c2a8SAndroid Build Coastguard Worker IncFsLastReadError* lastReadError);
344*9190c2a8SAndroid Build Coastguard Worker
345*9190c2a8SAndroid Build Coastguard Worker __END_DECLS
346*9190c2a8SAndroid Build Coastguard Worker
347*9190c2a8SAndroid Build Coastguard Worker #endif // ANDROID_INCREMENTAL_FILE_SYSTEM_NDK_H
348