diff --git a/src/ox/fs/filestore/filestoretemplate.hpp b/src/ox/fs/filestore/filestoretemplate.hpp index 1e9359fcb..773ff0407 100644 --- a/src/ox/fs/filestore/filestoretemplate.hpp +++ b/src/ox/fs/filestore/filestoretemplate.hpp @@ -130,7 +130,7 @@ class FileStoreTemplate { bool valid() const; - void compact(); + ox::Error compact(); private: FileStoreData *fileStoreData() const; @@ -247,7 +247,7 @@ Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSi oxTrace("ox::fs::FileStoreTemplate::write") << "Attempting to write to inode" << id; auto existing = find(id); if (!canWrite(existing, dataSize)) { - compact(); + oxReturnError(compact()); existing = find(id); } @@ -268,7 +268,7 @@ Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSi // if first malloc failed, compact and try again if (!dest.valid()) { oxTrace("ox::fs::FileStoreTemplate::write") << "Allocation failed, compacting"; - compact(); + oxReturnError(compact()); dest = m_buffer->malloc(dataSize); } if (dest.valid()) { @@ -413,7 +413,7 @@ const ptrarith::Ptr FileStoreTemplate::read(InodeI template ox::Error FileStoreTemplate::resize() { - compact(); + oxReturnError(compact()); oxReturnError(m_buffer->setSize(size() - available())); oxTrace("ox::fs::FileStoreTemplate::resize") << "resize to:" << size() - available(); oxTrace("ox::fs::FileStoreTemplate::resize") << "resized to:" << m_buffer->size(); @@ -491,15 +491,15 @@ ValErr::InodeId_t> FileStoreTemplate: } template -void FileStoreTemplate::compact() { +ox::Error FileStoreTemplate::compact() { auto isFirstItem = true; - m_buffer->compact([this, &isFirstItem](uint64_t oldAddr, ItemPtr item) { + return m_buffer->compact([this, &isFirstItem](uint64_t oldAddr, ItemPtr item) -> ox::Error { if (isFirstItem) { isFirstItem = false; - return; + return OxError(0); } if (!item.valid()) { - return; + return OxError(1); } oxTrace("ox::FileStoreTemplate::compact::moveItem") << "Moving Item:" << item->id @@ -520,6 +520,7 @@ void FileStoreTemplate::compact() { parent->right = item; } } + return OxError(0); }); } diff --git a/src/ox/ptrarith/nodebuffer.hpp b/src/ox/ptrarith/nodebuffer.hpp index 896a5d5b8..4f7dc3c1b 100644 --- a/src/ox/ptrarith/nodebuffer.hpp +++ b/src/ox/ptrarith/nodebuffer.hpp @@ -150,7 +150,7 @@ class __attribute__((packed)) NodeBuffer { size_t spaceNeeded(size_t size); template - void compact(F cb = [](uint64_t, ItemPtr) {}); + ox::Error compact(F cb = [](uint64_t, ItemPtr) {}); void truncate(); @@ -354,13 +354,13 @@ size_t NodeBuffer::spaceNeeded(size_t size) { template template -void NodeBuffer::compact(F cb) { +ox::Error NodeBuffer::compact(F cb) { auto src = firstItem(); auto dest = ptr(sizeof(*this)); while (src.valid() && dest.valid() && dest.offset() <= src.offset()) { // move node ox_memcpy(dest, src, src.size()); - cb(src, dest); + oxReturnError(cb(src, dest)); // update surrounding nodes auto prev = ptr(dest->prev); if (prev.valid()) { @@ -374,6 +374,7 @@ void NodeBuffer::compact(F cb) { src = ptr(dest->next); dest = ptr(dest.offset() + dest.size()); } + return OxError(0); } template