summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-05-30 21:29:26 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-05-30 22:30:29 +0200
commit874bffc729ab89a5384ffe4b38bac8b37cc810be (patch)
tree0df5d96971f5133cf8108f6e97dd2a3359a1a7e9 /Kernel/FileSystem
parent8e83aac8a310da1e8d21dd09087658768d9faf56 (diff)
downloadserenity-874bffc729ab89a5384ffe4b38bac8b37cc810be.zip
FileSystem: Get rid of VFS::absolute_path() and teach Mount about custodies.
Diffstat (limited to 'Kernel/FileSystem')
-rw-r--r--Kernel/FileSystem/FileDescriptor.cpp2
-rw-r--r--Kernel/FileSystem/FileDescriptor.h2
-rw-r--r--Kernel/FileSystem/InodeFile.cpp9
-rw-r--r--Kernel/FileSystem/ProcFS.cpp32
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.cpp76
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.h16
6 files changed, 40 insertions, 97 deletions
diff --git a/Kernel/FileSystem/FileDescriptor.cpp b/Kernel/FileSystem/FileDescriptor.cpp
index 54e3c7d57c..49862fee25 100644
--- a/Kernel/FileSystem/FileDescriptor.cpp
+++ b/Kernel/FileSystem/FileDescriptor.cpp
@@ -261,7 +261,7 @@ int FileDescriptor::close()
return 0;
}
-KResultOr<String> FileDescriptor::absolute_path()
+String FileDescriptor::absolute_path()
{
if (m_custody)
return m_custody->absolute_path();
diff --git a/Kernel/FileSystem/FileDescriptor.h b/Kernel/FileSystem/FileDescriptor.h
index e9844f2a59..cf5f9891ee 100644
--- a/Kernel/FileSystem/FileDescriptor.h
+++ b/Kernel/FileSystem/FileDescriptor.h
@@ -43,7 +43,7 @@ public:
ByteBuffer read_entire_file();
- KResultOr<String> absolute_path();
+ String absolute_path();
bool is_directory() const;
diff --git a/Kernel/FileSystem/InodeFile.cpp b/Kernel/FileSystem/InodeFile.cpp
index 620e90ff66..80a25e5301 100644
--- a/Kernel/FileSystem/InodeFile.cpp
+++ b/Kernel/FileSystem/InodeFile.cpp
@@ -41,12 +41,11 @@ KResultOr<Region*> InodeFile::mmap(Process& process, LinearAddress preferred_lad
return region;
}
-String InodeFile::absolute_path(FileDescriptor&) const
+String InodeFile::absolute_path(FileDescriptor& descriptor) const
{
- auto path_or_error = VFS::the().absolute_path(const_cast<Inode&>(inode()));
- if (path_or_error.is_error())
- return { };
- return path_or_error.value();
+ ASSERT_NOT_REACHED();
+ ASSERT(descriptor.custody());
+ return descriptor.absolute_path();
}
KResult InodeFile::truncate(off_t size)
diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp
index e0bc81631e..3f71e7b206 100644
--- a/Kernel/FileSystem/ProcFS.cpp
+++ b/Kernel/FileSystem/ProcFS.cpp
@@ -192,10 +192,7 @@ ByteBuffer procfs$pid_fds(InodeIdentifier identifier)
auto* descriptor = process.file_descriptor(i);
if (!descriptor)
continue;
- auto result = descriptor->absolute_path();
- if (result.is_error())
- continue;
- builder.appendf("% 3u %s\n", i, result.value().characters());
+ builder.appendf("% 3u %s\n", i, descriptor->absolute_path().characters());
}
return builder.to_byte_buffer();
}
@@ -210,10 +207,7 @@ ByteBuffer procfs$pid_fd_entry(InodeIdentifier identifier)
auto* descriptor = process.file_descriptor(fd);
if (!descriptor)
return { };
- auto result = descriptor->absolute_path();
- if (result.is_error())
- return { };
- return result.value().to_byte_buffer();
+ return descriptor->absolute_path().to_byte_buffer();
}
ByteBuffer procfs$pid_vm(InodeIdentifier identifier)
@@ -420,11 +414,7 @@ ByteBuffer procfs$mounts(InodeIdentifier)
else {
builder.appendf("%u:%u", mount.host().fsid(), mount.host().index());
builder.append(' ');
- auto result = VFS::the().absolute_path(mount.host());
- if (result.is_error())
- builder.append("[error]");
- else
- builder.append(result.value());
+ builder.append(mount.absolute_path());
}
builder.append('\n');
});
@@ -442,15 +432,7 @@ ByteBuffer procfs$df(InodeIdentifier)
builder.appendf("%u,", fs.free_block_count());
builder.appendf("%u,", fs.total_inode_count());
builder.appendf("%u,", fs.free_inode_count());
- if (!mount.host().is_valid())
- builder.append("/");
- else {
- auto result = VFS::the().absolute_path(mount.host());
- if (result.is_error())
- builder.append("[Error]");
- else
- builder.append(result.value());
- }
+ builder.append(mount.absolute_path());
builder.append('\n');
});
return builder.to_byte_buffer();
@@ -613,11 +595,7 @@ ByteBuffer procfs$inodes(InodeIdentifier)
StringBuilder builder;
for (auto it : all_inodes()) {
RetainPtr<Inode> inode = *it;
- auto result = VFS::the().absolute_path(*inode);
- if (result.is_error())
- continue;
- auto path = result.value();
- builder.appendf("Inode{K%x} %02u:%08u (%u) %s\n", inode.ptr(), inode->fsid(), inode->index(), inode->retain_count(), path.characters());
+ builder.appendf("Inode{K%x} %02u:%08u (%u)\n", inode.ptr(), inode->fsid(), inode->index(), inode->retain_count());
}
return builder.to_byte_buffer();
}
diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp
index adde353404..6ee9d652dd 100644
--- a/Kernel/FileSystem/VirtualFileSystem.cpp
+++ b/Kernel/FileSystem/VirtualFileSystem.cpp
@@ -36,9 +36,8 @@ InodeIdentifier VFS::root_inode_id() const
return m_root_inode->identifier();
}
-bool VFS::mount(RetainPtr<FS>&& file_system, StringView path)
+bool VFS::mount(Retained<FS>&& file_system, StringView path)
{
- ASSERT(file_system);
auto result = resolve_path_to_custody(path, root_custody());
if (result.is_error()) {
kprintf("VFS: mount can't resolve mount point '%s'\n", path.characters());
@@ -47,19 +46,19 @@ bool VFS::mount(RetainPtr<FS>&& file_system, StringView path)
auto& inode = result.value()->inode();
kprintf("VFS: mounting %s{%p} at %s (inode: %u)\n", file_system->class_name(), file_system.ptr(), path.characters(), inode.index());
// FIXME: check that this is not already a mount point
- auto mount = make<Mount>(inode.identifier(), move(file_system));
+ auto mount = make<Mount>(*result.value(), move(file_system));
m_mounts.append(move(mount));
return true;
}
-bool VFS::mount_root(RetainPtr<FS>&& file_system)
+bool VFS::mount_root(Retained<FS>&& file_system)
{
if (m_root_inode) {
kprintf("VFS: mount_root can't mount another root\n");
return false;
}
- auto mount = make<Mount>(InodeIdentifier(), move(file_system));
+ auto mount = make<Mount>(nullptr, move(file_system));
auto root_inode_id = mount->guest().fs()->root_inode();
auto root_inode = mount->guest().fs()->get_inode(root_inode_id);
@@ -565,53 +564,6 @@ RetainPtr<Inode> VFS::get_inode(InodeIdentifier inode_id)
return inode_id.fs()->get_inode(inode_id);
}
-KResultOr<String> VFS::absolute_path(InodeIdentifier inode_id)
-{
- auto inode = get_inode(inode_id);
- if (!inode)
- return KResult(-EIO);
- return absolute_path(*inode);
-}
-
-KResultOr<String> VFS::absolute_path(Inode& core_inode)
-{
- Vector<InodeIdentifier> lineage;
- RetainPtr<Inode> inode = &core_inode;
- while (inode->identifier() != root_inode_id()) {
- if (auto* mount = find_mount_for_guest(inode->identifier()))
- lineage.append(mount->host());
- else
- lineage.append(inode->identifier());
-
- InodeIdentifier parent_id;
- if (inode->is_directory()) {
- auto result = resolve_path("..", inode->identifier());
- if (result.is_error())
- return result.error();
- parent_id = result.value();
- } else {
- parent_id = inode->parent()->identifier();
- }
- if (!parent_id.is_valid())
- return KResult(-EIO);
- inode = get_inode(parent_id);
- }
- if (lineage.is_empty())
- return "/";
- lineage.append(root_inode_id());
- StringBuilder builder;
- for (size_t i = lineage.size() - 1; i >= 1; --i) {
- auto& child = lineage[i - 1];
- auto parent = lineage[i];
- if (auto* mount = find_mount_for_host(parent))
- parent = mount->guest();
- builder.append('/');
- auto parent_inode = get_inode(parent);
- builder.append(parent_inode->reverse_lookup(child));
- }
- return builder.to_string();
-}
-
KResultOr<InodeIdentifier> VFS::resolve_path(StringView path, InodeIdentifier base, int options, InodeIdentifier* parent_id)
{
if (path.is_empty())
@@ -701,11 +653,25 @@ KResultOr<InodeIdentifier> VFS::resolve_path(StringView path, InodeIdentifier ba
return crumb_id;
}
-VFS::Mount::Mount(InodeIdentifier host, RetainPtr<FS>&& guest_fs)
- : m_host(host)
- , m_guest(guest_fs->root_inode())
+VFS::Mount::Mount(RetainPtr<Custody>&& host_custody, Retained<FS>&& guest_fs)
+ : m_guest(guest_fs->root_inode())
, m_guest_fs(move(guest_fs))
+ , m_host_custody(move(host_custody))
+{
+}
+
+String VFS::Mount::absolute_path() const
+{
+ if (!m_host_custody)
+ return "/";
+ return m_host_custody->absolute_path();
+}
+
+InodeIdentifier VFS::Mount::host() const
{
+ if (!m_host_custody)
+ return { };
+ return m_host_custody->inode().identifier();
}
void VFS::register_device(Device& device)
diff --git a/Kernel/FileSystem/VirtualFileSystem.h b/Kernel/FileSystem/VirtualFileSystem.h
index cfe4daed08..375d11947a 100644
--- a/Kernel/FileSystem/VirtualFileSystem.h
+++ b/Kernel/FileSystem/VirtualFileSystem.h
@@ -41,17 +41,20 @@ class VFS {
public:
class Mount {
public:
- Mount(InodeIdentifier host, RetainPtr<FS>&&);
+ Mount(RetainPtr<Custody>&&, Retained<FS>&&);
- InodeIdentifier host() const { return m_host; }
+ InodeIdentifier host() const;
InodeIdentifier guest() const { return m_guest; }
const FS& guest_fs() const { return *m_guest_fs; }
+ String absolute_path() const;
+
private:
InodeIdentifier m_host;
InodeIdentifier m_guest;
- RetainPtr<FS> m_guest_fs;
+ Retained<FS> m_guest_fs;
+ RetainPtr<Custody> m_host_custody;
};
[[gnu::pure]] static VFS& the();
@@ -59,8 +62,8 @@ public:
VFS();
~VFS();
- bool mount_root(RetainPtr<FS>&&);
- bool mount(RetainPtr<FS>&&, StringView path);
+ bool mount_root(Retained<FS>&&);
+ bool mount(Retained<FS>&&, StringView path);
KResultOr<Retained<FileDescriptor>> open(RetainPtr<Device>&&, int options);
KResultOr<Retained<FileDescriptor>> open(StringView path, int options, mode_t mode, Custody& base);
@@ -86,9 +89,6 @@ public:
size_t mount_count() const { return m_mounts.size(); }
void for_each_mount(Function<void(const Mount&)>) const;
- KResultOr<String> absolute_path(Inode&);
- KResultOr<String> absolute_path(InodeIdentifier);
-
InodeIdentifier root_inode_id() const;
Inode* root_inode() { return m_root_inode.ptr(); }
const Inode* root_inode() const { return m_root_inode.ptr(); }