BlockDevice.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/Devices/Device.h>
  8. namespace Kernel {
  9. class BlockDevice;
  10. class AsyncBlockDeviceRequest final : public AsyncDeviceRequest {
  11. public:
  12. enum RequestType {
  13. Read,
  14. Write
  15. };
  16. AsyncBlockDeviceRequest(Device& block_device, RequestType request_type,
  17. u64 block_index, u32 block_count, const UserOrKernelBuffer& buffer, size_t buffer_size);
  18. RequestType request_type() const { return m_request_type; }
  19. u64 block_index() const { return m_block_index; }
  20. u32 block_count() const { return m_block_count; }
  21. UserOrKernelBuffer& buffer() { return m_buffer; }
  22. const UserOrKernelBuffer& buffer() const { return m_buffer; }
  23. size_t buffer_size() const { return m_buffer_size; }
  24. virtual void start() override;
  25. virtual StringView name() const override
  26. {
  27. switch (m_request_type) {
  28. case Read:
  29. return "BlockDeviceRequest (read)"sv;
  30. case Write:
  31. return "BlockDeviceRequest (write)"sv;
  32. default:
  33. VERIFY_NOT_REACHED();
  34. }
  35. }
  36. private:
  37. BlockDevice& m_block_device;
  38. const RequestType m_request_type;
  39. const u64 m_block_index;
  40. const u32 m_block_count;
  41. UserOrKernelBuffer m_buffer;
  42. const size_t m_buffer_size;
  43. };
  44. class BlockDevice : public Device {
  45. public:
  46. virtual ~BlockDevice() override;
  47. size_t block_size() const { return m_block_size; }
  48. virtual bool is_seekable() const override { return true; }
  49. bool read_block(u64 index, UserOrKernelBuffer&);
  50. bool write_block(u64 index, const UserOrKernelBuffer&);
  51. virtual void start_request(AsyncBlockDeviceRequest&) = 0;
  52. protected:
  53. BlockDevice(unsigned major, unsigned minor, size_t block_size = PAGE_SIZE)
  54. : Device(major, minor)
  55. , m_block_size(block_size)
  56. {
  57. }
  58. private:
  59. virtual bool is_block_device() const final { return true; }
  60. size_t m_block_size { 0 };
  61. };
  62. }