[ox/fs] Add resize compactor

This commit is contained in:
Gary Talent 2019-06-22 17:23:24 -05:00
parent baff558ff2
commit 6571129686
2 changed files with 21 additions and 2 deletions

View File

@ -106,13 +106,15 @@ class FileStoreTemplate {
* @return 0 if read is a success
*/
template<typename T>
[[nodiscard]] Error read(InodeId_t id, FsSize_t readStart,
[[nodiscard]] ox::Error read(InodeId_t id, FsSize_t readStart,
FsSize_t readSize, T *data,
FsSize_t *size) const;
[[nodiscard]] ValErr<StatInfo> stat(InodeId_t id);
[[nodiscard]] Error resize(std::size_t size, void *newBuff = nullptr);
void resize();
[[nodiscard]] ox::Error resize(std::size_t size, void *newBuff = nullptr);
[[nodiscard]] InodeId_t spaceNeeded(FsSize_t size);
@ -409,6 +411,12 @@ const ptrarith::Ptr<uint8_t, std::size_t> FileStoreTemplate<size_t>::read(InodeI
}
}
template<typename size_t>
void FileStoreTemplate<size_t>::resize() {
compact();
m_buffSize = size() - available();
}
template<typename size_t>
Error FileStoreTemplate<size_t>::resize(std::size_t size, void *newBuff) {
m_buffSize = size;
@ -484,6 +492,7 @@ void FileStoreTemplate<size_t>::compact() {
<< "from" << oldAddr
<< "to" << item.offset();
auto parent = findParent(rootInode(), item);
oxAssert(parent.valid(), "Parent inode not found.");
if (parent.valid()) {
if (parent->left == oldAddr) {
parent->left = item;

View File

@ -102,6 +102,11 @@ class FileSystemTemplate: public FileSystem {
[[nodiscard]] ox::Error remove(const char *path, bool recursive = false) override;
/**
* Resizes FileSystem to minimum possible size.
*/
void resize();
[[nodiscard]] ox::Error resize(uint64_t size, void *buffer = nullptr) override;
[[nodiscard]] ox::Error write(const char *path, void *buffer, uint64_t size, uint8_t fileType = FileType_NormalFile) override;
@ -237,6 +242,11 @@ ox::Error FileSystemTemplate<FileStore, Directory>::remove(const char *path, boo
return OxError(0);
}
template<typename FileStore, typename Directory>
void FileSystemTemplate<FileStore, Directory>::resize() {
m_fs.resize();
}
template<typename FileStore, typename Directory>
ox::Error FileSystemTemplate<FileStore, Directory>::resize(uint64_t size, void *buffer) {
oxReturnError(m_fs.resize(size, buffer));