__u8 llch_compr_level:4, /* per-algorithm mapped level */
llch_chunk_log_bits:4;
__u32 llch_compr_size; /* bytes of compressed data */
- __u32 llch_reserved; /* unused, initialize to 0 */
- __u32 llch_uncompr_csum; /* crc32 of raw data, or 0 */
- __u32 llch_compr_csum; /* crc32 of compressed data, or 0 */
- __u32 llch_hdr_csum; /* crc32 of magic..compr_csum, or 0 */
+ __u32 llch_uncompr_size; /* bytes of uncompressed data */
+ __u32 llch_reserved; /* reserved for future use */
+ __u32 llch_compr_csum; /* crc32 of compressed data, or 0 */
+ __u32 llch_hdr_csum; /* crc32 of magic..compr_csum, or 0 */
};
#if defined(__cplusplus)
llch->llch_chunk_log_bits = chunk_bits - COMPR_CHUNK_MIN_BITS;
llch->llch_flags = 0;
llch->llch_compr_size = len;
- llch->llch_compr_csum = 0;
- llch->llch_uncompr_csum = 0;
+ llch->llch_uncompr_size = in_len;
llch->llch_reserved = 0;
+ llch->llch_compr_csum = 0;
llch->llch_hdr_csum = 0;
*out_len = len + sizeof(*llch);
lnbs[lnb_start].lnb_file_offset, rc);
GOTO(out, rc);
}
+ /* uncompressed size is not set by older clients, but older clients
+ * reliably zero unused parts of the header, so we skip if it's zero
+ */
+ if (llch->llch_uncompr_size != 0 && dst_size != llch->llch_uncompr_size) {
+ CERROR("%s: Compressed chunk at %llu invalid, uncompressed size from disk %d disagrees with result of decompression %d, rc: %d\n",
+ obd_name, lnbs[lnb_start].lnb_file_offset,
+ llch->llch_uncompr_size, dst_size, rc);
+ GOTO(out, rc = -EUCLEAN);
+ }
LASSERT(dst_size <= chunk_size);
/* now that we've successfully decompressed this chunk, we copy
(long long)(int)offsetof(struct ll_compr_hdr, llch_compr_size));
LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_compr_size) == 4, "found %lld\n",
(long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_compr_size));
- LASSERTF((int)offsetof(struct ll_compr_hdr, llch_reserved) == 16, "found %lld\n",
+ LASSERTF((int)offsetof(struct ll_compr_hdr, llch_uncompr_size) == 16, "found %lld\n",
+ (long long)(int)offsetof(struct ll_compr_hdr, llch_uncompr_size));
+ LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_size) == 4, "found %lld\n",
+ (long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_size));
+ LASSERTF((int)offsetof(struct ll_compr_hdr, llch_reserved) == 20, "found %lld\n",
(long long)(int)offsetof(struct ll_compr_hdr, llch_reserved));
LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_reserved) == 4, "found %lld\n",
(long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_reserved));
- LASSERTF((int)offsetof(struct ll_compr_hdr, llch_uncompr_csum) == 20, "found %lld\n",
- (long long)(int)offsetof(struct ll_compr_hdr, llch_uncompr_csum));
- LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_csum) == 4, "found %lld\n",
- (long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_csum));
LASSERTF((int)offsetof(struct ll_compr_hdr, llch_compr_csum) == 24, "found %lld\n",
(long long)(int)offsetof(struct ll_compr_hdr, llch_compr_csum));
LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_compr_csum) == 4, "found %lld\n",
CHECK_BITFIELD(ll_compr_hdr, llch_comp_level);
CHECK_BITFIELD(ll_compr_hdr, llch_chunk_log_bits);
CHECK_MEMBER(ll_compr_hdr, llch_compr_size);
+ CHECK_MEMBER(ll_compr_hdr, llch_uncompr_size);
CHECK_MEMBER(ll_compr_hdr, llch_reserved);
- CHECK_MEMBER(ll_compr_hdr, llch_uncompr_csum);
CHECK_MEMBER(ll_compr_hdr, llch_compr_csum);
CHECK_MEMBER(ll_compr_hdr, llch_hdr_csum);
(long long)(int)offsetof(struct ll_compr_hdr, llch_compr_size));
LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_compr_size) == 4, "found %lld\n",
(long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_compr_size));
- LASSERTF((int)offsetof(struct ll_compr_hdr, llch_reserved) == 16, "found %lld\n",
+ LASSERTF((int)offsetof(struct ll_compr_hdr, llch_uncompr_size) == 16, "found %lld\n",
+ (long long)(int)offsetof(struct ll_compr_hdr, llch_uncompr_size));
+ LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_size) == 4, "found %lld\n",
+ (long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_size));
+ LASSERTF((int)offsetof(struct ll_compr_hdr, llch_reserved) == 20, "found %lld\n",
(long long)(int)offsetof(struct ll_compr_hdr, llch_reserved));
LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_reserved) == 4, "found %lld\n",
(long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_reserved));
- LASSERTF((int)offsetof(struct ll_compr_hdr, llch_uncompr_csum) == 20, "found %lld\n",
- (long long)(int)offsetof(struct ll_compr_hdr, llch_uncompr_csum));
- LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_csum) == 4, "found %lld\n",
- (long long)(int)sizeof(((struct ll_compr_hdr *)0)->llch_uncompr_csum));
LASSERTF((int)offsetof(struct ll_compr_hdr, llch_compr_csum) == 24, "found %lld\n",
(long long)(int)offsetof(struct ll_compr_hdr, llch_compr_csum));
LASSERTF((int)sizeof(((struct ll_compr_hdr *)0)->llch_compr_csum) == 4, "found %lld\n",