Encapsulate FileStoreHeader members
This commit is contained in:
+106
-38
@@ -14,17 +14,85 @@ namespace fs {
|
|||||||
|
|
||||||
template<typename FsT, typename InodeId>
|
template<typename FsT, typename InodeId>
|
||||||
struct FileStoreHeader {
|
struct FileStoreHeader {
|
||||||
typedef InodeId InodeId_t;
|
public:
|
||||||
typedef FsT FsSize_t;
|
typedef InodeId InodeId_t;
|
||||||
const static auto VERSION = 4;
|
typedef FsT FsSize_t;
|
||||||
|
const static auto VERSION = 4;
|
||||||
|
|
||||||
uint16_t version;
|
private:
|
||||||
uint16_t fsType;
|
uint16_t m_version;
|
||||||
FsSize_t size;
|
uint16_t m_fsType;
|
||||||
FsSize_t memUsed;
|
FsSize_t m_size;
|
||||||
FsSize_t rootInode;
|
FsSize_t m_memUsed;
|
||||||
|
FsSize_t m_rootInode;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void setVersion(uint16_t);
|
||||||
|
uint16_t getVersion();
|
||||||
|
|
||||||
|
void setFsType(uint16_t);
|
||||||
|
uint16_t getFsType();
|
||||||
|
|
||||||
|
void setSize(FsSize_t);
|
||||||
|
FsSize_t getSize();
|
||||||
|
|
||||||
|
void setMemUsed(FsSize_t);
|
||||||
|
FsSize_t getMemUsed();
|
||||||
|
|
||||||
|
void setRootInode(FsSize_t);
|
||||||
|
FsSize_t getRootInode();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
void FileStoreHeader<FsSize_t, InodeId_t>::setVersion(uint16_t version) {
|
||||||
|
m_version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
uint16_t FileStoreHeader<FsSize_t, InodeId_t>::getVersion() {
|
||||||
|
return m_version;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
void FileStoreHeader<FsSize_t, InodeId_t>::setFsType(uint16_t fsType) {
|
||||||
|
m_fsType = fsType;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
uint16_t FileStoreHeader<FsSize_t, InodeId_t>::getFsType() {
|
||||||
|
return m_fsType;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
void FileStoreHeader<FsSize_t, InodeId_t>::setSize(FsSize_t size) {
|
||||||
|
m_size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getSize() {
|
||||||
|
return m_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
void FileStoreHeader<FsSize_t, InodeId_t>::setMemUsed(FsSize_t memUsed) {
|
||||||
|
m_memUsed = memUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getMemUsed() {
|
||||||
|
return m_memUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
void FileStoreHeader<FsSize_t, InodeId_t>::setRootInode(FsSize_t rootInode) {
|
||||||
|
m_rootInode = rootInode;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename FsSize_t, typename InodeId_t>
|
||||||
|
FsSize_t FileStoreHeader<FsSize_t, InodeId_t>::getRootInode() {
|
||||||
|
return m_rootInode;
|
||||||
|
}
|
||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
class FileStore {
|
class FileStore {
|
||||||
|
|
||||||
@@ -205,7 +273,7 @@ class FileStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *end() {
|
uint8_t *end() {
|
||||||
return begin() + this->m_header.size;
|
return begin() + this->m_header.getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -264,16 +332,16 @@ int FileStore<Header>::dumpTo(FileStore<Header> *dest) {
|
|||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
void FileStore<Header>::resize(typename Header::FsSize_t size) {
|
void FileStore<Header>::resize(typename Header::FsSize_t size) {
|
||||||
if (size < m_header.size) {
|
if (size < m_header.getSize()) {
|
||||||
// shrink file store
|
// shrink file store
|
||||||
if (m_header.memUsed > size) {
|
if (m_header.getMemUsed() > size) {
|
||||||
size = m_header.memUsed;
|
size = m_header.getMemUsed();
|
||||||
}
|
}
|
||||||
compact();
|
compact();
|
||||||
m_header.size = size;
|
m_header.setSize(size);
|
||||||
} else if (size > m_header.size) {
|
} else if (size > m_header.getSize()) {
|
||||||
// grow file store
|
// grow file store
|
||||||
m_header.size = size;
|
m_header.setSize(size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,14 +349,14 @@ template<typename Header>
|
|||||||
int FileStore<Header>::write(InodeId_t id, void *data, typename Header::FsSize_t dataLen, uint8_t fileType) {
|
int FileStore<Header>::write(InodeId_t id, void *data, typename Header::FsSize_t dataLen, uint8_t fileType) {
|
||||||
auto retval = 1;
|
auto retval = 1;
|
||||||
const typename Header::FsSize_t size = sizeof(Inode) + dataLen;
|
const typename Header::FsSize_t size = sizeof(Inode) + dataLen;
|
||||||
if (size <= (m_header.size - m_header.memUsed)) {
|
if (size <= (m_header.getSize() - m_header.getMemUsed())) {
|
||||||
auto inode = (Inode*) alloc(size);
|
auto inode = (Inode*) alloc(size);
|
||||||
if (inode) {
|
if (inode) {
|
||||||
remove(id);
|
remove(id);
|
||||||
inode->id = id;
|
inode->id = id;
|
||||||
inode->fileType = fileType;
|
inode->fileType = fileType;
|
||||||
inode->setData(data, dataLen);
|
inode->setData(data, dataLen);
|
||||||
auto root = ptr<Inode*>(m_header.rootInode);
|
auto root = ptr<Inode*>(m_header.getRootInode());
|
||||||
if (insert(root, inode) || root == inode) {
|
if (insert(root, inode) || root == inode) {
|
||||||
retval = 0;
|
retval = 0;
|
||||||
}
|
}
|
||||||
@@ -299,7 +367,7 @@ int FileStore<Header>::write(InodeId_t id, void *data, typename Header::FsSize_t
|
|||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
int FileStore<Header>::remove(InodeId_t id) {
|
int FileStore<Header>::remove(InodeId_t id) {
|
||||||
return remove(ptr<Inode*>(m_header.rootInode), id);
|
return remove(ptr<Inode*>(m_header.getRootInode()), id);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
@@ -346,10 +414,10 @@ int FileStore<Header>::remove(Inode *root, InodeId_t id) {
|
|||||||
err = 0;
|
err = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (ptr<Inode*>(m_header.rootInode)->id == id) {
|
} else if (ptr<Inode*>(m_header.getRootInode())->id == id) {
|
||||||
m_header.rootInode = root->right;
|
m_header.setRootInode(root->right);
|
||||||
if (root->left) {
|
if (root->left) {
|
||||||
insert(ptr<Inode*>(m_header.rootInode), ptr<Inode*>(root->left));
|
insert(ptr<Inode*>(m_header.getRootInode()), ptr<Inode*>(root->left));
|
||||||
}
|
}
|
||||||
dealloc(root);
|
dealloc(root);
|
||||||
root->id = 0;
|
root->id = 0;
|
||||||
@@ -368,14 +436,14 @@ void FileStore<Header>::dealloc(Inode *inode) {
|
|||||||
prev->next = ptr(next);
|
prev->next = ptr(next);
|
||||||
next->prev = ptr(prev);
|
next->prev = ptr(prev);
|
||||||
|
|
||||||
m_header.memUsed -= inode->size();
|
m_header.setMemUsed(m_header.getMemUsed() - inode->size());
|
||||||
|
|
||||||
ox_memset(inode, 0, inode->size());
|
ox_memset(inode, 0, inode->size());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
void FileStore<Header>::updateInodeAddress(InodeId_t id, typename Header::FsSize_t oldAddr, typename Header::FsSize_t newAddr) {
|
void FileStore<Header>::updateInodeAddress(InodeId_t id, typename Header::FsSize_t oldAddr, typename Header::FsSize_t newAddr) {
|
||||||
auto parent = getInodeParent(ptr<Inode*>(m_header.rootInode), id, oldAddr);
|
auto parent = getInodeParent(ptr<Inode*>(m_header.getRootInode()), id, oldAddr);
|
||||||
if (parent) {
|
if (parent) {
|
||||||
if (parent->left == oldAddr) {
|
if (parent->left == oldAddr) {
|
||||||
parent->left = newAddr;
|
parent->left = newAddr;
|
||||||
@@ -387,7 +455,7 @@ void FileStore<Header>::updateInodeAddress(InodeId_t id, typename Header::FsSize
|
|||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
int FileStore<Header>::read(InodeId_t id, void *data, typename Header::FsSize_t *size) {
|
int FileStore<Header>::read(InodeId_t id, void *data, typename Header::FsSize_t *size) {
|
||||||
auto inode = getInode(ptr<Inode*>(m_header.rootInode), id);
|
auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id);
|
||||||
int retval = 1;
|
int retval = 1;
|
||||||
if (inode) {
|
if (inode) {
|
||||||
if (size) {
|
if (size) {
|
||||||
@@ -401,7 +469,7 @@ int FileStore<Header>::read(InodeId_t id, void *data, typename Header::FsSize_t
|
|||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
typename FileStore<Header>::StatInfo FileStore<Header>::stat(InodeId_t id) {
|
typename FileStore<Header>::StatInfo FileStore<Header>::stat(InodeId_t id) {
|
||||||
auto inode = getInode(ptr<Inode*>(m_header.rootInode), id);
|
auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id);
|
||||||
StatInfo stat;
|
StatInfo stat;
|
||||||
if (inode) {
|
if (inode) {
|
||||||
stat.size = inode->dataLen;
|
stat.size = inode->dataLen;
|
||||||
@@ -416,7 +484,7 @@ typename FileStore<Header>::StatInfo FileStore<Header>::stat(InodeId_t id) {
|
|||||||
template<typename Header>
|
template<typename Header>
|
||||||
typename Header::FsSize_t FileStore<Header>::spaceNeeded(InodeId_t id, typename Header::FsSize_t size) {
|
typename Header::FsSize_t FileStore<Header>::spaceNeeded(InodeId_t id, typename Header::FsSize_t size) {
|
||||||
typename Header::FsSize_t needed = sizeof(Inode) + size;;
|
typename Header::FsSize_t needed = sizeof(Inode) + size;;
|
||||||
auto inode = getInode(ptr<Inode*>(m_header.rootInode), id);
|
auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id);
|
||||||
if (inode) {
|
if (inode) {
|
||||||
needed -= inode->size();
|
needed -= inode->size();
|
||||||
}
|
}
|
||||||
@@ -425,12 +493,12 @@ typename Header::FsSize_t FileStore<Header>::spaceNeeded(InodeId_t id, typename
|
|||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
typename Header::FsSize_t FileStore<Header>::size() {
|
typename Header::FsSize_t FileStore<Header>::size() {
|
||||||
return m_header.size;
|
return m_header.getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
typename Header::FsSize_t FileStore<Header>::available() {
|
typename Header::FsSize_t FileStore<Header>::available() {
|
||||||
return m_header.size - m_header.memUsed;
|
return m_header.getSize() - m_header.getMemUsed();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
@@ -499,7 +567,7 @@ void *FileStore<Header>::alloc(typename Header::FsSize_t size) {
|
|||||||
ox_memset(inode, 0, size);
|
ox_memset(inode, 0, size);
|
||||||
inode->prev = ptr<Inode*>(firstInode())->prev;
|
inode->prev = ptr<Inode*>(firstInode())->prev;
|
||||||
inode->next = retval + size;
|
inode->next = retval + size;
|
||||||
m_header.memUsed += size;
|
m_header.setMemUsed(m_header.getMemUsed() + size);
|
||||||
ptr<Inode*>(firstInode())->prev = retval;
|
ptr<Inode*>(firstInode())->prev = retval;
|
||||||
return inode;
|
return inode;
|
||||||
}
|
}
|
||||||
@@ -538,8 +606,8 @@ bool FileStore<Header>::insert(Inode *root, Inode *insertValue) {
|
|||||||
root->right = ptr(insertValue);
|
root->right = ptr(insertValue);
|
||||||
retval = true;
|
retval = true;
|
||||||
}
|
}
|
||||||
} else if (m_header.rootInode == 0) {
|
} else if (m_header.getRootInode() == 0) {
|
||||||
m_header.rootInode = ptr(insertValue);
|
m_header.setRootInode(ptr(insertValue));
|
||||||
retval = true;
|
retval = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,12 +642,12 @@ typename FileStore<Header>::Inode *FileStore<Header>::lastInode() {
|
|||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
uint16_t FileStore<Header>::fsType() {
|
uint16_t FileStore<Header>::fsType() {
|
||||||
return m_header.fsType;
|
return m_header.getFsType();
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
uint16_t FileStore<Header>::version() {
|
uint16_t FileStore<Header>::version() {
|
||||||
return m_header.version;
|
return m_header.getVersion();
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Header>
|
template<typename Header>
|
||||||
@@ -587,11 +655,11 @@ uint8_t *FileStore<Header>::format(uint8_t *buffer, typename Header::FsSize_t si
|
|||||||
ox_memset(buffer, 0, size);
|
ox_memset(buffer, 0, size);
|
||||||
|
|
||||||
auto *fs = (FileStore*) buffer;
|
auto *fs = (FileStore*) buffer;
|
||||||
fs->m_header.fsType = fsType;
|
fs->m_header.setFsType(fsType);
|
||||||
fs->m_header.version = Header::VERSION;
|
fs->m_header.setVersion(Header::VERSION);
|
||||||
fs->m_header.size = size;
|
fs->m_header.setSize(size);
|
||||||
fs->m_header.memUsed = sizeof(FileStore<Header>) + sizeof(Inode);
|
fs->m_header.setMemUsed(sizeof(FileStore<Header>) + sizeof(Inode));
|
||||||
fs->m_header.rootInode = sizeof(FileStore<Header>);
|
fs->m_header.setRootInode(sizeof(FileStore<Header>));
|
||||||
((Inode*) (fs + 1))->prev = sizeof(FileStore<Header>);
|
((Inode*) (fs + 1))->prev = sizeof(FileStore<Header>);
|
||||||
fs->lastInode()->next = sizeof(FileStore<Header>);
|
fs->lastInode()->next = sizeof(FileStore<Header>);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user