diff options
Diffstat (limited to 'Kernel/FileSystem/VirtualFileSystem.cpp')
-rw-r--r-- | Kernel/FileSystem/VirtualFileSystem.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index e5f6ad5116..c977c03932 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -48,6 +48,8 @@ bool VFS::mount(Retained<FS>&& file_system, StringView path) // FIXME: check that this is not already a mount point auto mount = make<Mount>(*result.value(), move(file_system)); m_mounts.append(move(mount)); + + result.value()->did_mount_on({}); return true; } @@ -368,6 +370,8 @@ KResult VFS::rename(StringView old_path, StringView new_path, Custody& base) return KResult(-EACCES); } + auto new_basename = FileSystemPath(new_path).basename(); + if (!new_custody_or_error.is_error()) { auto& new_custody = *new_custody_or_error.value(); auto& new_inode = new_custody.inode(); @@ -380,18 +384,20 @@ KResult VFS::rename(StringView old_path, StringView new_path, Custody& base) } if (new_inode.is_directory() && !old_inode.is_directory()) return KResult(-EISDIR); - auto result = new_parent_inode.remove_child(FileSystemPath(new_path).basename()); + auto result = new_parent_inode.remove_child(new_basename); if (result.is_error()) return result; + new_custody.did_delete({}); } - auto result = new_parent_inode.add_child(old_inode.identifier(), FileSystemPath(new_path).basename(), 0 /* FIXME: file type? */); + auto result = new_parent_inode.add_child(old_inode.identifier(), new_basename, 0 /* FIXME: file type? */); if (result.is_error()) return result; result = old_parent_inode.remove_child(FileSystemPath(old_path).basename()); if (result.is_error()) return result; + old_custody.did_rename({}, new_basename); return KSuccess; } @@ -479,7 +485,12 @@ KResult VFS::unlink(StringView path, Custody& base) return KResult(-EACCES); } - return parent_inode.remove_child(FileSystemPath(path).basename()); + auto result = parent_inode.remove_child(FileSystemPath(path).basename()); + if (result.is_error()) + return result; + + custody.did_delete({}); + return KSuccess; } KResult VFS::symlink(StringView target, StringView linkpath, Custody& base) @@ -662,7 +673,7 @@ KResultOr<Retained<Custody>> VFS::resolve_path_to_custody(StringView path, Custo crumb_inode = get_inode(crumb_id); ASSERT(crumb_inode); - custody_chain.append(Custody::create(custody_chain.last().ptr(), part, *crumb_inode)); + custody_chain.append(Custody::get_or_create(custody_chain.last().ptr(), part, *crumb_inode)); metadata = crumb_inode->metadata(); if (metadata.is_directory()) { |