/* * Copyright (c) 2024, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Kernel { class LoopDevice final : public BlockDevice { friend class DeviceManagement; public: virtual bool unref() const override; virtual ~LoopDevice() = default; void remove(Badge); static ErrorOr> create_with_file_description(OpenFileDescription&); virtual StringView class_name() const override { return "LoopDevice"sv; } virtual ErrorOr read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override; virtual ErrorOr write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override; virtual bool can_read(OpenFileDescription const&, u64) const override; virtual bool can_write(OpenFileDescription const&, u64) const override; virtual ErrorOr ioctl(OpenFileDescription&, unsigned request, Userspace arg) override; virtual bool is_loop_device() const override { return true; } unsigned index() const { return m_index; } Inode const& inode() const { return m_backing_custody->inode(); } Inode& inode() { return m_backing_custody->inode(); } Custody const& custody() const { return *m_backing_custody; } Custody& custody() { return *m_backing_custody; } private: virtual void start_request(AsyncBlockDeviceRequest&) override; LoopDevice(NonnullRefPtr, unsigned index); NonnullRefPtr const m_backing_custody; unsigned const m_index { 0 }; mutable IntrusiveListNode> m_list_node; public: using List = IntrusiveList<&LoopDevice::m_list_node>; static SpinlockProtected& all_instances(); }; }