]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h
update ceph source to reef 18.2.1
[ceph.git] / ceph / src / crimson / os / seastore / lba_manager / btree / lba_btree_node.h
index 62ceae6cc462a4c7ef7c33a74c8623ed91bb6c94..ffce2c1b5e68466dd6d80c07c622074cd4146128 100644 (file)
@@ -33,17 +33,18 @@ using LBANode = FixedKVNode<laddr_t>;
  */
 struct lba_map_val_t {
   extent_len_t len = 0;  ///< length of mapping
-  paddr_t paddr;         ///< physical addr of mapping
+  pladdr_t pladdr;         ///< physical addr of mapping or
+                          //   laddr of a physical lba mapping(see btree_lba_manager.h)
   uint32_t refcount = 0; ///< refcount
   uint32_t checksum = 0; ///< checksum of original block written at paddr (TODO)
 
   lba_map_val_t() = default;
   lba_map_val_t(
     extent_len_t len,
-    paddr_t paddr,
+    pladdr_t pladdr,
     uint32_t refcount,
     uint32_t checksum)
-    : len(len), paddr(paddr), refcount(refcount), checksum(checksum) {}
+    : len(len), pladdr(pladdr), refcount(refcount), checksum(checksum) {}
   bool operator==(const lba_map_val_t&) const = default;
 };
 
@@ -103,14 +104,14 @@ using LBAInternalNodeRef = LBAInternalNode::Ref;
  *   size       : uint32_t[1]                4b
  *   (padding)  :                            4b
  *   meta       : lba_node_meta_le_t[3]      (1*24)b
- *   keys       : laddr_t[170]               (145*8)b
- *   values     : lba_map_val_t[170]         (145*20)b
+ *   keys       : laddr_t[170]               (140*8)b
+ *   values     : lba_map_val_t[170]         (140*21)b
  *                                           = 4092
  *
  * TODO: update FixedKVNodeLayout to handle the above calculation
  * TODO: the above alignment probably isn't portable without further work
  */
-constexpr size_t LEAF_NODE_CAPACITY = 145;
+constexpr size_t LEAF_NODE_CAPACITY = 140;
 
 /**
  * lba_map_val_le_t
@@ -119,7 +120,7 @@ constexpr size_t LEAF_NODE_CAPACITY = 145;
  */
 struct lba_map_val_le_t {
   extent_len_le_t len = init_extent_len_le(0);
-  paddr_le_t paddr;
+  pladdr_le_t pladdr;
   ceph_le32 refcount{0};
   ceph_le32 checksum{0};
 
@@ -127,12 +128,12 @@ struct lba_map_val_le_t {
   lba_map_val_le_t(const lba_map_val_le_t &) = default;
   explicit lba_map_val_le_t(const lba_map_val_t &val)
     : len(init_extent_len_le(val.len)),
-      paddr(paddr_le_t(val.paddr)),
+      pladdr(pladdr_le_t(val.pladdr)),
       refcount(val.refcount),
       checksum(val.checksum) {}
 
   operator lba_map_val_t() const {
-    return lba_map_val_t{ len, paddr, refcount, checksum };
+    return lba_map_val_t{ len, pladdr, refcount, checksum };
   }
 };
 
@@ -195,7 +196,9 @@ struct LBALeafNode
       // child-ptr may already be correct, see LBAManager::update_mappings()
       this->update_child_ptr(iter, nextent);
     }
-    val.paddr = this->maybe_generate_relative(val.paddr);
+    if (val.pladdr.is_paddr()) {
+      val.pladdr = maybe_generate_relative(val.pladdr.get_paddr());
+    }
     return this->journal_update(
       iter,
       val,
@@ -214,7 +217,9 @@ struct LBALeafNode
       addr,
       (void*)nextent);
     this->insert_child_ptr(iter, nextent);
-    val.paddr = this->maybe_generate_relative(val.paddr);
+    if (val.pladdr.is_paddr()) {
+      val.pladdr = maybe_generate_relative(val.pladdr.get_paddr());
+    }
     this->journal_insert(
       iter,
       addr,
@@ -245,9 +250,10 @@ struct LBALeafNode
     if (this->is_initial_pending()) {
       for (auto i = from; i != to; ++i) {
        auto val = i->get_val();
-       if (val.paddr.is_relative()) {
-         assert(val.paddr.is_block_relative());
-         val.paddr = this->get_paddr().add_relative(val.paddr);
+       if (val.pladdr.is_paddr()
+           && val.pladdr.get_paddr().is_relative()) {
+         assert(val.pladdr.get_paddr().is_block_relative());
+         val.pladdr = this->get_paddr().add_relative(val.pladdr.get_paddr());
          i->set_val(val);
        }
       }
@@ -260,10 +266,10 @@ struct LBALeafNode
     if (this->is_initial_pending()) {
       for (auto i = from; i != to; ++i) {
        auto val = i->get_val();
-       if (val.paddr.is_relative()) {
-         auto val = i->get_val();
-         assert(val.paddr.is_record_relative());
-         val.paddr = val.paddr.block_relative_to(this->get_paddr());
+       if (val.pladdr.is_paddr()
+           && val.pladdr.get_paddr().is_relative()) {
+         assert(val.pladdr.get_paddr().is_record_relative());
+         val.pladdr = val.pladdr.get_paddr().block_relative_to(this->get_paddr());
          i->set_val(val);
        }
       }