35 if (!tryAcquireOperation(operation)) {
36 return SyncStatus::IoError;
39 if (m_ShutdownComplete)
40 return SyncStatus::Success;
44 return SyncStatus::IoError;
47 if (status != SyncStatus::Success)
49 if (!closeQuotaFiles(
false))
50 return SyncStatus::IoError;
56 if (status != SyncStatus::Success)
58 for (
auto it = m_InodeStates.
begin(); it != m_InodeStates.
end(); ++it) {
59 auto* state = it.value();
60 if (state->references || state->pageLoans || state->syncReferences || state->orphan)
61 return SyncStatus::IoError;
62 if (state->cache && !state->cache->fill.shutdown())
63 return SyncStatus::IoError;
65 for (
auto it = m_InodeStates.
begin(); it != m_InodeStates.
end(); ++it)
67 m_InodeStates.
clear();
69 return SyncStatus::IoError;
71 if (checkOptionalFeature(0x4) || checkRequiredFeature(~
size_t(0x2)) ||
72 checkReadOnlyFeature(~
size_t(0x3)))
73 return SyncStatus::Unsupported;
77 if (m_MountState != EXT2_STATE_CLEAN) {
78 m_ShutdownComplete =
true;
79 return SyncStatus::Success;
85 m_pSuperblock->s_state = HOST_TO_LITTLE16(m_MountState & ~EXT2_STATE_CLEAN);
88 ERROR(
"Ext2: could not restore the unchecked state after shutdown I/O failure");
89 return SyncStatus::IoError;
91 m_ShutdownComplete =
true;
92 return SyncStatus::Success;
120 if (!tryAcquireOperation(operation)) {
121 return SyncStatus::IoError;
125 return SyncStatus::Success;
127 return SyncStatus::IoError;
129 const auto quotaStatus = flushQuotas();
136 required = m_InodeStates.
count();
137 if (required <= snapshot.entries.size()) {
138 for (
auto it = m_InodeStates.
begin(); it != m_InodeStates.
end(); ++it) {
142 if (!state->references && !state->cache)
144 if (state->references == ~
size_t(0))
145 return SyncStatus::NoMemory;
147 __atomic_add_fetch(&state->syncReferences,
size_t(1), __ATOMIC_RELEASE);
148 snapshot.entries.pushBack({it.key(), state});
154 if (!snapshot.entries.tryReserve(required,
false))
155 return SyncStatus::NoMemory;
158 bool succeeded = quotaStatus == QuotaStatus::Success;
159 for (
const auto& entry : snapshot.entries) {
161 if (!entry.state->allocationValid)
163 if (entry.state->cache)
165 entry.state->cache->fill.syncAll(Ext2File::sharedFillBatchCallback, entry.state) &&
170#if THREADS || defined(STANDALONE_MUTEXES)
174 if (!flushAttributeWritesLocked())
175 return SyncStatus::IoError;
178 return succeeded ? SyncStatus::Success
179 : quotaStatus == QuotaStatus::NoMemory ? SyncStatus::NoMemory
180 : SyncStatus::IoError;