Fix new FileStore to correctly initialize the first item
This commit is contained in:
parent
ccf308d022
commit
080ca9df86
@ -24,6 +24,13 @@ struct __attribute__((packed)) FileStoreItem: public Item<size_t> {
|
|||||||
explicit FileStoreItem(size_t size): Item<size_t>(size) {
|
explicit FileStoreItem(size_t size): Item<size_t>(size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the size of the data + the size of the Item type
|
||||||
|
*/
|
||||||
|
size_t fullSize() const {
|
||||||
|
return sizeof(*this) + this->size();
|
||||||
|
}
|
||||||
|
|
||||||
ox::fs::Ptr<uint8_t, size_t> data() {
|
ox::fs::Ptr<uint8_t, size_t> data() {
|
||||||
return Ptr<uint8_t, size_t>(this, this->size(), sizeof(*this), this->size() - sizeof(*this));
|
return Ptr<uint8_t, size_t>(this, this->size(), sizeof(*this), this->size() - sizeof(*this));
|
||||||
}
|
}
|
||||||
@ -169,22 +176,24 @@ Error FileStoreTemplate<size_t>::write(InodeId_t id, void *data, FsSize_t dataSi
|
|||||||
new (dest) FileStoreItem<size_t>(dataSize);
|
new (dest) FileStoreItem<size_t>(dataSize);
|
||||||
dest->id = id;
|
dest->id = id;
|
||||||
dest->fileType = fileType;
|
dest->fileType = fileType;
|
||||||
ox_memcpy(dest->data(), data, dest->size());
|
auto destData = dest->data();
|
||||||
auto root = rootInode();
|
if (destData.valid()) {
|
||||||
|
ox_memcpy(destData, data, dest->size());
|
||||||
|
auto fsData = fileStoreData();
|
||||||
|
if (fsData) {
|
||||||
|
auto root = m_buffer->ptr(fsData->rootNode);
|
||||||
if (root.valid()) {
|
if (root.valid()) {
|
||||||
return placeItem(root, dest);
|
return placeItem(root, dest);
|
||||||
} else {
|
} else {
|
||||||
auto fsData = fileStoreData();
|
|
||||||
if (fsData) {
|
|
||||||
fsData->rootNode = dest;
|
fsData->rootNode = dest;
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
m_buffer->free(dest);
|
|
||||||
oxTrace("ox::fs::FileStoreTemplate::write::fail") << "Could not place item due to absence of FileStore header.";
|
oxTrace("ox::fs::FileStoreTemplate::write::fail") << "Could not place item due to absence of FileStore header.";
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
m_buffer->free(dest);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
22
deps/ox/src/ox/fs/filestore/nodebuffer.hpp
vendored
22
deps/ox/src/ox/fs/filestore/nodebuffer.hpp
vendored
@ -132,12 +132,21 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::ptr(size_t
|
|||||||
|
|
||||||
template<typename size_t, typename Item>
|
template<typename size_t, typename Item>
|
||||||
typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size_t size) {
|
typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size_t size) {
|
||||||
size += sizeof(Item);
|
auto fullSize = size + sizeof(Item);
|
||||||
if (m_header.size - m_header.bytesUsed >= size) {
|
if (m_header.size - m_header.bytesUsed >= fullSize) {
|
||||||
|
auto last = lastItem();
|
||||||
|
size_t addr = 0;
|
||||||
|
if (last.valid()) {
|
||||||
|
addr = last.offset() + last.size();
|
||||||
|
} else {
|
||||||
|
// there is no first item, so this may be the first item
|
||||||
if (!m_header.firstItem) {
|
if (!m_header.firstItem) {
|
||||||
|
oxTrace("ox::fs::NodeBuffer::malloc") << "No first item.";
|
||||||
m_header.firstItem = sizeof(m_header);
|
m_header.firstItem = sizeof(m_header);
|
||||||
|
addr = m_header.firstItem;
|
||||||
}
|
}
|
||||||
auto out = ItemPtr(this, m_header.size, m_header.firstItem, size);
|
}
|
||||||
|
auto out = ItemPtr(this, m_header.size, addr, fullSize);
|
||||||
if (out.valid()) {
|
if (out.valid()) {
|
||||||
new (out) Item(size);
|
new (out) Item(size);
|
||||||
|
|
||||||
@ -261,13 +270,6 @@ struct __attribute__((packed)) Item {
|
|||||||
size_t size() const {
|
size_t size() const {
|
||||||
return m_size;
|
return m_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the size of the data + the size of the Item type
|
|
||||||
*/
|
|
||||||
size_t fullSize() const {
|
|
||||||
return sizeof(*this) + m_size;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
6
deps/ox/src/ox/fs/test/tests.cpp
vendored
6
deps/ox/src/ox/fs/test/tests.cpp
vendored
@ -340,9 +340,9 @@ map<string, int(*)(string)> tests = {
|
|||||||
uint8_t buff[buffLen];
|
uint8_t buff[buffLen];
|
||||||
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
|
||||||
err |= !(list->malloc(50).valid());
|
err |= !(list->malloc(50).valid());
|
||||||
//auto first = list->firstItem();
|
auto first = list->firstItem();
|
||||||
//err |= !(first.valid());
|
ox_assert(first.valid(), "NodeBuffer::insert: Could not access first item");
|
||||||
//err |= !(first->size() == 50);
|
ox_assert(first->size() == 50, "NodeBuffer::insert: First item size invalid");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
2
deps/ox/src/ox/trace/trace.hpp
vendored
2
deps/ox/src/ox/trace/trace.hpp
vendored
@ -93,4 +93,4 @@ class NullStream {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define oxTrace(ch) ox::trace::StdOutStream(__FILE__, __LINE__, ch)
|
#define oxTrace(ch) ox::trace::NullStream(__FILE__, __LINE__, ch)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user