[ox/fs] Fix FileSystemTemplate::write to create Directory path index
This commit is contained in:
parent
0c6a557878
commit
cbfd9566d1
2
deps/ox/src/ox/fs/filesystem2/directory.hpp
vendored
2
deps/ox/src/ox/fs/filesystem2/directory.hpp
vendored
@ -94,6 +94,8 @@ class Directory {
|
|||||||
FileStore *m_fs = nullptr;
|
FileStore *m_fs = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Directory() = default;
|
||||||
|
|
||||||
Directory(FileStore *fs, InodeId_t inode);
|
Directory(FileStore *fs, InodeId_t inode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
44
deps/ox/src/ox/fs/filesystem2/filesystem.hpp
vendored
44
deps/ox/src/ox/fs/filesystem2/filesystem.hpp
vendored
@ -15,6 +15,12 @@
|
|||||||
|
|
||||||
namespace ox::fs {
|
namespace ox::fs {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FileSystemTemplate used to create file system that wraps around a FileStore,
|
||||||
|
* taking an inode size and a directory type as parameters.
|
||||||
|
*
|
||||||
|
* Note: Directory parameter must have a default constructor.
|
||||||
|
*/
|
||||||
template<typename InodeId_t, typename Directory>
|
template<typename InodeId_t, typename Directory>
|
||||||
class FileSystemTemplate {
|
class FileSystemTemplate {
|
||||||
private:
|
private:
|
||||||
@ -73,12 +79,14 @@ class FileSystemTemplate {
|
|||||||
bool valid() const;
|
bool valid() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ValErr<FileSystemData> fileSystemData();
|
ValErr<FileSystemData> fileSystemData() const noexcept;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds the inode ID at the given path.
|
* Finds the inode ID at the given path.
|
||||||
*/
|
*/
|
||||||
ValErr<uint64_t> find(const char *path);
|
ValErr<uint64_t> find(const char *path) const noexcept;
|
||||||
|
|
||||||
|
ValErr<Directory> rootDir() const noexcept;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -186,13 +194,18 @@ void FileSystemTemplate<InodeId_t, Directory>::resize(uint64_t size, void *buffe
|
|||||||
template<typename InodeId_t, typename Directory>
|
template<typename InodeId_t, typename Directory>
|
||||||
Error FileSystemTemplate<InodeId_t, Directory>::write(const char *path, void *buffer, uint64_t size, uint8_t fileType) {
|
Error FileSystemTemplate<InodeId_t, Directory>::write(const char *path, void *buffer, uint64_t size, uint8_t fileType) {
|
||||||
auto inode = find(path);
|
auto inode = find(path);
|
||||||
oxReturnError(inode.error);
|
if (inode.error) {
|
||||||
return write(inode, buffer, size, fileType);
|
inode = m_fs->generateInodeId();
|
||||||
|
}
|
||||||
|
auto rootDir = this->rootDir();
|
||||||
|
oxReturnError(rootDir.error);
|
||||||
|
oxReturnError(rootDir.value.write(path, inode));
|
||||||
|
oxReturnError(write(inode, buffer, size, fileType));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename InodeId_t, typename Directory>
|
template<typename InodeId_t, typename Directory>
|
||||||
Error FileSystemTemplate<InodeId_t, Directory>::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) {
|
Error FileSystemTemplate<InodeId_t, Directory>::write(uint64_t inode, void *buffer, uint64_t size, uint8_t fileType) {
|
||||||
// TODO: directory insert
|
|
||||||
return m_fs->write(inode, buffer, size, fileType);
|
return m_fs->write(inode, buffer, size, fileType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,7 +255,7 @@ Error FileSystemTemplate<InodeId_t, Directory>::walk(Error(*cb)(uint8_t, uint64_
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename InodeId_t, typename Directory>
|
template<typename InodeId_t, typename Directory>
|
||||||
ValErr<typename FileSystemTemplate<InodeId_t, Directory>::FileSystemData> FileSystemTemplate<InodeId_t, Directory>::fileSystemData() {
|
ValErr<typename FileSystemTemplate<InodeId_t, Directory>::FileSystemData> FileSystemTemplate<InodeId_t, Directory>::fileSystemData() const noexcept {
|
||||||
FileSystemData fd;
|
FileSystemData fd;
|
||||||
auto err = m_fs->read(InodeFsData, &fd, sizeof(fd));
|
auto err = m_fs->read(InodeFsData, &fd, sizeof(fd));
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
@ -252,15 +265,28 @@ ValErr<typename FileSystemTemplate<InodeId_t, Directory>::FileSystemData> FileSy
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename InodeId_t, typename Directory>
|
template<typename InodeId_t, typename Directory>
|
||||||
ValErr<uint64_t> FileSystemTemplate<InodeId_t, Directory>::find(const char *path) {
|
ValErr<uint64_t> FileSystemTemplate<InodeId_t, Directory>::find(const char *path) const noexcept {
|
||||||
auto fd = fileSystemData();
|
auto fd = fileSystemData();
|
||||||
oxReturnError(fd.error);
|
if (fd.error) {
|
||||||
|
return {0, fd.error};
|
||||||
|
}
|
||||||
Directory rootDir(m_fs, fd.value.rootDirInode);
|
Directory rootDir(m_fs, fd.value.rootDirInode);
|
||||||
auto inode = rootDir.find(path);
|
auto inode = rootDir.find(path);
|
||||||
oxReturnError(inode.error);
|
if (inode.error) {
|
||||||
|
return {0, inode.error};
|
||||||
|
}
|
||||||
return inode.value;
|
return inode.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename InodeId_t, typename Directory>
|
||||||
|
ValErr<Directory> FileSystemTemplate<InodeId_t, Directory>::rootDir() const noexcept {
|
||||||
|
auto fd = fileSystemData();
|
||||||
|
if (fd.error) {
|
||||||
|
return {{}, fd.error};
|
||||||
|
}
|
||||||
|
return Directory(m_fs, fd.value.rootDirInode);
|
||||||
|
}
|
||||||
|
|
||||||
extern template class Directory<uint16_t>;
|
extern template class Directory<uint16_t>;
|
||||||
extern template class Directory<uint32_t>;
|
extern template class Directory<uint32_t>;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user