Serenity Operating System
1/*
2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#pragma once
8
9#include <Kernel/Devices/BlockDevice.h>
10#include <Kernel/Library/LockRefPtr.h>
11#include <Kernel/Library/LockWeakPtr.h>
12#include <LibPartition/DiskPartitionMetadata.h>
13
14namespace Kernel {
15
16class DiskPartition final : public BlockDevice {
17 friend class DeviceManagement;
18
19public:
20 static NonnullLockRefPtr<DiskPartition> create(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata);
21 virtual ~DiskPartition();
22
23 virtual void start_request(AsyncBlockDeviceRequest&) override;
24
25 // ^BlockDevice
26 virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
27 virtual bool can_read(OpenFileDescription const&, u64) const override;
28 virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
29 virtual bool can_write(OpenFileDescription const&, u64) const override;
30
31 Partition::DiskPartitionMetadata const& metadata() const;
32
33private:
34 DiskPartition(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata);
35 virtual StringView class_name() const override;
36
37 LockWeakPtr<BlockDevice> m_device;
38 Partition::DiskPartitionMetadata m_metadata;
39};
40
41}