Skip to content

Commit

Permalink
Merge pull request ceph#3764 from ceph/wip-10919
Browse files Browse the repository at this point in the history
cls_rbd: invalidate bufferlist CRC when updating object map

Reviewed-by: Josh Durgin <[email protected]>
  • Loading branch information
jdurgin committed Feb 20, 2015
2 parents 54dd411 + 55d3db9 commit c0e897e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
11 changes: 4 additions & 7 deletions src/common/bit_vector.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,7 @@ void BitVector<_b>::encode_data(bufferlist& bl, uint64_t byte_offset,

bufferlist bit;
bit.substr_of(m_data, byte_offset, len);
m_data_crcs[byte_offset / CEPH_PAGE_SIZE] =
ceph_crc32c(0, reinterpret_cast<unsigned char*>(bit.c_str()),
bit.length());
m_data_crcs[byte_offset / CEPH_PAGE_SIZE] = bit.crc32c(0);

bl.claim_append(bit);
byte_offset += CEPH_PAGE_SIZE;
Expand Down Expand Up @@ -388,11 +386,10 @@ typename BitVector<_b>::Reference& BitVector<_b>::Reference::operator=(uint8_t v
uint64_t shift;
this->m_bit_vector.compute_index(this->m_offset, &index, &shift);

// TODO: find out why bufferlist doesn't support char& operator[]()
uint8_t mask = MASK << shift;
char* packed_data = this->m_bit_vector.m_data.c_str();
uint8_t packed_value = (packed_data[index] & ~mask) | ((v << shift) & mask);
packed_data[index] = packed_value;
char packed_value = (this->m_bit_vector.m_data[index] & ~mask) |
((v << shift) & mask);
this->m_bit_vector.m_data.copy_in(index, 1, &packed_value);
return *this;
}

Expand Down
21 changes: 12 additions & 9 deletions src/test/common/test_bit_vector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -202,27 +202,30 @@ TYPED_TEST(BitVectorTest, header_crc) {
}

TYPED_TEST(BitVectorTest, data_crc) {
typename TestFixture::bit_vector_t bit_vector;
typename TestFixture::bit_vector_t bit_vector1;
typename TestFixture::bit_vector_t bit_vector2;

uint64_t elements_per_byte = 8 / bit_vector.BIT_COUNT;
bit_vector.resize((CEPH_PAGE_SIZE + 1) * elements_per_byte);
uint64_t elements_per_byte = 8 / bit_vector1.BIT_COUNT;
bit_vector1.resize((CEPH_PAGE_SIZE + 1) * elements_per_byte);
bit_vector2.resize((CEPH_PAGE_SIZE + 1) * elements_per_byte);

uint64_t byte_offset;
uint64_t byte_length;
bit_vector.get_data_extents(0, bit_vector.size(), &byte_offset, &byte_length);
bit_vector1.get_data_extents(0, bit_vector1.size(), &byte_offset,
&byte_length);

bufferlist data;
bit_vector.encode_data(data, byte_offset, byte_length);
bit_vector1.encode_data(data, byte_offset, byte_length);

bufferlist::iterator data_it = data.begin();
bit_vector.decode_data(data_it, byte_offset);
bit_vector1.decode_data(data_it, byte_offset);

bit_vector[bit_vector.size() - 1] = 1;
bit_vector2[bit_vector2.size() - 1] = 1;

bufferlist dummy_data;
bit_vector.encode_data(dummy_data, byte_offset, byte_length);
bit_vector2.encode_data(dummy_data, byte_offset, byte_length);

data_it = data.begin();
ASSERT_THROW(bit_vector.decode_data(data_it, byte_offset),
ASSERT_THROW(bit_vector2.decode_data(data_it, byte_offset),
buffer::malformed_input);
}

0 comments on commit c0e897e

Please sign in to comment.