Check journal entry size when checking block checksums
parent
d22d56f90a
commit
ddb078d5a7
|
@ -833,54 +833,72 @@ int blockstore_init_journal::handle_journal_part(void *buf, uint64_t done_pos, u
|
||||||
}
|
}
|
||||||
else if (je->small_write.len > 0)
|
else if (je->small_write.len > 0)
|
||||||
{
|
{
|
||||||
uint32_t *block_csums = (uint32_t*)((uint8_t*)je + sizeof(journal_entry_small_write) + bs->dsk.clean_entry_bitmap_size);
|
// FIXME: deduplicate with disk_tool_journal.cpp
|
||||||
|
// like in enqueue_write()
|
||||||
uint32_t start = je->small_write.offset / bs->dsk.csum_block_size;
|
uint32_t start = je->small_write.offset / bs->dsk.csum_block_size;
|
||||||
uint32_t end = (je->small_write.offset+je->small_write.len-1) / bs->dsk.csum_block_size;
|
uint32_t end = (je->small_write.offset+je->small_write.len-1) / bs->dsk.csum_block_size;
|
||||||
int sd_num = 0;
|
uint32_t data_csum_size = (end-start+1) * (bs->dsk.data_csum_type & 0xFF);
|
||||||
size_t sd_pos = 0;
|
uint32_t required_size = sizeof(journal_entry_small_write) + bs->dsk.clean_entry_bitmap_size + data_csum_size;
|
||||||
for (uint32_t pos = start; pos <= end; pos++, block_csums++)
|
if (je->size != required_size)
|
||||||
{
|
{
|
||||||
size_t block_left = (pos == start
|
printf(
|
||||||
? (start == end
|
"Journal entry data has invalid size for small_write%s oid=%lx:%lx ver=%lu offset=%u len=%u - should be %u bytes but is %u bytes\n",
|
||||||
? je->small_write.len
|
je->type == JE_SMALL_WRITE_INSTANT ? "_instant" : "",
|
||||||
: bs->dsk.csum_block_size - je->small_write.offset%bs->dsk.csum_block_size)
|
je->small_write.oid.inode, je->small_write.oid.stripe, je->small_write.version,
|
||||||
: (pos < end
|
je->small_write.offset, je->small_write.len,
|
||||||
? bs->dsk.csum_block_size
|
required_size, je->size
|
||||||
: (je->small_write.offset + je->small_write.len)%bs->dsk.csum_block_size));
|
);
|
||||||
if (pos > start && pos == end && block_left == 0)
|
data_csum_valid = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int sd_num = 0;
|
||||||
|
size_t sd_pos = 0;
|
||||||
|
uint32_t *block_csums = (uint32_t*)((uint8_t*)je + sizeof(journal_entry_small_write) + bs->dsk.clean_entry_bitmap_size);
|
||||||
|
for (uint32_t pos = start; pos <= end; pos++, block_csums++)
|
||||||
{
|
{
|
||||||
// full last block
|
size_t block_left = (pos == start
|
||||||
block_left = bs->dsk.csum_block_size;
|
? (start == end
|
||||||
}
|
? je->small_write.len
|
||||||
uint32_t block_crc32 = 0;
|
: bs->dsk.csum_block_size - je->small_write.offset%bs->dsk.csum_block_size)
|
||||||
while (block_left > 0)
|
: (pos < end
|
||||||
{
|
? bs->dsk.csum_block_size
|
||||||
assert(sd_num < small_write_data.size());
|
: (je->small_write.offset + je->small_write.len)%bs->dsk.csum_block_size));
|
||||||
if (small_write_data[sd_num].iov_len >= sd_pos+block_left)
|
if (pos > start && pos == end && block_left == 0)
|
||||||
{
|
{
|
||||||
block_crc32 = crc32c(block_crc32, (uint8_t*)small_write_data[sd_num].iov_base+sd_pos, block_left);
|
// full last block
|
||||||
sd_pos += block_left;
|
block_left = bs->dsk.csum_block_size;
|
||||||
|
}
|
||||||
|
uint32_t block_crc32 = 0;
|
||||||
|
while (block_left > 0)
|
||||||
|
{
|
||||||
|
assert(sd_num < small_write_data.size());
|
||||||
|
if (small_write_data[sd_num].iov_len >= sd_pos+block_left)
|
||||||
|
{
|
||||||
|
block_crc32 = crc32c(block_crc32, (uint8_t*)small_write_data[sd_num].iov_base+sd_pos, block_left);
|
||||||
|
sd_pos += block_left;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
block_crc32 = crc32c(block_crc32, (uint8_t*)small_write_data[sd_num].iov_base+sd_pos, small_write_data[sd_num].iov_len-sd_pos);
|
||||||
|
block_left -= (small_write_data[sd_num].iov_len-sd_pos);
|
||||||
|
sd_pos = 0;
|
||||||
|
sd_num++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (block_crc32 != *block_csums)
|
||||||
|
{
|
||||||
|
printf(
|
||||||
|
"Journal entry data is corrupt for small_write%s oid=%lx:%lx ver=%lu offset=%u len=%u - block %u crc32 %x != %x\n",
|
||||||
|
je->type == JE_SMALL_WRITE_INSTANT ? "_instant" : "",
|
||||||
|
je->small_write.oid.inode, je->small_write.oid.stripe, je->small_write.version,
|
||||||
|
je->small_write.offset, je->small_write.len,
|
||||||
|
pos, block_crc32, *block_csums
|
||||||
|
);
|
||||||
|
data_csum_valid = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
block_crc32 = crc32c(block_crc32, (uint8_t*)small_write_data[sd_num].iov_base+sd_pos, small_write_data[sd_num].iov_len-sd_pos);
|
|
||||||
block_left -= (small_write_data[sd_num].iov_len-sd_pos);
|
|
||||||
sd_pos = 0;
|
|
||||||
sd_num++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (block_crc32 != *block_csums)
|
|
||||||
{
|
|
||||||
printf(
|
|
||||||
"Journal entry data is corrupt for small_write%s oid=%lx:%lx ver=%lu offset=%u len=%u - block %u crc32 %x != %x\n",
|
|
||||||
je->type == JE_SMALL_WRITE_INSTANT ? "_instant" : "",
|
|
||||||
je->small_write.oid.inode, je->small_write.oid.stripe, je->small_write.version,
|
|
||||||
je->small_write.offset, je->small_write.len,
|
|
||||||
pos, block_crc32, *block_csums
|
|
||||||
);
|
|
||||||
data_csum_valid = false;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue