47 friend class Ext2HandlesTestPeer;
48 friend class Ext2XattrTestPeer;
49 friend class Ext2FillCacheTestPeer;
50 friend class Ext2WritebackTestPeer;
51 friend class Ext2FilesystemSyncTestPeer;
52 friend class Ext2DirectorySyncTestPeer;
53 friend class Ext2AllocationTestPeer;
54 friend class Ext2QuotaTestPeer;
77 virtual SyncStatus
sync();
92 void releaseMetadata();
93 static bool quotaSucceeded(QuotaStatus status);
94 static QuotaStatus quotaIoStatus();
95 static int currentIoError();
96 QuotaStatus prepareQuotaInodeLocked(uint32_t inode);
97 QuotaStatus scanQuotaInodesLocked();
98 QuotaStatus flushQuotaLocked(QuotaType type);
99 QuotaStatus flushQuotas();
100 bool closeQuotaFiles(
bool discardOnFailure =
true);
101 bool beginWritableMount();
102 bool isQuotaFile(uint32_t inode);
104 Mutex m_QuotaControlLock;
105 Mutex m_QuotaNamespaceLock;
107#if defined(PEDIGREE_BUILDUTILS)
108 void (*m_QuotaOffTestHook)(
void*) =
nullptr;
109 void* m_QuotaOffTestContext =
nullptr;
115 FileHandleStatus validateHandleInodeLocked(uint32_t inode, uint32_t generation,
Inode*&);
118 enum class AttributeWriteKind { Payload, Allocation,
Inode };
120 uint64_t location = 0;
121 AttributeWriteKind kind = AttributeWriteKind::Payload;
122 bool ownsPin =
false;
124 static constexpr size_t MaximumAttributeWrites = 64;
126 size_t m_AttributeWriteCount = 0;
134 uintptr_t buffer = 0;
135 bool provisional =
false;
137 XattrStatus attributeFormatStatus()
const;
142 XattrStatus reserveAttributeWritesLocked(
size_t additional);
143 void recordAttributeWriteLocked(uint64_t, AttributeWriteKind,
bool adoptPin =
false);
144 void recordAttributeAllocationLocked(uint32_t block);
145 void recordAttributeInodeLocked(uint32_t inode);
146 void forgetAttributeBlockLocked(uint32_t block);
147 bool flushAttributeWritesLocked();
148 void drainAttributeWrites();
149 Mutex m_InodeStateLock;
152 size_t type, uint32_t inodeOverride = 0);
164 bool pinBlock(uint64_t location);
165 void unpinBlock(uint64_t location);
167 bool syncBlock(uint32_t block,
bool async);
168 bool syncInode(uint32_t inode,
Ext2Node& node,
bool includeNamespaceMetadata =
false);
170 uint32_t findFreeBlock(uint32_t inode);
171 bool findFreeBlocks(uint32_t inode,
size_t count,
Vector<uint32_t>& blocks);
173 uint32_t findFreeInode(uint32_t uid = 0, uint32_t gid = 0);
175 void releaseBlock(uint32_t block, uint32_t inode = 0);
180 Inode* getInode(uint32_t num);
181 void writeInode(uint32_t num);
183 bool ensureFreeBlockBitmapLoaded(
size_t group);
184 bool ensureFreeInodeBitmapLoaded(
size_t group);
185 uintptr_t loadInodeTableBlock(
size_t group,
size_t block);
188 bool prepareBlockReleaseLocked(uint32_t block);
189 bool prepareInodeWrite(uint32_t inode);
191 bool checkOptionalFeature(
size_t feature);
192 bool checkRequiredFeature(
size_t feature);
193 bool checkReadOnlyFeature(
size_t feature);
195 void increaseInodeRefcount(uint32_t inode);
196 bool decreaseInodeRefcount(uint32_t inode);
200 uint16_t m_MountState = 0;
201 bool m_ShutdownComplete =
false;
202 bool m_TeardownFailed =
false;
224#if THREADS || defined(STANDALONE_MUTEXES)