CircularBoundedJournal::write_header()
{
LOG_PREFIX(CircularBoundedJournal::write_header);
- ceph::bufferlist bl;
- try {
- bl = encode_header();
- } catch (ceph::buffer::error &e) {
- DEBUG("unable to encode header block from underlying deivce");
- return crimson::ct_error::input_output_error::make();
- }
+ ceph::bufferlist bl = encode_header();
ceph_assert(bl.length() <= get_block_size());
DEBUG(
"sync header of CircularBoundedJournal, length {}",
bl.length());
assert(device);
- return device_write_bl(device->get_journal_start(), bl);
+ auto iter = bl.begin();
+ assert(bl.length() < get_block_size());
+ bufferptr bp = bufferptr(ceph::buffer::create_page_aligned(get_block_size()));
+ iter.copy(bl.length(), bp.c_str());
+ return device->write(device->get_journal_start(), std::move(bp)
+ ).handle_error(
+ write_ertr::pass_further{},
+ crimson::ct_error::assert_all{ "Invalid error device->write" }
+ );
}
seastar::future<> CircularBoundedJournal::finish_commit(transaction_type_t type) {
if (is_trim_transaction(type)) {
auto bp = bufferptr(ceph::buffer::create_page_aligned(super.block_size));
assert(bl.length() < super.block_size);
iter.copy(bl.length(), bp.c_str());
-
- return write(RBM_START_ADDRESS, bp);
+ return write(RBM_START_ADDRESS, std::move(bp));
}
read_ertr::future<rbm_metadata_header_t> RBMDevice::read_rbm_header(
rbm_abs_addr addr)
{
LOG_PREFIX(RBMDevice::read_rbm_header);
- bufferptr bptr =
- bufferptr(ceph::buffer::create_page_aligned(RBM_SUPERBLOCK_SIZE));
- bptr.zero();
- return read(
- addr,
- bptr
- ).safe_then([length=bptr.length(), this, bptr, FNAME]()
- -> read_ertr::future<rbm_metadata_header_t> {
- bufferlist bl;
- bl.append(bptr);
- auto p = bl.cbegin();
- rbm_metadata_header_t super_block;
- try {
- decode(super_block, p);
- }
- catch (ceph::buffer::error& e) {
- DEBUG("read_rbm_header: unable to decode rbm super block {}",
- e.what());
- return crimson::ct_error::enoent::make();
- }
- checksum_t crc = super_block.crc;
- bufferlist meta_b_header;
- super_block.crc = 0;
- encode(super_block, meta_b_header);
- assert(ceph::encoded_sizeof<rbm_metadata_header_t>(super_block) <
- super_block.block_size);
-
- // Do CRC verification only if data protection is not supported.
- if (is_data_protection_enabled() == false) {
- if (meta_b_header.crc32c(-1) != crc) {
- DEBUG("bad crc on super block, expected {} != actual {} ",
- meta_b_header.crc32c(-1), crc);
- return crimson::ct_error::input_output_error::make();
+ return seastar::do_with(
+ bufferptr(ceph::buffer::create_page_aligned(super.block_size)),
+ [this, addr, FNAME](auto &bptr) {
+ return read(
+ addr,
+ bptr
+ ).safe_then([length=bptr.length(), this, bptr, FNAME]()
+ -> read_ertr::future<rbm_metadata_header_t> {
+ bufferlist bl;
+ bl.append(bptr);
+ auto p = bl.cbegin();
+ rbm_metadata_header_t super_block;
+ try {
+ decode(super_block, p);
}
- } else {
- ceph_assert_always(crc == (checksum_t)-1);
- }
- super_block.crc = crc;
- super = super_block;
- DEBUG("got {} ", super);
- return read_ertr::future<rbm_metadata_header_t>(
- read_ertr::ready_future_marker{},
- super_block
- );
+ catch (ceph::buffer::error& e) {
+ DEBUG("read_rbm_header: unable to decode rbm super block {}",
+ e.what());
+ return crimson::ct_error::enoent::make();
+ }
+ checksum_t crc = super_block.crc;
+ bufferlist meta_b_header;
+ super_block.crc = 0;
+ encode(super_block, meta_b_header);
+ assert(ceph::encoded_sizeof<rbm_metadata_header_t>(super_block) <
+ super_block.block_size);
+
+ // Do CRC verification only if data protection is not supported.
+ if (is_data_protection_enabled() == false) {
+ if (meta_b_header.crc32c(-1) != crc) {
+ DEBUG("bad crc on super block, expected {} != actual {} ",
+ meta_b_header.crc32c(-1), crc);
+ return crimson::ct_error::input_output_error::make();
+ }
+ } else {
+ ceph_assert_always(crc == (checksum_t)-1);
+ }
+ super_block.crc = crc;
+ super = super_block;
+ DEBUG("got {} ", super);
+ return read_ertr::future<rbm_metadata_header_t>(
+ read_ertr::ready_future_marker{},
+ super_block
+ );
+ });
});
}
write_ertr::future<> NVMeBlockDevice::write(
uint64_t offset,
- bufferptr &bptr,
+ bufferptr &&bptr,
uint16_t stream) {
logger().debug(
"block: write offset {} len {}",
if (stream >= stream_id_count) {
supported_stream = WRITE_LIFE_NOT_SET;
}
- return io_device[supported_stream].dma_write(
- offset, bptr.c_str(), length).handle_exception(
- [](auto e) -> write_ertr::future<size_t> {
- logger().error("write: dma_write got error{}", e);
- return crimson::ct_error::input_output_error::make();
- }).then([length](auto result) -> write_ertr::future<> {
- if (result != length) {
- logger().error("write: dma_write got error with not proper length");
+ return seastar::do_with(
+ std::move(bptr),
+ [this, offset, length, supported_stream] (auto& bptr) {
+ return io_device[supported_stream].dma_write(
+ offset, bptr.c_str(), length).handle_exception(
+ [](auto e) -> write_ertr::future<size_t> {
+ logger().error("write: dma_write got error{}", e);
return crimson::ct_error::input_output_error::make();
- }
- return write_ertr::now();
+ }).then([length](auto result) -> write_ertr::future<> {
+ if (result != length) {
+ logger().error("write: dma_write got error with not proper length");
+ return crimson::ct_error::input_output_error::make();
+ }
+ return write_ertr::now();
+ });
});
}
write_ertr::future<> EphemeralRBMDevice::write(
uint64_t offset,
- bufferptr &bptr,
+ bufferptr &&bptr,
uint16_t stream) {
ceph_assert(buf);
logger().debug(