/* * Copyright (c) 2024, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include namespace Kernel { ErrorOr> DevLoopFS::try_create(ReadonlyBytes) { return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevLoopFS)); } DevLoopFS::DevLoopFS() = default; DevLoopFS::~DevLoopFS() = default; u8 DevLoopFS::internal_file_type_to_directory_entry_type(DirectoryEntryView const& entry) const { return ram_backed_file_type_to_directory_entry_type(entry); } ErrorOr DevLoopFS::initialize() { m_root_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevLoopFSInode(*this))); m_root_inode->m_metadata.inode = { fsid(), 1 }; m_root_inode->m_metadata.mode = S_IFDIR | S_IROTH | S_IRGRP | S_IRUSR | S_IXUSR | S_IXGRP | S_IXOTH; m_root_inode->m_metadata.uid = 0; m_root_inode->m_metadata.gid = 0; m_root_inode->m_metadata.size = 0; m_root_inode->m_metadata.mtime = TimeManagement::boot_time(); return {}; } static unsigned inode_index_to_loop_index(InodeIndex inode_index) { VERIFY(inode_index > 1); return inode_index.value() - 2; } Inode& DevLoopFS::root_inode() { return *m_root_inode; } ErrorOr> DevLoopFS::get_inode(InodeIdentifier inode_id) const { if (inode_id.index() == 1) return *m_root_inode; unsigned loop_index = inode_index_to_loop_index(inode_id.index()); auto device = DeviceManagement::the().get_device(20, loop_index); VERIFY(device); auto& loop_device = static_cast(*device); auto inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevLoopFSInode(const_cast(*this), inode_id.index(), loop_device))); inode->m_metadata.inode = inode_id; inode->m_metadata.size = 0; inode->m_metadata.uid = 0; inode->m_metadata.gid = 0; inode->m_metadata.mode = S_IFCHR | S_IRUSR | S_IWUSR; inode->m_metadata.major_device = device->major(); inode->m_metadata.minor_device = device->minor(); inode->m_metadata.mtime = TimeManagement::boot_time(); return inode; } }