Fix issue with allocator that caused deallocation to reset the

allocation point
This commit is contained in:
2017-04-25 18:30:29 -05:00
parent b7b5772c34
commit c5410c8755
+26 -25
View File
@@ -487,8 +487,15 @@ int FileStore<Header>::write(InodeId_t id, void *data, typename Header::FsSize_t
auto root = ptr<Inode*>(m_header.getRootInode()); auto root = ptr<Inode*>(m_header.getRootInode());
if (insert(root, inode) || root == inode) { if (insert(root, inode) || root == inode) {
retval = 0; retval = 0;
} else {
dealloc(inode);
retval = 2;
} }
} else {
retval = 3;
} }
} else {
retval = 4;
} }
return retval; return retval;
} }
@@ -504,41 +511,37 @@ int FileStore<Header>::remove(Inode *root, InodeId_t id) {
if (root->getId() > id) { if (root->getId() > id) {
if (root->getLeft()) { if (root->getLeft()) {
auto node = ptr<Inode*>(root->getLeft()); auto left = ptr<Inode*>(root->getLeft());
if (node->getId() != id) { if (left->getId() != id) {
err = remove(node, id); err = remove(left, id);
} else { } else {
root->setLeft(0); root->setLeft(0);
if (node->getRight()) { // pass children to parent
insert(root, ptr<Inode*>(node->getRight())); if (left->getRight()) {
insert(root, ptr<Inode*>(left->getRight()));
} }
if (node->getLeft()) { if (left->getLeft()) {
insert(root, ptr<Inode*>(node->getLeft())); insert(root, ptr<Inode*>(left->getLeft()));
} }
dealloc(node); dealloc(left);
node->setId(0);
node->setLeft(0);
node->setRight(0);
err = 0; err = 0;
} }
} }
} else if (root->getId() < id) { } else if (root->getId() < id) {
if (root->getRight()) { if (root->getRight()) {
auto node = ptr<Inode*>(root->getRight()); auto right = ptr<Inode*>(root->getRight());
if (node->getId() != id) { if (right->getId() != id) {
err = remove(node, id); err = remove(right, id);
} else { } else {
root->setRight(0); root->setRight(0);
if (node->getRight()) { // pass children to parent
insert(root, ptr<Inode*>(node->getRight())); if (right->getRight()) {
insert(root, ptr<Inode*>(right->getRight()));
} }
if (node->getLeft()) { if (right->getLeft()) {
insert(root, ptr<Inode*>(node->getLeft())); insert(root, ptr<Inode*>(right->getLeft()));
} }
dealloc(node); dealloc(right);
node->setId(0);
node->setLeft(0);
node->setRight(0);
err = 0; err = 0;
} }
} }
@@ -548,9 +551,6 @@ int FileStore<Header>::remove(Inode *root, InodeId_t id) {
insert(ptr<Inode*>(m_header.getRootInode()), ptr<Inode*>(root->getLeft())); insert(ptr<Inode*>(m_header.getRootInode()), ptr<Inode*>(root->getLeft()));
} }
dealloc(root); dealloc(root);
root->setId(0);
root->setLeft(0);
root->setRight(0);
err = 0; err = 0;
} }
@@ -717,6 +717,7 @@ void *FileStore<Header>::alloc(typename Header::FsSize_t size) {
inode->setPrev(ptr<Inode*>(firstInode())->getPrev()); inode->setPrev(ptr<Inode*>(firstInode())->getPrev());
inode->setNext(firstInode()); inode->setNext(firstInode());
m_header.setMemUsed(m_header.getMemUsed() + size); m_header.setMemUsed(m_header.getMemUsed() + size);
ptr<Inode*>(lastInode())->setNext(retval);
ptr<Inode*>(firstInode())->setPrev(retval); ptr<Inode*>(firstInode())->setPrev(retval);
return inode; return inode;
} }