[thin_show_dups] Support fractions of a pool block size
This commit is contained in:
		
							
								
								
									
										113
									
								
								thin-provisioning/fixed_chunk_stream.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								thin-provisioning/fixed_chunk_stream.cc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,113 @@
 | 
			
		||||
#include "thin-provisioning/fixed_chunk_stream.h"
 | 
			
		||||
 | 
			
		||||
using namespace thin_provisioning;
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
fixed_chunk_stream::fixed_chunk_stream(chunk_stream &stream, unsigned chunk_size)
 | 
			
		||||
	: index_(0),
 | 
			
		||||
	  stream_(stream),
 | 
			
		||||
	  chunk_size_(chunk_size),
 | 
			
		||||
	  big_chunk_(0) {
 | 
			
		||||
	next_big_chunk();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fixed_chunk_stream::~fixed_chunk_stream()
 | 
			
		||||
{
 | 
			
		||||
	put_big_chunk();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bcache::block_address
 | 
			
		||||
fixed_chunk_stream::size() const
 | 
			
		||||
{
 | 
			
		||||
	return stream_.size();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
fixed_chunk_stream::rewind()
 | 
			
		||||
{
 | 
			
		||||
	// FIXME: not complete
 | 
			
		||||
	index_ = 0;
 | 
			
		||||
	stream_.rewind();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
fixed_chunk_stream::next(bcache::block_address count)
 | 
			
		||||
{
 | 
			
		||||
	while (count--) {
 | 
			
		||||
		index_++;
 | 
			
		||||
		advance_one();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return !eof();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
fixed_chunk_stream::eof() const
 | 
			
		||||
{
 | 
			
		||||
	return stream_.eof();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
chunk const &
 | 
			
		||||
fixed_chunk_stream::get()
 | 
			
		||||
{
 | 
			
		||||
	assert(big_chunk_);
 | 
			
		||||
 | 
			
		||||
	little_chunk_.len_ = little_e_ - little_b_;
 | 
			
		||||
	little_chunk_.offset_ = big_chunk_->offset_ + little_chunk_.len_;
 | 
			
		||||
 | 
			
		||||
	little_chunk_.mem_.begin = little_b_;
 | 
			
		||||
	little_chunk_.mem_.end = little_e_;
 | 
			
		||||
 | 
			
		||||
	return little_chunk_;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
fixed_chunk_stream::put(chunk const &c)
 | 
			
		||||
{
 | 
			
		||||
	// noop
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
fixed_chunk_stream::next_big_chunk()
 | 
			
		||||
{
 | 
			
		||||
	put_big_chunk();
 | 
			
		||||
 | 
			
		||||
	if (!stream_.next())
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	big_chunk_ = &stream_.get();
 | 
			
		||||
	little_b_ = little_e_ = last_hashed_ = big_chunk_->mem_.begin;
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
fixed_chunk_stream::advance_one()
 | 
			
		||||
{
 | 
			
		||||
	uint8_t *big_e;
 | 
			
		||||
 | 
			
		||||
	big_e = big_chunk_->mem_.end;
 | 
			
		||||
	little_b_ = little_e_;
 | 
			
		||||
 | 
			
		||||
	if (little_b_ >= big_e) {
 | 
			
		||||
		if (next_big_chunk())
 | 
			
		||||
			big_e = big_chunk_->mem_.end;
 | 
			
		||||
		else
 | 
			
		||||
			return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	little_e_ += chunk_size_;
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
fixed_chunk_stream::put_big_chunk()
 | 
			
		||||
{
 | 
			
		||||
	if (big_chunk_)
 | 
			
		||||
		stream_.put(*big_chunk_);
 | 
			
		||||
 | 
			
		||||
	big_chunk_ = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//----------------------------------------------------------------
 | 
			
		||||
		Reference in New Issue
	
	Block a user