DiskPartition.cpp 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Debug.h>
  7. #include <Kernel/FileSystem/OpenFileDescription.h>
  8. #include <Kernel/Storage/Partition/DiskPartition.h>
  9. namespace Kernel {
  10. NonnullRefPtr<DiskPartition> DiskPartition::create(BlockDevice& device, unsigned minor_number, DiskPartitionMetadata metadata)
  11. {
  12. auto partition_or_error = try_create_device<DiskPartition>(device, minor_number, metadata);
  13. // FIXME: Find a way to propagate errors
  14. VERIFY(!partition_or_error.is_error());
  15. return partition_or_error.release_value();
  16. }
  17. DiskPartition::DiskPartition(BlockDevice& device, unsigned minor_number, DiskPartitionMetadata metadata)
  18. : BlockDevice(100, minor_number, device.block_size())
  19. , m_device(device)
  20. , m_metadata(metadata)
  21. {
  22. }
  23. DiskPartition::~DiskPartition()
  24. {
  25. }
  26. const DiskPartitionMetadata& DiskPartition::metadata() const
  27. {
  28. return m_metadata;
  29. }
  30. void DiskPartition::start_request(AsyncBlockDeviceRequest& request)
  31. {
  32. auto device = m_device.strong_ref();
  33. if (!device)
  34. request.complete(AsyncBlockDeviceRequest::RequestResult::Failure);
  35. auto sub_request_or_error = device->try_make_request<AsyncBlockDeviceRequest>(request.request_type(),
  36. request.block_index() + m_metadata.start_block(), request.block_count(), request.buffer(), request.buffer_size());
  37. if (sub_request_or_error.is_error())
  38. TODO();
  39. request.add_sub_request(sub_request_or_error.release_value());
  40. }
  41. KResultOr<size_t> DiskPartition::read(OpenFileDescription& fd, u64 offset, UserOrKernelBuffer& outbuf, size_t len)
  42. {
  43. unsigned adjust = m_metadata.start_block() * block_size();
  44. dbgln_if(OFFD_DEBUG, "DiskPartition::read offset={}, adjust={}, len={}", fd.offset(), adjust, len);
  45. return m_device.strong_ref()->read(fd, offset + adjust, outbuf, len);
  46. }
  47. bool DiskPartition::can_read(const OpenFileDescription& fd, size_t offset) const
  48. {
  49. unsigned adjust = m_metadata.start_block() * block_size();
  50. dbgln_if(OFFD_DEBUG, "DiskPartition::can_read offset={}, adjust={}", offset, adjust);
  51. return m_device.strong_ref()->can_read(fd, offset + adjust);
  52. }
  53. KResultOr<size_t> DiskPartition::write(OpenFileDescription& fd, u64 offset, const UserOrKernelBuffer& inbuf, size_t len)
  54. {
  55. unsigned adjust = m_metadata.start_block() * block_size();
  56. dbgln_if(OFFD_DEBUG, "DiskPartition::write offset={}, adjust={}, len={}", offset, adjust, len);
  57. return m_device.strong_ref()->write(fd, offset + adjust, inbuf, len);
  58. }
  59. bool DiskPartition::can_write(const OpenFileDescription& fd, size_t offset) const
  60. {
  61. unsigned adjust = m_metadata.start_block() * block_size();
  62. dbgln_if(OFFD_DEBUG, "DiskPartition::can_write offset={}, adjust={}", offset, adjust);
  63. return m_device.strong_ref()->can_write(fd, offset + adjust);
  64. }
  65. StringView DiskPartition::class_name() const
  66. {
  67. return "DiskPartition";
  68. }
  69. }