mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 08:18:11 +00:00
Kernel: Use KResult in link().
This commit is contained in:
parent
5b27f11b97
commit
60d0a48be5
10 changed files with 41 additions and 54 deletions
|
@ -613,7 +613,7 @@ bool Ext2FSInode::traverse_as_directory(Function<bool(const FS::DirectoryEntry&)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Ext2FSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error)
|
KResult Ext2FSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type)
|
||||||
{
|
{
|
||||||
LOCKER(m_lock);
|
LOCKER(m_lock);
|
||||||
ASSERT(is_directory());
|
ASSERT(is_directory());
|
||||||
|
@ -634,8 +634,7 @@ bool Ext2FSInode::add_child(InodeIdentifier child_id, const String& name, byte f
|
||||||
});
|
});
|
||||||
if (name_already_exists) {
|
if (name_already_exists) {
|
||||||
kprintf("Ext2FS: Name '%s' already exists in directory inode %u\n", name.characters(), index());
|
kprintf("Ext2FS: Name '%s' already exists in directory inode %u\n", name.characters(), index());
|
||||||
error = -EEXIST;
|
return KResult(-EEXIST);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto child_inode = fs().get_inode(child_id);
|
auto child_inode = fs().get_inode(child_id);
|
||||||
|
@ -646,7 +645,7 @@ bool Ext2FSInode::add_child(InodeIdentifier child_id, const String& name, byte f
|
||||||
bool success = fs().write_directory_inode(index(), move(entries));
|
bool success = fs().write_directory_inode(index(), move(entries));
|
||||||
if (success)
|
if (success)
|
||||||
m_lookup_cache.set(name, child_id.index());
|
m_lookup_cache.set(name, child_id.index());
|
||||||
return success;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Ext2FSInode::remove_child(const String& name)
|
KResult Ext2FSInode::remove_child(const String& name)
|
||||||
|
@ -1139,12 +1138,14 @@ RetainPtr<Inode> Ext2FS::create_inode(InodeIdentifier parent_id, const String& n
|
||||||
file_type = EXT2_FT_SYMLINK;
|
file_type = EXT2_FT_SYMLINK;
|
||||||
|
|
||||||
// Try adding it to the directory first, in case the name is already in use.
|
// Try adding it to the directory first, in case the name is already in use.
|
||||||
bool success = parent_inode->add_child({ fsid(), inode_id }, name, file_type, error);
|
auto result = parent_inode->add_child({ fsid(), inode_id }, name, file_type);
|
||||||
if (!success)
|
if (result.is_error()) {
|
||||||
|
error = result;
|
||||||
return { };
|
return { };
|
||||||
|
}
|
||||||
|
|
||||||
// Looks like we're good, time to update the inode bitmap and group+global inode counters.
|
// Looks like we're good, time to update the inode bitmap and group+global inode counters.
|
||||||
success = set_inode_allocation_state(inode_id, true);
|
bool success = set_inode_allocation_state(inode_id, true);
|
||||||
ASSERT(success);
|
ASSERT(success);
|
||||||
|
|
||||||
for (auto block_index : blocks) {
|
for (auto block_index : blocks) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ private:
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) override;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) override;
|
||||||
virtual bool add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error) override;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) override;
|
||||||
virtual KResult remove_child(const String& name) override;
|
virtual KResult remove_child(const String& name) override;
|
||||||
virtual RetainPtr<Inode> parent() const override;
|
virtual RetainPtr<Inode> parent() const override;
|
||||||
virtual int set_atime(time_t) override;
|
virtual int set_atime(time_t) override;
|
||||||
|
|
|
@ -93,7 +93,7 @@ public:
|
||||||
virtual InodeIdentifier lookup(const String& name) = 0;
|
virtual InodeIdentifier lookup(const String& name) = 0;
|
||||||
virtual String reverse_lookup(InodeIdentifier) = 0;
|
virtual String reverse_lookup(InodeIdentifier) = 0;
|
||||||
virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) = 0;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* data, FileDescriptor*) = 0;
|
||||||
virtual bool add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error) = 0;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) = 0;
|
||||||
virtual KResult remove_child(const String& name) = 0;
|
virtual KResult remove_child(const String& name) = 0;
|
||||||
virtual RetainPtr<Inode> parent() const = 0;
|
virtual RetainPtr<Inode> parent() const = 0;
|
||||||
virtual size_t directory_entry_count() const = 0;
|
virtual size_t directory_entry_count() const = 0;
|
||||||
|
|
|
@ -1047,13 +1047,12 @@ ssize_t ProcFSInode::write_bytes(off_t offset, ssize_t size, const byte* buffer,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ProcFSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error)
|
KResult ProcFSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type)
|
||||||
{
|
{
|
||||||
(void)child_id;
|
(void)child_id;
|
||||||
(void)name;
|
(void)name;
|
||||||
(void)file_type;
|
(void)file_type;
|
||||||
error = -EPERM;
|
return KResult(-EPERM);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult ProcFSInode::remove_child(const String& name)
|
KResult ProcFSInode::remove_child(const String& name)
|
||||||
|
|
|
@ -83,7 +83,7 @@ private:
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
||||||
virtual bool add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error) override;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) override;
|
||||||
virtual KResult remove_child(const String& name) override;
|
virtual KResult remove_child(const String& name) override;
|
||||||
virtual RetainPtr<Inode> parent() const override;
|
virtual RetainPtr<Inode> parent() const override;
|
||||||
virtual size_t directory_entry_count() const override;
|
virtual size_t directory_entry_count() const override;
|
||||||
|
|
|
@ -2119,10 +2119,7 @@ int Process::sys$link(const char* old_path, const char* new_path)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!validate_read_str(new_path))
|
if (!validate_read_str(new_path))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
int error;
|
return VFS::the().link(String(old_path), String(new_path), cwd_inode());
|
||||||
if (!VFS::the().link(String(old_path), String(new_path), cwd_inode(), error))
|
|
||||||
return error;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::sys$unlink(const char* pathname)
|
int Process::sys$unlink(const char* pathname)
|
||||||
|
|
|
@ -280,14 +280,12 @@ ssize_t SynthFSInode::write_bytes(off_t offset, ssize_t size, const byte* buffer
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SynthFSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error)
|
KResult SynthFSInode::add_child(InodeIdentifier child_id, const String& name, byte file_type)
|
||||||
{
|
{
|
||||||
(void) child_id;
|
(void)child_id;
|
||||||
(void) name;
|
(void)name;
|
||||||
(void) file_type;
|
(void)file_type;
|
||||||
(void) error;
|
|
||||||
ASSERT_NOT_REACHED();
|
ASSERT_NOT_REACHED();
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult SynthFSInode::remove_child(const String& name)
|
KResult SynthFSInode::remove_child(const String& name)
|
||||||
|
|
|
@ -63,7 +63,7 @@ private:
|
||||||
virtual String reverse_lookup(InodeIdentifier) override;
|
virtual String reverse_lookup(InodeIdentifier) override;
|
||||||
virtual void flush_metadata() override;
|
virtual void flush_metadata() override;
|
||||||
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
virtual ssize_t write_bytes(off_t, ssize_t, const byte* buffer, FileDescriptor*) override;
|
||||||
virtual bool add_child(InodeIdentifier child_id, const String& name, byte file_type, int& error) override;
|
virtual KResult add_child(InodeIdentifier child_id, const String& name, byte file_type) override;
|
||||||
virtual KResult remove_child(const String& name) override;
|
virtual KResult remove_child(const String& name) override;
|
||||||
virtual RetainPtr<Inode> parent() const override;
|
virtual RetainPtr<Inode> parent() const override;
|
||||||
virtual size_t directory_entry_count() const override;
|
virtual size_t directory_entry_count() const override;
|
||||||
|
|
|
@ -375,39 +375,31 @@ RetainPtr<Inode> VFS::resolve_path_to_inode(const String& path, Inode& base, int
|
||||||
return get_inode(inode_id);
|
return get_inode(inode_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VFS::link(const String& old_path, const String& new_path, Inode& base, int& error)
|
KResult VFS::link(const String& old_path, const String& new_path, Inode& base)
|
||||||
{
|
{
|
||||||
auto old_inode = resolve_path_to_inode(old_path, base, error);
|
auto old_inode_or_error = resolve_path_to_inode(old_path, base);
|
||||||
if (!old_inode)
|
if (old_inode_or_error.is_error())
|
||||||
return false;
|
return old_inode_or_error.error();
|
||||||
|
auto old_inode = old_inode_or_error.value();
|
||||||
|
|
||||||
RetainPtr<Inode> parent_inode;
|
RetainPtr<Inode> parent_inode;
|
||||||
auto new_inode = resolve_path_to_inode(new_path, base, error, &parent_inode);
|
auto new_inode_or_error = resolve_path_to_inode(new_path, base, &parent_inode);
|
||||||
if (new_inode) {
|
if (!new_inode_or_error.is_error())
|
||||||
error = -EEXIST;
|
return KResult(-EEXIST);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!parent_inode) {
|
|
||||||
error = -ENOENT;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (parent_inode->fsid() != old_inode->fsid()) {
|
|
||||||
error = -EXDEV;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (parent_inode->fs().is_readonly()) {
|
|
||||||
error = -EROFS;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!parent_inode->metadata().may_write(*current)) {
|
|
||||||
error = -EACCES;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!parent_inode->add_child(old_inode->identifier(), FileSystemPath(new_path).basename(), 0, error))
|
if (!parent_inode)
|
||||||
return false;
|
return KResult(-ENOENT);
|
||||||
error = 0;
|
|
||||||
return true;
|
if (parent_inode->fsid() != old_inode->fsid())
|
||||||
|
return KResult(-EXDEV);
|
||||||
|
|
||||||
|
if (parent_inode->fs().is_readonly())
|
||||||
|
return KResult(-EROFS);
|
||||||
|
|
||||||
|
if (!parent_inode->metadata().may_write(*current))
|
||||||
|
return KResult(-EACCES);
|
||||||
|
|
||||||
|
return parent_inode->add_child(old_inode->identifier(), FileSystemPath(new_path).basename(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult VFS::unlink(const String& path, Inode& base)
|
KResult VFS::unlink(const String& path, Inode& base)
|
||||||
|
|
|
@ -66,7 +66,7 @@ public:
|
||||||
RetainPtr<FileDescriptor> open(const String& path, int& error, int options, mode_t mode, Inode& base);
|
RetainPtr<FileDescriptor> open(const String& path, int& error, int options, mode_t mode, Inode& base);
|
||||||
RetainPtr<FileDescriptor> create(const String& path, int& error, int options, mode_t mode, Inode& base);
|
RetainPtr<FileDescriptor> create(const String& path, int& error, int options, mode_t mode, Inode& base);
|
||||||
KResult mkdir(const String& path, mode_t mode, Inode& base);
|
KResult mkdir(const String& path, mode_t mode, Inode& base);
|
||||||
bool link(const String& old_path, const String& new_path, Inode& base, int& error);
|
KResult link(const String& old_path, const String& new_path, Inode& base);
|
||||||
KResult unlink(const String& path, Inode& base);
|
KResult unlink(const String& path, Inode& base);
|
||||||
KResult rmdir(const String& path, Inode& base);
|
KResult rmdir(const String& path, Inode& base);
|
||||||
KResult chmod(const String& path, mode_t, Inode& base);
|
KResult chmod(const String& path, mode_t, Inode& base);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue