Fix write-expand to factor in the space needed for the inode header

This commit is contained in:
2017-04-08 18:50:24 -05:00
parent b1e1e764a9
commit 361ee79c41
4 changed files with 30 additions and 3 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ endif()
if(NOT MSVC)
add_definitions(
-std=c++11
-std=c++14
-Wall
-nostdlib
-fno-exceptions
+18
View File
@@ -94,6 +94,14 @@ class FileStore {
*/
StatInfo stat(InodeId_t id);
/**
* Returns the space needed for this data at the given inode address.
* @param id the target inode id
* @param size the size of the data to insert
* @return the space currently available in this file store.
*/
FsSize_t spaceNeeded(InodeId_t id, FsSize_t size);
/**
* Returns the size of the file store.
* @return the size of the file store.
@@ -396,6 +404,16 @@ typename FileStore<FsSize_t>::StatInfo FileStore<FsSize_t>::stat(InodeId_t id) {
return stat;
}
template<typename FsSize_t>
FsSize_t FileStore<FsSize_t>::spaceNeeded(InodeId_t id, FsSize_t size) {
FsSize_t needed = sizeof(Inode) + size;;
auto inode = getInode(ptr<Inode*>(m_rootInode), id);
if (inode) {
needed -= inode->size();
}
return needed;
}
template<typename FsSize_t>
FsSize_t FileStore<FsSize_t>::size() {
return m_size;
+9
View File
@@ -46,6 +46,8 @@ class FileSystem {
virtual FileStat stat(uint64_t inode) = 0;
virtual uint64_t spaceNeeded(uint64_t id, uint64_t size) = 0;
virtual uint64_t available() = 0;
virtual uint64_t size() = 0;
@@ -109,6 +111,8 @@ class FileSystemTemplate: public FileSystem {
FileStat stat(uint64_t inode) override;
uint64_t spaceNeeded(uint64_t id, uint64_t size) override;
uint64_t available() override;
uint64_t size() override;
@@ -214,6 +218,11 @@ void FileSystemTemplate<FileStore, FS_TYPE>::resize(uint64_t size) {
return store->resize(size);
}
template<typename FileStore, FsType FS_TYPE>
uint64_t FileSystemTemplate<FileStore, FS_TYPE>::spaceNeeded(uint64_t id, uint64_t size) {
return store->spaceNeeded(id, size);
}
template<typename FileStore, FsType FS_TYPE>
uint64_t FileSystemTemplate<FileStore, FS_TYPE>::available() {
return store->available();
+2 -2
View File
@@ -20,7 +20,7 @@
using namespace ox::fs;
using namespace std;
const static auto oxfstoolVersion = "1.1.0";
const static auto oxfstoolVersion = "1.1.1";
const static auto usage = "usage:\n"
"\toxfs format [16,32,64] <size> <path>\n"
"\toxfs read <FS file> <inode>\n"
@@ -198,7 +198,7 @@ int write(int argc, char **args, bool expand) {
auto fs = createFileSystem(fsBuff);
if (fs) {
if (expand && fs->available() <= srcSize) {
auto needed = (fs->size() - fs->available()) + fsSize;
auto needed = fs->spaceNeeded(inode, srcSize);
auto cloneBuff = new uint8_t[needed];
ox_memcpy(cloneBuff, fsBuff, fsSize);