summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem/VirtualFileSystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/FileSystem/VirtualFileSystem.cpp')
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.cpp128
1 files changed, 64 insertions, 64 deletions
diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp
index e4d4f4d321..0441ef21e4 100644
--- a/Kernel/FileSystem/VirtualFileSystem.cpp
+++ b/Kernel/FileSystem/VirtualFileSystem.cpp
@@ -21,40 +21,40 @@
namespace Kernel {
-static AK::Singleton<VFS> s_the;
+static AK::Singleton<VirtualFileSystem> s_the;
static constexpr int symlink_recursion_limit { 5 }; // FIXME: increase?
static constexpr int root_mount_flags = MS_NODEV | MS_NOSUID | MS_RDONLY;
-UNMAP_AFTER_INIT void VFS::initialize()
+UNMAP_AFTER_INIT void VirtualFileSystem::initialize()
{
s_the.ensure_instance();
}
-VFS& VFS::the()
+VirtualFileSystem& VirtualFileSystem::the()
{
return *s_the;
}
-UNMAP_AFTER_INIT VFS::VFS()
+UNMAP_AFTER_INIT VirtualFileSystem::VirtualFileSystem()
{
}
-UNMAP_AFTER_INIT VFS::~VFS()
+UNMAP_AFTER_INIT VirtualFileSystem::~VirtualFileSystem()
{
}
-InodeIdentifier VFS::root_inode_id() const
+InodeIdentifier VirtualFileSystem::root_inode_id() const
{
VERIFY(m_root_inode);
return m_root_inode->identifier();
}
-KResult VFS::mount(FileSystem& fs, Custody& mount_point, int flags)
+KResult VirtualFileSystem::mount(FileSystem& fs, Custody& mount_point, int flags)
{
Locker locker(m_lock);
auto& inode = mount_point.inode();
- dbgln("VFS: Mounting {} at {} (inode: {}) with flags {}",
+ dbgln("VirtualFileSystem: Mounting {} at {} (inode: {}) with flags {}",
fs.class_name(),
mount_point.try_create_absolute_path(),
inode.identifier(),
@@ -65,22 +65,22 @@ KResult VFS::mount(FileSystem& fs, Custody& mount_point, int flags)
return KSuccess;
}
-KResult VFS::bind_mount(Custody& source, Custody& mount_point, int flags)
+KResult VirtualFileSystem::bind_mount(Custody& source, Custody& mount_point, int flags)
{
Locker locker(m_lock);
- dbgln("VFS: Bind-mounting {} at {}", source.try_create_absolute_path(), mount_point.try_create_absolute_path());
+ dbgln("VirtualFileSystem: Bind-mounting {} at {}", source.try_create_absolute_path(), mount_point.try_create_absolute_path());
// FIXME: check that this is not already a mount point
Mount mount { source.inode(), mount_point, flags };
m_mounts.append(move(mount));
return KSuccess;
}
-KResult VFS::remount(Custody& mount_point, int new_flags)
+KResult VirtualFileSystem::remount(Custody& mount_point, int new_flags)
{
Locker locker(m_lock);
- dbgln("VFS: Remounting {}", mount_point.try_create_absolute_path());
+ dbgln("VirtualFileSystem: Remounting {}", mount_point.try_create_absolute_path());
Mount* mount = find_mount_for_guest(mount_point.inode());
if (!mount)
@@ -90,32 +90,32 @@ KResult VFS::remount(Custody& mount_point, int new_flags)
return KSuccess;
}
-KResult VFS::unmount(Inode& guest_inode)
+KResult VirtualFileSystem::unmount(Inode& guest_inode)
{
Locker locker(m_lock);
- dbgln("VFS: unmount called with inode {}", guest_inode.identifier());
+ dbgln("VirtualFileSystem: unmount called with inode {}", guest_inode.identifier());
for (size_t i = 0; i < m_mounts.size(); ++i) {
auto& mount = m_mounts.at(i);
if (&mount.guest() == &guest_inode) {
if (auto result = mount.guest_fs().prepare_to_unmount(); result.is_error()) {
- dbgln("VFS: Failed to unmount!");
+ dbgln("VirtualFileSystem: Failed to unmount!");
return result;
}
- dbgln("VFS: found fs {} at mount index {}! Unmounting...", mount.guest_fs().fsid(), i);
+ dbgln("VirtualFileSystem: found fs {} at mount index {}! Unmounting...", mount.guest_fs().fsid(), i);
m_mounts.unstable_take(i);
return KSuccess;
}
}
- dbgln("VFS: Nothing mounted on inode {}", guest_inode.identifier());
+ dbgln("VirtualFileSystem: Nothing mounted on inode {}", guest_inode.identifier());
return ENODEV;
}
-bool VFS::mount_root(FileSystem& fs)
+bool VirtualFileSystem::mount_root(FileSystem& fs)
{
if (m_root_inode) {
- dmesgln("VFS: mount_root can't mount another root");
+ dmesgln("VirtualFileSystem: mount_root can't mount another root");
return false;
}
@@ -123,12 +123,12 @@ bool VFS::mount_root(FileSystem& fs)
auto root_inode = fs.root_inode();
if (!root_inode->is_directory()) {
- dmesgln("VFS: root inode ({}) for / is not a directory :(", root_inode->identifier());
+ dmesgln("VirtualFileSystem: root inode ({}) for / is not a directory :(", root_inode->identifier());
return false;
}
m_root_inode = move(root_inode);
- dmesgln("VFS: mounted root from {} ({})", fs.class_name(), static_cast<FileBackedFS&>(fs).file_description().absolute_path());
+ dmesgln("VirtualFileSystem: mounted root from {} ({})", fs.class_name(), static_cast<FileBackedFS&>(fs).file_description().absolute_path());
m_mounts.append(move(mount));
@@ -139,7 +139,7 @@ bool VFS::mount_root(FileSystem& fs)
return true;
}
-auto VFS::find_mount_for_host(Inode& inode) -> Mount*
+auto VirtualFileSystem::find_mount_for_host(Inode& inode) -> Mount*
{
for (auto& mount : m_mounts) {
if (mount.host() == &inode)
@@ -148,7 +148,7 @@ auto VFS::find_mount_for_host(Inode& inode) -> Mount*
return nullptr;
}
-auto VFS::find_mount_for_host(InodeIdentifier id) -> Mount*
+auto VirtualFileSystem::find_mount_for_host(InodeIdentifier id) -> Mount*
{
for (auto& mount : m_mounts) {
if (mount.host() && mount.host()->identifier() == id)
@@ -157,7 +157,7 @@ auto VFS::find_mount_for_host(InodeIdentifier id) -> Mount*
return nullptr;
}
-auto VFS::find_mount_for_guest(Inode& inode) -> Mount*
+auto VirtualFileSystem::find_mount_for_guest(Inode& inode) -> Mount*
{
for (auto& mount : m_mounts) {
if (&mount.guest() == &inode)
@@ -166,7 +166,7 @@ auto VFS::find_mount_for_guest(Inode& inode) -> Mount*
return nullptr;
}
-auto VFS::find_mount_for_guest(InodeIdentifier id) -> Mount*
+auto VirtualFileSystem::find_mount_for_guest(InodeIdentifier id) -> Mount*
{
for (auto& mount : m_mounts) {
if (mount.guest().identifier() == id)
@@ -175,12 +175,12 @@ auto VFS::find_mount_for_guest(InodeIdentifier id) -> Mount*
return nullptr;
}
-bool VFS::is_vfs_root(InodeIdentifier inode) const
+bool VirtualFileSystem::is_vfs_root(InodeIdentifier inode) const
{
return inode == root_inode_id();
}
-KResult VFS::traverse_directory_inode(Inode& dir_inode, Function<bool(FileSystem::DirectoryEntryView const&)> callback)
+KResult VirtualFileSystem::traverse_directory_inode(Inode& dir_inode, Function<bool(FileSystem::DirectoryEntryView const&)> callback)
{
return dir_inode.traverse_as_directory([&](auto& entry) {
InodeIdentifier resolved_inode;
@@ -202,9 +202,9 @@ KResult VFS::traverse_directory_inode(Inode& dir_inode, Function<bool(FileSystem
});
}
-KResult VFS::utime(StringView path, Custody& base, time_t atime, time_t mtime)
+KResult VirtualFileSystem::utime(StringView path, Custody& base, time_t atime, time_t mtime)
{
- auto custody_or_error = VFS::the().resolve_path(move(path), base);
+ auto custody_or_error = VirtualFileSystem::the().resolve_path(move(path), base);
if (custody_or_error.is_error())
return custody_or_error.error();
auto& custody = *custody_or_error.value();
@@ -222,7 +222,7 @@ KResult VFS::utime(StringView path, Custody& base, time_t atime, time_t mtime)
return KSuccess;
}
-KResultOr<InodeMetadata> VFS::lookup_metadata(StringView path, Custody& base, int options)
+KResultOr<InodeMetadata> VirtualFileSystem::lookup_metadata(StringView path, Custody& base, int options)
{
auto custody_or_error = resolve_path(path, base, nullptr, options);
if (custody_or_error.is_error())
@@ -230,7 +230,7 @@ KResultOr<InodeMetadata> VFS::lookup_metadata(StringView path, Custody& base, in
return custody_or_error.value()->inode().metadata();
}
-KResultOr<NonnullRefPtr<FileDescription>> VFS::open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
+KResultOr<NonnullRefPtr<FileDescription>> VirtualFileSystem::open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
{
if ((options & O_CREAT) && (options & O_DIRECTORY))
return EINVAL;
@@ -333,7 +333,7 @@ KResultOr<NonnullRefPtr<FileDescription>> VFS::open(StringView path, int options
return description;
}
-KResult VFS::mknod(StringView path, mode_t mode, dev_t dev, Custody& base)
+KResult VirtualFileSystem::mknod(StringView path, mode_t mode, dev_t dev, Custody& base)
{
if (!is_regular_file(mode) && !is_block_device(mode) && !is_character_device(mode) && !is_fifo(mode) && !is_socket(mode))
return EINVAL;
@@ -354,11 +354,11 @@ KResult VFS::mknod(StringView path, mode_t mode, dev_t dev, Custody& base)
return EROFS;
auto basename = KLexicalPath::basename(path);
- dbgln("VFS::mknod: '{}' mode={} dev={} in {}", basename, mode, dev, parent_inode.identifier());
+ dbgln("VirtualFileSystem::mknod: '{}' mode={} dev={} in {}", basename, mode, dev, parent_inode.identifier());
return parent_inode.create_child(basename, mode, dev, current_process->euid(), current_process->egid()).result();
}
-KResultOr<NonnullRefPtr<FileDescription>> VFS::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
+KResultOr<NonnullRefPtr<FileDescription>> VirtualFileSystem::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
{
auto basename = KLexicalPath::basename(path);
auto parent_path = parent_custody.try_create_absolute_path();
@@ -382,7 +382,7 @@ KResultOr<NonnullRefPtr<FileDescription>> VFS::create(StringView path, int optio
if (parent_custody.is_readonly())
return EROFS;
- dbgln_if(VFS_DEBUG, "VFS::create: '{}' in {}", basename, parent_inode.identifier());
+ dbgln_if(VFS_DEBUG, "VirtualFileSystem::create: '{}' in {}", basename, parent_inode.identifier());
uid_t uid = owner.has_value() ? owner.value().uid : current_process->euid();
gid_t gid = owner.has_value() ? owner.value().gid : current_process->egid();
auto inode_or_error = parent_inode.create_child(basename, mode, 0, uid, gid);
@@ -400,7 +400,7 @@ KResultOr<NonnullRefPtr<FileDescription>> VFS::create(StringView path, int optio
return description;
}
-KResult VFS::mkdir(StringView path, mode_t mode, Custody& base)
+KResult VirtualFileSystem::mkdir(StringView path, mode_t mode, Custody& base)
{
// Unlike in basically every other case, where it's only the last
// path component (the one being created) that is allowed not to
@@ -425,11 +425,11 @@ KResult VFS::mkdir(StringView path, mode_t mode, Custody& base)
return EROFS;
auto basename = KLexicalPath::basename(path);
- dbgln_if(VFS_DEBUG, "VFS::mkdir: '{}' in {}", basename, parent_inode.identifier());
+ dbgln_if(VFS_DEBUG, "VirtualFileSystem::mkdir: '{}' in {}", basename, parent_inode.identifier());
return parent_inode.create_child(basename, S_IFDIR | mode, 0, current_process->euid(), current_process->egid()).result();
}
-KResult VFS::access(StringView path, int mode, Custody& base)
+KResult VirtualFileSystem::access(StringView path, int mode, Custody& base)
{
auto custody_or_error = resolve_path(path, base);
if (custody_or_error.is_error())
@@ -455,7 +455,7 @@ KResult VFS::access(StringView path, int mode, Custody& base)
return KSuccess;
}
-KResultOr<NonnullRefPtr<Custody>> VFS::open_directory(StringView path, Custody& base)
+KResultOr<NonnullRefPtr<Custody>> VirtualFileSystem::open_directory(StringView path, Custody& base)
{
auto inode_or_error = resolve_path(path, base);
if (inode_or_error.is_error())
@@ -469,7 +469,7 @@ KResultOr<NonnullRefPtr<Custody>> VFS::open_directory(StringView path, Custody&
return custody;
}
-KResult VFS::chmod(Custody& custody, mode_t mode)
+KResult VirtualFileSystem::chmod(Custody& custody, mode_t mode)
{
auto& inode = custody.inode();
@@ -484,7 +484,7 @@ KResult VFS::chmod(Custody& custody, mode_t mode)
return inode.chmod(mode);
}
-KResult VFS::chmod(StringView path, mode_t mode, Custody& base)
+KResult VirtualFileSystem::chmod(StringView path, mode_t mode, Custody& base)
{
auto custody_or_error = resolve_path(path, base);
if (custody_or_error.is_error())
@@ -493,7 +493,7 @@ KResult VFS::chmod(StringView path, mode_t mode, Custody& base)
return chmod(custody, mode);
}
-KResult VFS::rename(StringView old_path, StringView new_path, Custody& base)
+KResult VirtualFileSystem::rename(StringView old_path, StringView new_path, Custody& base)
{
RefPtr<Custody> old_parent_custody;
auto old_custody_or_error = resolve_path(old_path, base, &old_parent_custody, O_NOFOLLOW_NOERROR);
@@ -566,7 +566,7 @@ KResult VFS::rename(StringView old_path, StringView new_path, Custody& base)
return KSuccess;
}
-KResult VFS::chown(Custody& custody, uid_t a_uid, gid_t a_gid)
+KResult VirtualFileSystem::chown(Custody& custody, uid_t a_uid, gid_t a_gid)
{
auto& inode = custody.inode();
auto metadata = inode.metadata();
@@ -592,10 +592,10 @@ KResult VFS::chown(Custody& custody, uid_t a_uid, gid_t a_gid)
if (custody.is_readonly())
return EROFS;
- dbgln_if(VFS_DEBUG, "VFS::chown(): inode {} <- uid={} gid={}", inode.identifier(), new_uid, new_gid);
+ dbgln_if(VFS_DEBUG, "VirtualFileSystem::chown(): inode {} <- uid={} gid={}", inode.identifier(), new_uid, new_gid);
if (metadata.is_setuid() || metadata.is_setgid()) {
- dbgln_if(VFS_DEBUG, "VFS::chown(): Stripping SUID/SGID bits from {}", inode.identifier());
+ dbgln_if(VFS_DEBUG, "VirtualFileSystem::chown(): Stripping SUID/SGID bits from {}", inode.identifier());
if (auto result = inode.chmod(metadata.mode & ~(04000 | 02000)); result.is_error())
return result;
}
@@ -603,7 +603,7 @@ KResult VFS::chown(Custody& custody, uid_t a_uid, gid_t a_gid)
return inode.chown(new_uid, new_gid);
}
-KResult VFS::chown(StringView path, uid_t a_uid, gid_t a_gid, Custody& base)
+KResult VirtualFileSystem::chown(StringView path, uid_t a_uid, gid_t a_gid, Custody& base)
{
auto custody_or_error = resolve_path(path, base);
if (custody_or_error.is_error())
@@ -629,7 +629,7 @@ static bool hard_link_allowed(const Inode& inode)
return false;
}
-KResult VFS::link(StringView old_path, StringView new_path, Custody& base)
+KResult VirtualFileSystem::link(StringView old_path, StringView new_path, Custody& base)
{
auto old_custody_or_error = resolve_path(old_path, base);
if (old_custody_or_error.is_error())
@@ -665,7 +665,7 @@ KResult VFS::link(StringView old_path, StringView new_path, Custody& base)
return parent_inode.add_child(old_inode, KLexicalPath::basename(new_path), old_inode.mode());
}
-KResult VFS::unlink(StringView path, Custody& base)
+KResult VirtualFileSystem::unlink(StringView path, Custody& base)
{
RefPtr<Custody> parent_custody;
auto custody_or_error = resolve_path(path, base, &parent_custody, O_NOFOLLOW_NOERROR | O_UNLINK_INTERNAL);
@@ -701,7 +701,7 @@ KResult VFS::unlink(StringView path, Custody& base)
return KSuccess;
}
-KResult VFS::symlink(StringView target, StringView linkpath, Custody& base)
+KResult VirtualFileSystem::symlink(StringView target, StringView linkpath, Custody& base)
{
RefPtr<Custody> parent_custody;
auto existing_custody_or_error = resolve_path(linkpath, base, &parent_custody);
@@ -719,7 +719,7 @@ KResult VFS::symlink(StringView target, StringView linkpath, Custody& base)
return EROFS;
auto basename = KLexicalPath::basename(linkpath);
- dbgln_if(VFS_DEBUG, "VFS::symlink: '{}' (-> '{}') in {}", basename, target, parent_inode.identifier());
+ dbgln_if(VFS_DEBUG, "VirtualFileSystem::symlink: '{}' (-> '{}') in {}", basename, target, parent_inode.identifier());
auto inode_or_error = parent_inode.create_child(basename, S_IFLNK | 0644, 0, current_process->euid(), current_process->egid());
if (inode_or_error.is_error())
return inode_or_error.error();
@@ -731,7 +731,7 @@ KResult VFS::symlink(StringView target, StringView linkpath, Custody& base)
return KSuccess;
}
-KResult VFS::rmdir(StringView path, Custody& base)
+KResult VirtualFileSystem::rmdir(StringView path, Custody& base)
{
RefPtr<Custody> parent_custody;
auto custody_or_error = resolve_path(path, base, &parent_custody);
@@ -780,7 +780,7 @@ KResult VFS::rmdir(StringView path, Custody& base)
return parent_inode.remove_child(KLexicalPath::basename(path));
}
-VFS::Mount::Mount(FileSystem& guest_fs, Custody* host_custody, int flags)
+VirtualFileSystem::Mount::Mount(FileSystem& guest_fs, Custody* host_custody, int flags)
: m_guest(guest_fs.root_inode())
, m_guest_fs(guest_fs)
, m_host_custody(host_custody)
@@ -788,7 +788,7 @@ VFS::Mount::Mount(FileSystem& guest_fs, Custody* host_custody, int flags)
{
}
-VFS::Mount::Mount(Inode& source, Custody& host_custody, int flags)
+VirtualFileSystem::Mount::Mount(Inode& source, Custody& host_custody, int flags)
: m_guest(source)
, m_guest_fs(source.fs())
, m_host_custody(host_custody)
@@ -796,45 +796,45 @@ VFS::Mount::Mount(Inode& source, Custody& host_custody, int flags)
{
}
-String VFS::Mount::absolute_path() const
+String VirtualFileSystem::Mount::absolute_path() const
{
if (!m_host_custody)
return "/";
return m_host_custody->absolute_path();
}
-Inode* VFS::Mount::host()
+Inode* VirtualFileSystem::Mount::host()
{
if (!m_host_custody)
return nullptr;
return &m_host_custody->inode();
}
-const Inode* VFS::Mount::host() const
+const Inode* VirtualFileSystem::Mount::host() const
{
if (!m_host_custody)
return nullptr;
return &m_host_custody->inode();
}
-void VFS::for_each_mount(Function<void(const Mount&)> callback) const
+void VirtualFileSystem::for_each_mount(Function<void(const Mount&)> callback) const
{
for (auto& mount : m_mounts) {
callback(mount);
}
}
-void VFS::sync()
+void VirtualFileSystem::sync()
{
FileSystem::sync();
}
-Custody& VFS::root_custody()
+Custody& VirtualFileSystem::root_custody()
{
return *m_root_custody;
}
-UnveilNode const& VFS::find_matching_unveiled_path(StringView path)
+UnveilNode const& VirtualFileSystem::find_matching_unveiled_path(StringView path)
{
VERIFY(Process::current()->veil_state() != VeilState::None);
auto& unveil_root = Process::current()->unveiled_paths();
@@ -843,7 +843,7 @@ UnveilNode const& VFS::find_matching_unveiled_path(StringView path)
return unveil_root.traverse_until_last_accessible_node(path_parts.begin(), path_parts.end());
}
-KResult VFS::validate_path_against_process_veil(Custody const& custody, int options)
+KResult VirtualFileSystem::validate_path_against_process_veil(Custody const& custody, int options)
{
if (Process::current()->veil_state() == VeilState::None)
return KSuccess;
@@ -853,7 +853,7 @@ KResult VFS::validate_path_against_process_veil(Custody const& custody, int opti
return validate_path_against_process_veil(absolute_path->view(), options);
}
-KResult VFS::validate_path_against_process_veil(StringView path, int options)
+KResult VirtualFileSystem::validate_path_against_process_veil(StringView path, int options)
{
if (Process::current()->veil_state() == VeilState::None)
return KSuccess;
@@ -918,7 +918,7 @@ KResult VFS::validate_path_against_process_veil(StringView path, int options)
return KSuccess;
}
-KResultOr<NonnullRefPtr<Custody>> VFS::resolve_path(StringView path, Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level)
+KResultOr<NonnullRefPtr<Custody>> VirtualFileSystem::resolve_path(StringView path, Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level)
{
auto custody_or_error = resolve_path_without_veil(path, base, out_parent, options, symlink_recursion_level);
if (custody_or_error.is_error())
@@ -946,7 +946,7 @@ static bool safe_to_follow_symlink(const Inode& inode, const InodeMetadata& pare
return false;
}
-KResultOr<NonnullRefPtr<Custody>> VFS::resolve_path_without_veil(StringView path, Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level)
+KResultOr<NonnullRefPtr<Custody>> VirtualFileSystem::resolve_path_without_veil(StringView path, Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level)
{
if (symlink_recursion_level >= symlink_recursion_limit)
return ELOOP;