diff --git a/VirtualFileSystem/Ext2FileSystem.cpp b/VirtualFileSystem/Ext2FileSystem.cpp index 4ac053f22a..0bf5fa52b7 100644 --- a/VirtualFileSystem/Ext2FileSystem.cpp +++ b/VirtualFileSystem/Ext2FileSystem.cpp @@ -830,7 +830,7 @@ bool Ext2FS::set_block_allocation_state(GroupIndex group, BlockIndex bi, bool ne return true; } -InodeIdentifier Ext2FS::create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, int& error) +RetainPtr Ext2FS::create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, int& error) { ASSERT(parentInode.fsid() == id()); @@ -842,22 +842,22 @@ InodeIdentifier Ext2FS::create_directory(InodeIdentifier parentInode, const Stri // NOTE: When creating a new directory, make the size 1 block. // There's probably a better strategy here, but this works for now. auto inode = create_inode(parentInode, name, mode, blockSize(), error); - if (!inode.is_valid()) + if (!inode) return { }; - dbgprintf("Ext2FS: create_directory: created new directory named '%s' with inode %u\n", name.characters(), inode.index()); + dbgprintf("Ext2FS: create_directory: created new directory named '%s' with inode %u\n", name.characters(), inode->identifier().index()); Vector entries; - entries.append({ ".", inode, EXT2_FT_DIR }); + entries.append({ ".", inode->identifier(), EXT2_FT_DIR }); entries.append({ "..", parentInode, EXT2_FT_DIR }); - bool success = write_directory_inode(inode.index(), move(entries)); + bool success = write_directory_inode(inode->identifier().index(), move(entries)); ASSERT(success); success = modify_link_count(parentInode.index(), 1); ASSERT(success); - auto& bgd = const_cast(group_descriptor(group_index_from_inode(inode.index()))); + auto& bgd = const_cast(group_descriptor(group_index_from_inode(inode->identifier().index()))); ++bgd.bg_used_dirs_count; dbgprintf("Ext2FS: incremented bg_used_dirs_count %u -> %u\n", bgd.bg_used_dirs_count - 1, bgd.bg_used_dirs_count); @@ -869,21 +869,21 @@ InodeIdentifier Ext2FS::create_directory(InodeIdentifier parentInode, const Stri return inode; } -InodeIdentifier Ext2FS::create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, unsigned size, int& error) +RetainPtr Ext2FS::create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, unsigned size, int& error) { ASSERT(parentInode.fsid() == id()); dbgprintf("Ext2FS: Adding inode '%s' (mode %u) to parent directory %u:\n", name.characters(), mode, parentInode.index()); // NOTE: This doesn't commit the inode allocation just yet! - auto inode = allocate_inode(0, 0); - if (!inode) { + auto inode_id = allocate_inode(0, 0); + if (!inode_id) { kprintf("Ext2FS: createInode: allocateInode failed\n"); error = -ENOSPC; return { }; } - auto blocks = allocate_blocks(group_index_from_inode(inode), ceilDiv(size, blockSize())); + auto blocks = allocate_blocks(group_index_from_inode(inode_id), ceilDiv(size, blockSize())); if (blocks.is_empty()) { kprintf("Ext2FS: createInode: allocateBlocks failed\n"); error = -ENOSPC; @@ -907,16 +907,16 @@ InodeIdentifier Ext2FS::create_inode(InodeIdentifier parentInode, const String& fileType = EXT2_FT_SYMLINK; // Try adding it to the directory first, in case the name is already in use. - bool success = add_inode_to_directory(parentInode.index(), inode, name, fileType, error); + bool success = add_inode_to_directory(parentInode.index(), inode_id, name, fileType, error); if (!success) return { }; // Looks like we're good, time to update the inode bitmap and group+global inode counters. - success = set_inode_allocation_state(inode, true); + success = set_inode_allocation_state(inode_id, true); ASSERT(success); for (auto bi : blocks) { - success = set_block_allocation_state(group_index_from_inode(inode), bi, true); + success = set_block_allocation_state(group_index_from_inode(inode_id), bi, true); ASSERT(success); } @@ -949,10 +949,10 @@ InodeIdentifier Ext2FS::create_inode(InodeIdentifier parentInode, const String& } e2inode->i_flags = 0; - success = write_ext2_inode(inode, *e2inode); + success = write_ext2_inode(inode_id, *e2inode); ASSERT(success); - return { id(), inode }; + return get_inode({ id(), inode_id }); } InodeIdentifier Ext2FS::find_parent_of_inode(InodeIdentifier inode_id) const diff --git a/VirtualFileSystem/Ext2FileSystem.h b/VirtualFileSystem/Ext2FileSystem.h index 3442047bff..52c849eebb 100644 --- a/VirtualFileSystem/Ext2FileSystem.h +++ b/VirtualFileSystem/Ext2FileSystem.h @@ -72,8 +72,8 @@ private: virtual const char* class_name() const override; virtual InodeIdentifier root_inode() const override; virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override; - virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override; - virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override; + virtual RetainPtr create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override; + virtual RetainPtr create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override; virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override; virtual RetainPtr get_inode(InodeIdentifier) const override; diff --git a/VirtualFileSystem/FileSystem.h b/VirtualFileSystem/FileSystem.h index 73d53f1932..cd5958885c 100644 --- a/VirtualFileSystem/FileSystem.h +++ b/VirtualFileSystem/FileSystem.h @@ -44,8 +44,8 @@ public: byte fileType { 0 }; }; - virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) = 0; - virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) = 0; + virtual RetainPtr create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) = 0; + virtual RetainPtr create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) = 0; virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const = 0; diff --git a/VirtualFileSystem/SyntheticFileSystem.cpp b/VirtualFileSystem/SyntheticFileSystem.cpp index 10854a3e29..0f6d0d0e69 100644 --- a/VirtualFileSystem/SyntheticFileSystem.cpp +++ b/VirtualFileSystem/SyntheticFileSystem.cpp @@ -132,7 +132,7 @@ InodeIdentifier SynthFS::root_inode() const return { id(), 1 }; } -InodeIdentifier SynthFS::create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, unsigned size, int& error) +RetainPtr SynthFS::create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t mode, unsigned size, int& error) { (void) parentInode; (void) name; @@ -149,10 +149,10 @@ bool SynthFS::write_inode(InodeIdentifier, const ByteBuffer&) return false; } -InodeIdentifier SynthFS::create_directory(InodeIdentifier, const String&, Unix::mode_t, int& error) +RetainPtr SynthFS::create_directory(InodeIdentifier, const String&, Unix::mode_t, int& error) { error = -EROFS; - return { }; + return nullptr; } auto SynthFS::generate_inode_index() -> InodeIndex diff --git a/VirtualFileSystem/SyntheticFileSystem.h b/VirtualFileSystem/SyntheticFileSystem.h index 50cda6babc..4f69a9333d 100644 --- a/VirtualFileSystem/SyntheticFileSystem.h +++ b/VirtualFileSystem/SyntheticFileSystem.h @@ -15,8 +15,8 @@ public: virtual const char* class_name() const override; virtual InodeIdentifier root_inode() const override; virtual bool write_inode(InodeIdentifier, const ByteBuffer&) override; - virtual InodeIdentifier create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override; - virtual InodeIdentifier create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override; + virtual RetainPtr create_inode(InodeIdentifier parentInode, const String& name, Unix::mode_t, unsigned size, int& error) override; + virtual RetainPtr create_directory(InodeIdentifier parentInode, const String& name, Unix::mode_t, int& error) override; virtual InodeIdentifier find_parent_of_inode(InodeIdentifier) const override; virtual RetainPtr get_inode(InodeIdentifier) const override; diff --git a/VirtualFileSystem/VirtualFileSystem.cpp b/VirtualFileSystem/VirtualFileSystem.cpp index 4ec9829b54..b14eb34ca1 100644 --- a/VirtualFileSystem/VirtualFileSystem.cpp +++ b/VirtualFileSystem/VirtualFileSystem.cpp @@ -306,7 +306,7 @@ bool VFS::mkdir(const String& path, mode_t mode, InodeIdentifier base, int& erro } dbgprintf("VFS::mkdir: '%s' in %u:%u\n", p.basename().characters(), parent_dir.fsid(), parent_dir.index()); auto new_dir = base.fs()->create_directory(parent_dir, p.basename(), mode, error); - if (new_dir.is_valid()) { + if (new_dir) { error = 0; return true; }