diff --git a/base/io_generator.cc b/base/io_generator.cc index 0543d31..a808a6c 100644 --- a/base/io_generator.cc +++ b/base/io_generator.cc @@ -115,8 +115,7 @@ namespace { class base_io_generator: public io_generator { public: base_io_generator(io_generator_options const &opts); - virtual bool has_next(); - virtual void next(base::io &next_io); + virtual bool next(base::io &next_io); private: offset_generator::ptr @@ -140,19 +139,17 @@ namespace { io_size_total_(opts.io_size_) { } - bool base_io_generator::has_next() { - return io_size_finished_ < io_size_total_; - } - - void base_io_generator::next(base::io &next_io) { + bool base_io_generator::next(base::io &next_io) { if (io_size_finished_ >= io_size_total_) - throw std::runtime_error(""); + return false; next_io.op_ = op_gen_->next_op(); next_io.sector_ = offset_gen_->next_offset(); next_io.size_ = block_size_; io_size_finished_ += block_size_; + + return true; } offset_generator::ptr diff --git a/base/io_generator.h b/base/io_generator.h index 4a33550..16a78d9 100644 --- a/base/io_generator.h +++ b/base/io_generator.h @@ -42,8 +42,7 @@ namespace base { public: typedef std::shared_ptr ptr; - virtual bool has_next() = 0; - virtual void next(base::io &next_io) = 0; + virtual bool next(base::io &next_io) = 0; }; io_generator::ptr diff --git a/thin-provisioning/thin_generate_mappings.cc b/thin-provisioning/thin_generate_mappings.cc index a366eba..1a124bb 100644 --- a/thin-provisioning/thin_generate_mappings.cc +++ b/thin-provisioning/thin_generate_mappings.cc @@ -93,10 +93,8 @@ namespace { io_generator::ptr gen = create_io_generator(opts); base::io io; - while (gen->has_next()) { + while (gen->next(io)) { // TODO: support io.size_ - gen->next(io); - switch (io.op_) { case base::REQ_OP_READ: process_read(td, pool, io.sector_); @@ -131,10 +129,10 @@ thin_generate_mappings_cmd::usage(std::ostream &out) const << " {-h|--help}\n" << " {-o|--output} \n" << " {--dev-id} \n" - << " {--offset} \n" - << " {--io-size} \n" + << " {--offset} \n" + << " {--io-size} \n" << " {--rw write|trim|randwrite|randtrim|randtw}\n" - << " {--size} \n" + << " {--size} \n" << " {-V|--version}" << endl; } diff --git a/thin-provisioning/thin_pool.cc b/thin-provisioning/thin_pool.cc index 3bdc9e7..3a34ba8 100644 --- a/thin-provisioning/thin_pool.cc +++ b/thin-provisioning/thin_pool.cc @@ -72,13 +72,16 @@ thin::insert(block_address thin_block, block_address data_block) { uint64_t key[2] = {dev_, thin_block}; - ++details_.mapped_blocks_; - changed_ = true; - mapping_tree_detail::block_time bt; bt.block_ = data_block; bt.time_ = pool_.get_time(); - return pool_.md_->mappings_->insert(key, bt); + bool inserted = pool_.md_->mappings_->insert(key, bt); + + changed_ = true; + if (inserted) + ++details_.mapped_blocks_; + + return inserted; } void