diff --git a/thin-provisioning/thin_pool.cc b/thin-provisioning/thin_pool.cc index 302a5e9..cea270e 100644 --- a/thin-provisioning/thin_pool.cc +++ b/thin-provisioning/thin_pool.cc @@ -16,6 +16,7 @@ // with thin-provisioning-tools. If not, see // . +#include "persistent-data/math_utils.h" #include "thin-provisioning/thin_pool.h" #include @@ -336,3 +337,39 @@ thin_pool::write_changed_details() } //---------------------------------------------------------------- + +void +thin_provisioning::process_read(thin::ptr td, thin_pool::ptr tp, + sector_t offset) +{ + block_address blocknr = base::div_up(offset, tp->get_data_block_size()); + td->lookup(blocknr); +} + +void +thin_provisioning::process_write(thin::ptr td, thin_pool::ptr tp, + sector_t offset) +{ + block_address blocknr = base::div_up(offset, tp->get_data_block_size()); + thin::maybe_address result = td->lookup(blocknr); + if (!!result && !result->shared_) + return; + // TODO: handle out-of-space errors + block_address data_block = tp->alloc_data_block(); + td->insert(blocknr, data_block); +} + +void +thin_provisioning::process_discard(thin::ptr td, thin_pool::ptr tp, + sector_t offset) +{ + block_address blocknr = base::div_up(offset, tp->get_data_block_size()); + thin::maybe_address result = td->lookup(blocknr); + if (!result) + return; + td->remove(blocknr); + if (!result->shared_) + tp->free_data_block(result->block_); +} + +//---------------------------------------------------------------- diff --git a/thin-provisioning/thin_pool.h b/thin-provisioning/thin_pool.h index 6151677..ce6e18e 100644 --- a/thin-provisioning/thin_pool.h +++ b/thin-provisioning/thin_pool.h @@ -109,6 +109,10 @@ namespace thin_provisioning { metadata::ptr md_; device_map thin_devices_; }; + + void process_read(thin::ptr td, thin_pool::ptr tp, sector_t offset); + void process_write(thin::ptr td, thin_pool::ptr tp, sector_t offset); + void process_discard(thin::ptr td, thin_pool::ptr tp, sector_t offset); }; //----------------------------------------------------------------