• Hou Tao's avatar
    dm btree: increase rebalance threshold in __rebalance2() · 474e5595
    Hou Tao authored
    We got the following warnings from thin_check during thin-pool setup:
    
      $ thin_check /dev/vdb
      examining superblock
      examining devices tree
        missing devices: [1, 84]
          too few entries in btree_node: 41, expected at least 42 (block 138, max_entries = 126)
      examining mapping tree
    
    The phenomenon is the number of entries in one node of details_info tree is
    less than (max_entries / 3). And it can be easily reproduced by the following
    procedures:
    
      $ new a thin pool
      $ presume the max entries of details_info tree is 126
      $ new 127 thin devices (e.g. 1~127) to make the root node being full
        and then split
      $ remove the first 43 (e.g. 1~43) thin devices to make the children
        reblance repeatedly
      $ stop the thin pool
      $ thin_check
    
    The root cause is that the B-tree removal procedure in __rebalance2()
    doesn't guarantee the invariance: the minimal number of entries in
    non-root node should be >= (max_entries / 3).
    
    Simply fix the problem by increasing the rebalance threshold to
    make sure the number of entries in each child will be greater
    than or equal to (max_entries / 3 + 1), so no matter which
    child is used for removal, the number will still be valid.
    
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarHou Tao <houtao1@huawei.com>
    Acked-by: default avatarJoe Thornber <ejt@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    474e5595
dm-btree-remove.c 17.4 KB