From 2c0d3719ea6ad48d538e62a82ebad63c0f11d1fd Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Mon, 21 Sep 2020 10:15:38 +0800 Subject: [PATCH] crimson/seastore: implement read/write_onode_root() Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/cache.h | 10 +++++++ .../lba_manager/btree/btree_lba_manager.cc | 3 ++- src/crimson/os/seastore/root_block.h | 1 + src/crimson/os/seastore/transaction_manager.h | 26 +++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index eff6c52dad0..5eb68051c81 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -119,6 +119,16 @@ public: using get_root_ret = get_root_ertr::future; get_root_ret get_root(Transaction &t); + /** + * get_root_fast + * + * returns t.root and assume it is already present/read in t + */ + RootBlockRef get_root_fast(Transaction &t) { + assert(t.root); + return t.root; + } + /** * get_extent * diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc index 2b424a578fd..a837ae37e62 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc @@ -36,7 +36,8 @@ BtreeLBAManager::mkfs_ret BtreeLBAManager::mkfs( 1, 0, root_leaf->get_paddr(), - make_record_relative_paddr(0)}; + make_record_relative_paddr(0), + L_ADDR_NULL}; return mkfs_ertr::now(); }); } diff --git a/src/crimson/os/seastore/root_block.h b/src/crimson/os/seastore/root_block.h index 25322d769ea..4a5024caa62 100644 --- a/src/crimson/os/seastore/root_block.h +++ b/src/crimson/os/seastore/root_block.h @@ -18,6 +18,7 @@ struct __attribute__((aligned(8), packed)) root_t { depth_t segment_depth = 0; paddr_t lba_root_addr; paddr_t segment_root; + laddr_t onode_root = L_ADDR_NULL; void adjust_addrs_from_base(paddr_t base) { if (lba_root_addr.is_relative()) { diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 18259a45b3c..674c33feabf 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -250,6 +250,32 @@ public: return segment_manager.release(id); } + /** + * read_onode_root + * + * Get onode-tree root logical address + */ + using read_onode_root_ertr = crimson::errorator< + crimson::ct_error::input_output_error + >; + using read_onode_root_ret = read_onode_root_ertr::future; + read_onode_root_ret read_onode_root(Transaction &t) { + return cache.get_root(t).safe_then([](auto croot) { + return croot->get_root().onode_root; + }); + } + + /** + * write_onode_root + * + * Write onode-tree root logical address, must be called after read. + */ + void write_onode_root(Transaction &t, laddr_t addr) { + auto croot = cache.get_root_fast(t); + croot = cache.duplicate_for_write(t, croot)->cast(); + croot->get_root().onode_root = addr; + } + ~TransactionManager(); private: -- 2.39.5