8#include "pedigree/kernel/syscallError.h"
10#include "FatFilesystem.h"
12bool FatFilesystem::chainExtent(
File* file, uint32_t& count, uint32_t& last) {
16 const uint64_t revision = __atomic_load_n(&m_ChainRevision, __ATOMIC_ACQUIRE);
17 const uintptr_t inode = file->getInode();
19 state =
static_cast<FatFile*
>(file)->m_State;
20 if (state->chainRevision == revision &&
21 (state->clusters.
count() ? state->clusters[0] == inode : inode == 0)) {
22 count =
static_cast<uint32_t
>(state->clusters.
count());
23 last = count ? state->clusters[count - 1] : 0;
26 state->chainRevision = 0;
27 state->clusters.
clear();
29 if (inode > UINT32_MAX)
32 uint32_t cluster =
static_cast<uint32_t
>(inode);
41 if (!state->clusters.tryReserve(
size_t(count) + 1)) {
42 SYSCALL_ERROR(OutOfMemory);
56 state->chainRevision = revision;
60uint32_t FatFilesystem::fileClusterAt(
File* file,
size_t index) {
61 uint32_t count = 0, last = 0;
62 if (!chainExtent(file, count, last) || index >= count)
65 return static_cast<FatFile*
>(file)->m_State->clusters[index];
67 uint32_t cluster =
static_cast<uint32_t
>(file->getInode());
68 for (
size_t position = 0; position < index; ++position) {
bool isEof(uint32_t cluster) const
uint32_t getClusterEntry(uint32_t cluster, bool bLock=true)
virtual bool isDirectory()
void pushBack(const T &value)
void clear(bool freeMem=false)