diff --git a/src/blockstore_init.cpp b/src/blockstore_init.cpp index d1547cfe..d90e3a51 100644 --- a/src/blockstore_init.cpp +++ b/src/blockstore_init.cpp @@ -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) { - 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 end = (je->small_write.offset+je->small_write.len-1) / bs->dsk.csum_block_size; - int sd_num = 0; - size_t sd_pos = 0; - for (uint32_t pos = start; pos <= end; pos++, block_csums++) + uint32_t data_csum_size = (end-start+1) * (bs->dsk.data_csum_type & 0xFF); + uint32_t required_size = sizeof(journal_entry_small_write) + bs->dsk.clean_entry_bitmap_size + data_csum_size; + if (je->size != required_size) { - size_t block_left = (pos == start - ? (start == end - ? je->small_write.len - : bs->dsk.csum_block_size - je->small_write.offset%bs->dsk.csum_block_size) - : (pos < end - ? bs->dsk.csum_block_size - : (je->small_write.offset + je->small_write.len)%bs->dsk.csum_block_size)); - if (pos > start && pos == end && block_left == 0) + printf( + "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->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, + required_size, je->size + ); + 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 - 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) + size_t block_left = (pos == start + ? (start == end + ? je->small_write.len + : bs->dsk.csum_block_size - je->small_write.offset%bs->dsk.csum_block_size) + : (pos < end + ? bs->dsk.csum_block_size + : (je->small_write.offset + je->small_write.len)%bs->dsk.csum_block_size)); + 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); - sd_pos += block_left; + // full last block + 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; } - 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; } } }