From 779f8e1fd431f3b3438109fccee8374c19f39b80 Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Fri, 11 Jan 2013 20:16:40 +0000 Subject: [PATCH] Introduce a mode enum to block_io<> --- persistent-data/block.h | 9 +++++++-- persistent-data/block.tcc | 26 +++++++++++++++++++++----- thin-provisioning/metadata.cc | 6 +++++- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/persistent-data/block.h b/persistent-data/block.h index 3236d17..d463083 100644 --- a/persistent-data/block.h +++ b/persistent-data/block.h @@ -82,8 +82,12 @@ namespace persistent_data { class block_io : private boost::noncopyable { public: typedef boost::shared_ptr ptr; + enum mode { + READ_ONLY, + READ_WRITE, + }; - block_io(std::string const &path, block_address nr_blocks, bool writeable = false); + block_io(std::string const &path, block_address nr_blocks, mode m); ~block_io(); block_address get_nr_blocks() const { @@ -96,6 +100,7 @@ namespace persistent_data { private: int fd_; block_address nr_blocks_; + mode mode_; bool writeable_; }; @@ -107,7 +112,7 @@ namespace persistent_data { block_manager(std::string const &path, block_address nr_blocks, unsigned max_concurrent_locks, - bool writeable = false); + typename block_io::mode m); class validator { public: diff --git a/persistent-data/block.tcc b/persistent-data/block.tcc index 8f2594d..a7faae3 100644 --- a/persistent-data/block.tcc +++ b/persistent-data/block.tcc @@ -36,12 +36,28 @@ using namespace std; //---------------------------------------------------------------- template -block_io::block_io(std::string const &path, block_address nr_blocks, bool writeable) +block_io::block_io(std::string const &path, block_address nr_blocks, mode m) : nr_blocks_(nr_blocks), - writeable_(writeable) + mode_(m) { + int fd_mode = O_DIRECT | O_SYNC; + + switch (m) { + case READ_ONLY: + fd_mode |= O_RDONLY; + break; + + case READ_WRITE: + fd_mode |= O_RDWR; + break; + + default: + throw runtime_error("unsupported mode"); + break; + } + // fd_ = ::open(path.c_str(), writeable ? (O_RDWR | O_CREAT) : O_RDONLY, 0666); - fd_ = ::open(path.c_str(), O_DIRECT | O_SYNC | (writeable ? O_RDWR : O_RDONLY), 0666); + fd_ = ::open(path.c_str(), fd_mode, 0666); if (fd_ < 0) throw std::runtime_error("couldn't open file"); } @@ -237,8 +253,8 @@ template block_manager::block_manager(std::string const &path, block_address nr_blocks, unsigned max_concurrent_blocks, - bool writeable) - : io_(new block_io(path, nr_blocks, writeable)), + typename block_io::mode mode) + : io_(new block_io(path, nr_blocks, mode)), cache_(max(64u, max_concurrent_blocks)), tracker_(0, nr_blocks) { diff --git a/thin-provisioning/metadata.cc b/thin-provisioning/metadata.cc index 276a7f3..ccb6eba 100644 --- a/thin-provisioning/metadata.cc +++ b/thin-provisioning/metadata.cc @@ -91,7 +91,11 @@ namespace { transaction_manager::ptr open_tm(string const &dev_path, bool writeable) { block_address nr_blocks = get_nr_blocks(dev_path); - block_manager<>::ptr bm(new block_manager<>(dev_path, nr_blocks, 1, writeable)); + typename block_io<>::mode m = writeable ? + block_io<>::READ_WRITE : + block_io<>::READ_ONLY; + + block_manager<>::ptr bm(new block_manager<>(dev_path, nr_blocks, 1, m)); space_map::ptr sm(new core_map(nr_blocks)); sm->inc(SUPERBLOCK_LOCATION); transaction_manager::ptr tm(new transaction_manager(bm, sm));