diff --git a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp index 0d67e7e4..c48fa57a 100644 --- a/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp +++ b/deps/ox/src/ox/fs/filestore/filestoretemplate.hpp @@ -112,7 +112,7 @@ class FileStoreTemplate { [[nodiscard]] ValErr stat(InodeId_t id); - void resize(); + [[nodiscard]] ox::Error resize(); [[nodiscard]] ox::Error resize(std::size_t size, void *newBuff = nullptr); @@ -277,6 +277,7 @@ Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSi dest->fileType = fileType; auto destData = m_buffer->template dataOf(dest); if (destData.valid()) { + oxAssert(destData.size() == dataSize, "Allocation size does not match data."); // write data if any was provided if (data != nullptr) { ox_memcpy(destData, data, dest->size()); @@ -293,7 +294,6 @@ Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSi oxTrace("ox::fs::FileStoreTemplate::write") << "Initializing root inode:" << dest->id << "( offset:" << dest.offset() << ", data size:" << destData.size() << ")"; fsData->rootNode = dest.offset(); - m_buffer->malloc(dataSize); oxTrace("ox::fs::FileStoreTemplate::write") << "Root inode:" << dest->id; return OxError(0); } @@ -302,7 +302,7 @@ Error FileStoreTemplate::write(InodeId_t id, void *data, FsSize_t dataSi } } } - m_buffer->free(dest); + oxReturnError(m_buffer->free(dest)); } return OxError(1); } @@ -386,8 +386,8 @@ Error FileStoreTemplate::read(InodeId_t id, FsSize_t readStart, // do byte-by-byte copy to ensure alignment is right when // copying to final destination T tmp; - for (size_t i = 0; i < sizeof(T); i++) { - reinterpret_cast(&tmp)[i] = *(sub.get() + i); + for (size_t ii = 0; ii < sizeof(T); ii++) { + reinterpret_cast(&tmp)[ii] = *(sub.get() + ii); } *(data + i) = tmp; } @@ -412,16 +412,23 @@ const ptrarith::Ptr FileStoreTemplate::read(InodeI } template -void FileStoreTemplate::resize() { +ox::Error FileStoreTemplate::resize() { compact(); - m_buffSize = size() - available(); + 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(); + return OxError(0); } template Error FileStoreTemplate::resize(std::size_t size, void *newBuff) { + if (m_buffer->size() > size) { + return OxError(1); + } m_buffSize = size; if (newBuff) { m_buffer = reinterpret_cast(newBuff); + oxReturnError(m_buffer->setSize(size)); } return OxError(0); } @@ -491,6 +498,11 @@ void FileStoreTemplate::compact() { << "Moving Item:" << item->id << "from" << oldAddr << "to" << item.offset(); + // update rootInode if this is it + auto fsData = fileStoreData(); + if (fsData && oldAddr == fsData->rootNode) { + fsData->rootNode = item.offset(); + } auto parent = findParent(rootInode(), item); oxAssert(parent.valid(), "Parent inode not found."); if (parent.valid()) { @@ -683,24 +695,26 @@ typename FileStoreTemplate::ItemPtr FileStoreTemplate::findParen template typename FileStoreTemplate::ItemPtr FileStoreTemplate::find(ItemPtr item, InodeId_t id, int depth) const { - if (depth < 5000) { - if (item.valid()) { - if (id > item->id) { - oxTrace("ox::fs::FileStoreTemplate::find") << "Not a match, searching on" << item->right; - return find(m_buffer->ptr(item->right), id, depth + 1); - } else if (id < item->id) { - oxTrace("ox::fs::FileStoreTemplate::find") << "Not a match, searching on" << item->left; - return find(m_buffer->ptr(item->left), id, depth + 1); - } else if (id == item->id) { - oxTrace("ox::fs::FileStoreTemplate::find") << "Found" << id << "at" << item; - return item; - } - } else { - oxTrace("ox::fs::FileStoreTemplate::find::fail") << "item invalid"; - } - } else { + if (depth > 5000) { oxTrace("ox::fs::FileStoreTemplate::find::fail") << "Excessive recursion depth, stopping before stack overflow. Search for:" << id; + return nullptr; } + if (!item.valid()) { + oxTrace("ox::fs::FileStoreTemplate::find::fail") << "item invalid"; + return nullptr; + } + + if (id > item->id) { + oxTrace("ox::fs::FileStoreTemplate::find") << "Not a match, searching on" << item->right; + return find(m_buffer->ptr(item->right), id, depth + 1); + } else if (id < item->id) { + oxTrace("ox::fs::FileStoreTemplate::find") << "Not a match, searching on" << item->left; + return find(m_buffer->ptr(item->left), id, depth + 1); + } else if (id == item->id) { + oxTrace("ox::fs::FileStoreTemplate::find") << "Found" << id << "at" << item; + return item; + } + return nullptr; }