Fix new FileStore to correctly initialize the first item
This commit is contained in:
		@@ -24,6 +24,13 @@ struct __attribute__((packed)) FileStoreItem: public Item<size_t> {
 | 
			
		||||
	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() {
 | 
			
		||||
		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);
 | 
			
		||||
			dest->id = id;
 | 
			
		||||
			dest->fileType = fileType;
 | 
			
		||||
			ox_memcpy(dest->data(), data, dest->size());
 | 
			
		||||
			auto root = rootInode();
 | 
			
		||||
			if (root.valid()) {
 | 
			
		||||
				return placeItem(root, dest);
 | 
			
		||||
			} else {
 | 
			
		||||
			auto destData = dest->data();
 | 
			
		||||
			if (destData.valid()) {
 | 
			
		||||
				ox_memcpy(destData, data, dest->size());
 | 
			
		||||
				auto fsData = fileStoreData();
 | 
			
		||||
				if (fsData) {
 | 
			
		||||
					fsData->rootNode = dest;
 | 
			
		||||
					return 0;
 | 
			
		||||
					auto root = m_buffer->ptr(fsData->rootNode);
 | 
			
		||||
					if (root.valid()) {
 | 
			
		||||
						return placeItem(root, dest);
 | 
			
		||||
					} else {
 | 
			
		||||
						fsData->rootNode = dest;
 | 
			
		||||
						return 0;
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					m_buffer->free(dest);
 | 
			
		||||
					oxTrace("ox::fs::FileStoreTemplate::write::fail") << "Could not place item due to absence of FileStore header.";
 | 
			
		||||
					return 1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		m_buffer->free(dest);
 | 
			
		||||
	}
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								deps/ox/src/ox/fs/filestore/nodebuffer.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								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>
 | 
			
		||||
typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::malloc(size_t size) {
 | 
			
		||||
	size += sizeof(Item);
 | 
			
		||||
	if (m_header.size - m_header.bytesUsed >= size) {
 | 
			
		||||
		if (!m_header.firstItem) {
 | 
			
		||||
			m_header.firstItem = sizeof(m_header);
 | 
			
		||||
	auto fullSize = size + sizeof(Item);
 | 
			
		||||
	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) {
 | 
			
		||||
				oxTrace("ox::fs::NodeBuffer::malloc") << "No first item.";
 | 
			
		||||
				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()) {
 | 
			
		||||
			new (out) Item(size);
 | 
			
		||||
 | 
			
		||||
@@ -261,13 +270,6 @@ struct __attribute__((packed)) Item {
 | 
			
		||||
		size_t size() const {
 | 
			
		||||
			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];
 | 
			
		||||
				auto list = new (buff) ox::fs::NodeBuffer<uint32_t, ox::fs::FileStoreItem<uint32_t>>(buffLen);
 | 
			
		||||
				err |= !(list->malloc(50).valid());
 | 
			
		||||
				//auto first = list->firstItem();
 | 
			
		||||
				//err |= !(first.valid());
 | 
			
		||||
				//err |= !(first->size() == 50);
 | 
			
		||||
				auto first = list->firstItem();
 | 
			
		||||
				ox_assert(first.valid(), "NodeBuffer::insert: Could not access first item");
 | 
			
		||||
				ox_assert(first->size() == 50, "NodeBuffer::insert: First item size invalid");
 | 
			
		||||
				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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user