78#if defined(PEDIGREE_BUILDUTILS)
79 friend class Ext2FillCacheTestPeer;
80 friend class Ext2WritebackTestPeer;
98#if THREADS && !defined(STANDALONE_MUTEXES)
108 uint64_t write(uint64_t location, uint64_t size, uintptr_t buffer,
bool bCanBlock =
true,
109 bool publishMetadata =
true);
110 uint64_t append(uint64_t size, uintptr_t buffer, uint64_t& location,
bool bCanBlock =
true,
111 bool publishMetadata =
true);
120 bool m_MetadataPending =
false;
133 File(
const String& name, Time::Timestamp accessedTime, Time::Timestamp modifiedTime,
134 Time::Timestamp creationTime, uintptr_t inode,
class Filesystem* pFs,
size_t size,
144 virtual uint64_t read(uint64_t location, uint64_t size, uintptr_t buffer,
145 bool bCanBlock =
true) final;
149 size_t readCached(uint64_t location,
size_t size, uintptr_t buffer,
150 bool (*prepare)(uintptr_t,
size_t) =
nullptr);
154 virtual uint64_t write(uint64_t location, uint64_t size, uintptr_t buffer,
155 bool bCanBlock = true) final;
158 uint64_t append(uint64_t size, uintptr_t buffer, uint64_t& location,
bool bCanBlock = true);
166 virtual physical_uintptr_t getPhysicalPage(
size_t offset);
167 virtual
bool isDirectPhysicalMapping()
const {
170 size_t physicalMappingFlags()
const {
171 return m_PhysicalMappingFlags;
179 virtual void returnPhysicalPage(
size_t offset);
181 virtual bool tryBeginMappingRelease();
182 void endMappingRelease();
187 bool syncAndReturnPhysicalPage(
size_t offset,
bool async);
198 bool syncRange(
size_t offset,
size_t length);
204 virtual bool sync(
size_t offset,
bool async);
207 virtual bool syncPages(
const uint64_t* offsets,
size_t count);
210 Time::Timestamp getCreationTime();
212 void setCreationTime(Time::Timestamp t);
215 Time::Timestamp getAccessedTime();
217 void setAccessedTime(Time::Timestamp t);
220 Time::Timestamp getModifiedTime();
222 void setModifiedTime(Time::Timestamp t);
224 void setTimes(Time::Timestamp accessed, Time::Timestamp modified,
bool changeAccessed,
225 bool changeModified);
228 Time::Timestamp accessed = 0;
229 Time::Timestamp modified = 0;
230 Time::Timestamp changed = 0;
233 uint32_t permissions = 0;
241 enum AttributeMask : uint32_t {
242 AccessTime = 1U << 0,
243 ModifyTime = 1U << 1,
244 ChangeTime = 1U << 2,
247 Permissions = 1U << 5
250 virtual Attributes getAttributes()
const;
254 virtual XattrStatus getExtendedAttribute(
const StringView& name,
void* buffer,
size_t capacity,
256 virtual XattrStatus listExtendedAttributes(
void* buffer,
size_t capacity,
size_t& required);
257 virtual XattrStatus setExtendedAttribute(
const StringView& name,
const void* value,
size_t length,
259 virtual XattrStatus removeExtendedAttribute(
const StringView& name);
262 virtual bool prepareSharedMapping(
size_t offset,
size_t length);
266 void getName(
String& s)
const;
269 virtual void getFullPath(
String& result,
bool bWithMount =
true);
272 virtual String getFullPath(
bool bWithMount =
true);
275 virtual void truncate();
278 bool resize(
size_t size);
284 size_t mappingLoanCount;
294 virtual size_t getSize();
295 void setSize(
size_t sz);
298 virtual bool isSymlink();
301 virtual bool isDirectory();
302 virtual bool isBlockDevice()
const {
305 virtual uint64_t deviceNumber()
const {
310 virtual bool isPipe()
const;
313 virtual bool isFifo()
const;
316 virtual bool isSocket()
const;
319 virtual bool isSeekable()
const;
322 bool supportsRegularFileOperations();
323 virtual bool isCharacterDevice()
const {
326 virtual bool isConsole()
const {
331 virtual uint64_t maximumFileSize()
const;
334 virtual bool allowMapping(
bool shared,
bool writeRequested,
bool& mayWrite);
337 bool acquireMappingUse(
bool executable,
bool sharedWrite);
338 void releaseMappingUse(
bool executable,
bool sharedWrite);
340 uintptr_t getInode()
const;
341 virtual void setInode(uintptr_t inode);
344 virtual uintptr_t futexIdentity();
349 virtual void fileAttributeChanged();
353 bool targetIsDirectory =
false);
355 virtual FileHandleStatus subscribeInodeEvents(FileEventMask mask,
358 virtual void finishInodeRetirement();
360 virtual void increaseRefCount(
bool bIsWriter);
361 virtual void decreaseRefCount(
bool bIsWriter);
369 virtual bool retainVfsReference();
372 virtual void releaseVfsReference();
375 virtual bool isStableVfsRoot()
const;
377 void setPermissions(uint32_t perms);
378 uint32_t getPermissions()
const;
380 bool setOwnership(
size_t uid,
size_t gid,
bool changeUid,
bool changeGid);
381 void setUid(
size_t uid);
382 size_t getUid()
const;
384 void setGid(
size_t gid);
385 size_t getGid()
const;
387 File* getParent()
const;
390 void getNamespace(ParentLease& parent,
String& name)
const;
397 virtual int select(
bool bWriting =
false,
int timeout = 0);
400 virtual ReadyMask queryReady(
bool reading,
bool writing);
403 virtual bool supportsReadinessNotifications()
const;
412 void cullMonitorTargets(
Thread* pThread);
415 void cullMonitorTargets(
Event* pEvent);
418 virtual bool supports(
const size_t command)
const;
421 virtual int command(
const size_t command,
void* buffer);
425 virtual size_t getBlockSize()
const;
428 void markPageExternallyWritable(
size_t offset);
430 static constexpr size_t MaxReadPages = 32;
434 size_t populateRange(
size_t offset,
size_t length);
440 void disableDirect();
443 virtual void preallocate(
size_t expectedSize,
bool zero =
true);
446 bool allocateRange(
size_t offset,
size_t length,
bool keepSize =
false);
454 virtual File* open();
462 virtual void updateAttributes(
const Attributes& attributes, uint32_t mask);
463 virtual bool changeOwnership(
size_t uid,
size_t gid,
bool changeUid,
bool changeGid);
464 virtual bool allowPhysicalPage()
const {
467 virtual bool prepareWrite(uint64_t location, uint64_t size);
468 virtual bool allowResize(
size_t oldSize,
size_t newSize);
470 virtual bool resizeFile(
size_t size);
472 virtual bool allocateFileRange(
size_t offset,
size_t length);
473 virtual Mutex& writeSerializationLock();
474 virtual Mutex& dataMutationLock();
475 virtual size_t& physicalPageLoans();
477 bool clearDataCache();
483 virtual bool isBytewise()
const;
486 virtual uint64_t readBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
487 bool bCanBlock =
true);
489 virtual uint64_t writeBytewise(uint64_t location, uint64_t size, uintptr_t buffer,
490 bool bCanBlock =
true);
500 virtual uintptr_t readBlock(uint64_t location);
502 virtual bool readPage(uint64_t location, uintptr_t destination);
510 virtual bool readPages(
ReadPage* pages,
size_t count);
516 virtual void writeBlock(uint64_t location, uintptr_t addr);
519 virtual void writeBlocks(uint64_t location, uintptr_t addr,
size_t length);
522 virtual void extend(
size_t newSize);
530 virtual void extend(
size_t newSize, uint64_t location, uint64_t size);
532 virtual void publishInodeEvent(
const FileEvent& event);
547 static bool writeCallback(CacheConstants::CallbackCause cause, uintptr_t loc, uintptr_t page,
550 static bool fillCacheCallback(CacheConstants::CallbackCause cause, uintptr_t loc, uintptr_t page,
554 void enableFillCacheWriteback();
555 void shutdownFillCacheWriteback();
558 bool syncFillCache(
size_t offset,
bool async,
bool& present);
561 virtual bool useFillCache()
const;
584 MUST_USE_RESULT virtual uintptr_t acquireCachedBlock(uint64_t location,
bool retryChanged);
589 virtual void unpinBlock(uint64_t location);
599 void evict(uint64_t location);
602 void setPermissionsOnly(uint32_t perms);
605 void setUidOnly(
size_t uid);
608 void setGidOnly(
size_t gid);
611 void retainDetachedParent();
613 void moveNamespace(
const String& name,
File* parent);
615 bool snapshotNamespace(
ParentLease& parent,
String& name, FileEventMask interest)
const;
618 Time::Timestamp m_AccessedTime;
619 Time::Timestamp m_ModifiedTime;
620 Time::Timestamp m_CreationTime;
622 uintptr_t m_FutexIdentity = 0;
628 mutable Mutex m_MetadataLock;
632 bool m_bDetachedParentHandled;
634 size_t m_nWriters, m_nReaders;
638 uint32_t m_Permissions;
647 size_t hash()
const {
652 return m_Block == other.m_Block;
656 size_t m_Block = ~static_cast<size_t>(0);
666 size_t executableMappings = 0;
667 size_t sharedWriteMappings = 0;
675#if defined(PEDIGREE_BUILDUTILS)
676 bool m_bForceFillCache =
false;
681 Mutex m_DataMutationLock;
682 size_t m_PhysicalPageLoans = 0;
683 size_t m_PhysicalMappingFlags = 0;
685 void setPhysicalMappingFlags(
size_t flags) {
686 m_PhysicalMappingFlags = flags;
693 : pThread(pT), pEvent(pE), eventRegistration(pedigree_std::move(registration)) {}
702 void publishWriteMetadata();
705 uint64_t writeUnlocked(uint64_t location, uint64_t size, uintptr_t buffer,
bool bCanBlock);
708 uintptr_t getCachedPage(
size_t block,
bool locked =
true);
711 void setCachedPage(
size_t block, uintptr_t value,
bool locked =
true);
718 uintptr_t readIntoCache(uintptr_t block,
bool overwriteWholePage =
false,
719 size_t readAheadBytes = 0);
720 size_t populateRangeLocked(
size_t offset,
size_t length);
723 void releaseReadReference(uintptr_t block);