123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
- #pragma once
- #include <Kernel/Devices/Device.h>
- namespace Kernel {
- class BlockDevice;
- class AsyncBlockDeviceRequest final : public AsyncDeviceRequest {
- public:
- enum RequestType {
- Read,
- Write
- };
- AsyncBlockDeviceRequest(Device& block_device, RequestType request_type,
- u64 block_index, u32 block_count, const UserOrKernelBuffer& buffer, size_t buffer_size);
- RequestType request_type() const { return m_request_type; }
- u64 block_index() const { return m_block_index; }
- u32 block_count() const { return m_block_count; }
- UserOrKernelBuffer& buffer() { return m_buffer; }
- const UserOrKernelBuffer& buffer() const { return m_buffer; }
- size_t buffer_size() const { return m_buffer_size; }
- virtual void start() override;
- virtual StringView name() const override
- {
- switch (m_request_type) {
- case Read:
- return "BlockDeviceRequest (read)"sv;
- case Write:
- return "BlockDeviceRequest (write)"sv;
- default:
- VERIFY_NOT_REACHED();
- }
- }
- private:
- BlockDevice& m_block_device;
- const RequestType m_request_type;
- const u64 m_block_index;
- const u32 m_block_count;
- UserOrKernelBuffer m_buffer;
- const size_t m_buffer_size;
- };
- class BlockDevice : public Device {
- public:
- virtual ~BlockDevice() override;
- size_t block_size() const { return m_block_size; }
- virtual bool is_seekable() const override { return true; }
- bool read_block(u64 index, UserOrKernelBuffer&);
- bool write_block(u64 index, const UserOrKernelBuffer&);
- virtual void start_request(AsyncBlockDeviceRequest&) = 0;
- protected:
- BlockDevice(unsigned major, unsigned minor, size_t block_size = PAGE_SIZE)
- : Device(major, minor)
- , m_block_size(block_size)
- {
- }
- private:
- virtual bool is_block_device() const final { return true; }
- size_t m_block_size { 0 };
- };
- }
|