From a5614f7db23e270fc1e694bf1be31cbe0640c4ee Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Tue, 2 Jun 2020 11:49:14 +0800 Subject: [PATCH] [thin_pool] Complete device deletion --- thin-provisioning/thin_pool.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/thin-provisioning/thin_pool.cc b/thin-provisioning/thin_pool.cc index 4e6319b..5bfb487 100644 --- a/thin-provisioning/thin_pool.cc +++ b/thin-provisioning/thin_pool.cc @@ -184,7 +184,28 @@ void thin_pool::del(thin_dev_t dev) { uint64_t key[1] = {dev}; + + thin::ptr td = open_device(dev); + if (td->open_count_ > 1) { + close_device(td); + throw std::runtime_error("device busy"); + } + + thin_devices_.erase(dev); + + dev_tree::maybe_value mtree_root = md_->mappings_top_level_->lookup(key); + if (!device_exists(dev) || !mtree_root) + throw std::runtime_error("unknown device"); + + // TODO: trigger subtree deletion from the mtree_ref_counter, + // like the kenrel subtree_dec() does. + single_mapping_tree mtree(*md_->tm_, *mtree_root, + mapping_tree_detail::block_time_ref_counter(md_->data_sm_)); + mtree.destroy(); + + md_->details_->remove(key); md_->mappings_top_level_->remove(key); + md_->mappings_->set_root(md_->mappings_top_level_->get_root()); // FIXME: ugly } void