58class EXPORTED_PUBLIC
VFS {
64 uint64_t generation()
const;
65 bool protects(
const VFS& vfs)
const {
66 return &m_Vfs == &vfs;
77 uint64_t namespaceGeneration()
const;
82 bool initialiseMountView();
84 static Module::UnloadAdmission unloadAdmission(
bool terminal);
96 explicit operator bool()
const;
118 explicit operator bool()
const;
149 explicit operator bool()
const;
158#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
159 class EXPORTED_PUBLIC HostedRootViewScope {
161 HostedRootViewScope();
162 ~HostedRootViewScope();
164 bool installContext(
Process& process);
171 HostedRootViewScope(
const HostedRootViewScope&) =
delete;
172 HostedRootViewScope& operator=(
const HostedRootViewScope&) =
delete;
179 FilesystemPin m_PreviousRootPin;
181 bool m_Installed =
false;
185 bool pinFilesystem(
Filesystem* key, FilesystemPin& pin)
const;
186 bool diskMount(uint32_t
id, MountIdentity&
identity)
const;
190 typedef void (*MountCallback)();
197 : stableName(stableName),
200 diskParentName(diskParentName),
201 diskName(diskName) {}
216 static VFS& instance();
233 bool unregisterFilesystem(
Filesystem* pFs,
bool canDelete =
true,
bool terminal =
false);
236 bool retireOwnedFilesystem(
Filesystem* filesystem);
238 bool removeDiskFilesystem(
Filesystem* filesystem,
bool deviceAvailable =
false);
246#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
264 Filesystem::SyncStatus syncFilesystem(
Filesystem* key);
267 Filesystem::SyncStatus syncAll();
270 bool removeEphemeralFiles();
279 bool createFile(
const String& path, uint32_t mask,
File* pStartNode = 0);
282 bool createDirectory(
const String& path, uint32_t mask,
File* pStartNode = 0);
285 bool createSymlink(
const String& path,
const String& value,
File* pStartNode = 0);
288 bool createLink(
const String& path,
File* target,
File* pStartNode = 0);
292 bool remove(
const String& path,
File* pStartNode = 0);
295 bool remove(
const String& path,
File* pStartNode,
File* expected);
298 bool noReplace =
false);
311 void addMountCallback(MountCallback callback);
314 bool removeMountCallback(MountCallback callback);
317 static bool checkAccess(
File* pFile,
bool bRead,
bool bWrite,
bool bExecute);
318 static bool checkAccess(
File* file,
bool read,
bool write,
bool execute,
322 static bool checkAccess(
File* pFile,
bool bRead,
bool bWrite,
bool bExecute, int64_t userId,
333 void trackFile(
File* pFile);
335 bool tryTrackFile(
File* pFile);
346 bool untrackFile(
File* pFile,
bool destroy =
true);
348#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
349 using RetainTrackedFileHook = void (*)(
File* pFile);
350 static void setRetainTrackedFileHookForHostedTest(RetainTrackedFileHook hook);
355 static constexpr size_t TrackedFileBuckets = 256;
357 bool trackFileLocked(
File* file);
377 bool draining =
false;
378 uintptr_t debugAddress = 0;
394 MountCallback callback;
411 void dispatchMountCallbacks(
void* owner);
412 bool isCallbackInvocation(
void* owner)
const;
417 String getUniqueStableNameLocked(
const String& preferredName)
const;
419 void attachRegisteredFilesystemsLocked();
428 mutable Mutex m_PathMutationLock;
429 uint64_t m_PathGeneration;
431 mutable Mutex m_MountMutationLock;
432 mutable Mutex m_MountTableLock;
442 size_t m_NextCallbackSequence;
444 bool m_CallbacksClosing;
449 Mutex m_TrackedFilesLock;
452#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
453 static RetainTrackedFileHook m_RetainTrackedFileHook;