8#include "pedigree/kernel/Log.h"
10#include "FatFilesystem.h"
11#include "FatSymlink.h"
13void FatFilesystem::registerNode(
File* file) {
19 if (m_NodeAliases.lookup(file))
21 const uintptr_t inode = file->getInode();
22 NodeState* state = m_NodeStates.lookup(inode);
24 state =
new NodeState;
28 state->directoryCluster = directory->getDirCluster();
29 state->directoryOffset = directory->getDirOffset();
30 state->unlinked = directory->m_Unlinked;
32 auto* symlink =
static_cast<FatSymlink*
>(file);
33 state->directoryCluster = symlink->getDirCluster();
34 state->directoryOffset = symlink->getDirOffset();
35 state->unlinked = symlink->m_Unlinked;
37 m_NodeStates.insert(inode, state);
39 state->aliases.pushBack(file);
40 m_NodeAliases.insert(file, state);
45 directory->setDirCluster(state->directoryCluster);
46 directory->setDirOffset(state->directoryOffset);
47 directory->m_Unlinked = state->unlinked;
49 directory->markDetached();
51 auto* symlink =
static_cast<FatSymlink*
>(file);
52 symlink->setDirCluster(state->directoryCluster);
53 symlink->setDirOffset(state->directoryOffset);
54 symlink->m_Unlinked = state->unlinked;
58void FatFilesystem::releaseNode(
File* file) {
60 NodeState* retired =
nullptr;
63 NodeState* state = m_NodeAliases.lookup(file);
66 m_NodeAliases.remove(file);
67 for (
size_t i = 0; i < state->aliases.count(); ++i) {
68 if (state->aliases[i] == file) {
69 state->aliases.erase(i);
73 if (state->aliases.count())
75 if (m_NodeStates.lookup(state->inode) == state)
76 m_NodeStates.remove(state->inode);
83 ERROR(
"FAT: orphan node allocation reclamation needs a FAT retry");
88void FatFilesystem::moveNonFileNode(
File* file, uint32_t cluster, uint32_t offset) {
90 const auto moveAlias = [cluster, offset](
File* alias) {
91 if (alias->isDirectory()) {
93 directory->setDirCluster(cluster);
94 directory->setDirOffset(offset);
96 auto* symlink =
static_cast<FatSymlink*
>(alias);
97 symlink->setDirCluster(cluster);
98 symlink->setDirOffset(offset);
101 NodeState* state = m_NodeAliases.lookup(file);
106 state->directoryCluster = cluster;
107 state->directoryOffset = offset;
108 for (
File* alias : state->aliases)
112void FatFilesystem::unlinkNonFileNode(
File* file) {
114 const auto unlinkAlias = [](
File* alias) {
115 if (alias->isDirectory()) {
117 directory->m_Unlinked =
true;
118 directory->markDetached();
120 static_cast<FatSymlink*
>(alias)->m_Unlinked =
true;
123 NodeState* state = m_NodeAliases.lookup(file);
129 state->unlinked =
true;
130 for (
File* alias : state->aliases)
bool releaseClusterChain(uint32_t clus, bool lockFile=true)
virtual bool isDirectory()