From: Di Wang Date: Mon, 5 Oct 2015 03:34:41 +0000 (-0700) Subject: LU-7039 llog: skip to next chunk for corrupt record X-Git-Tag: 2.7.63~30 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=refs%2Fchanges%2F40%2F16740%2F3;p=fs%2Flustre-release.git LU-7039 llog: skip to next chunk for corrupt record Skip to next chunk if current record is corrupted. Signed-off-by: Di Wang Change-Id: I7729ca1b10646fa796a3f94aabe39d8d36cf613a Reviewed-on: http://review.whamcloud.com/16740 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- diff --git a/lustre/utils/llog_reader.c b/lustre/utils/llog_reader.c index 5b2cb7c..f4644c5 100644 --- a/lustre/utils/llog_reader.c +++ b/lustre/utils/llog_reader.c @@ -258,9 +258,10 @@ int llog_pack_buffer(int fd, struct llog_log_hdr **llog, ptr = file_buf + le32_to_cpu((*llog)->llh_hdr.lrh_len); i = 0; - while (i < recs_num) { + while (ptr < (file_buf + file_size)) { struct llog_rec_hdr *cur_rec; int idx; + unsigned long offset; if (ptr + sizeof(struct llog_rec_hdr) > file_buf + file_size) { @@ -273,10 +274,17 @@ int llog_pack_buffer(int fd, struct llog_log_hdr **llog, cur_rec = (struct llog_rec_hdr *)ptr; idx = le32_to_cpu(cur_rec->lrh_index); recs_pr[i] = cur_rec; - - if (ext2_test_bit(idx, LLOG_HDR_BITMAP(*llog))) { - printf("rec #%d type=%x len=%u\n", idx, - cur_rec->lrh_type, cur_rec->lrh_len); + offset = (unsigned long)ptr - (unsigned long)file_buf; + if (cur_rec->lrh_len == 0 || + cur_rec->lrh_len > (*llog)->llh_hdr.lrh_len) { + cur_rec->lrh_len = (*llog)->llh_hdr.lrh_len - + offset % (*llog)->llh_hdr.lrh_len; + printf("off %lu skip %u to next chunk.\n", offset, + cur_rec->lrh_len); + i--; + } else if (ext2_test_bit(idx, LLOG_HDR_BITMAP(*llog))) { + printf("rec #%d type=%x len=%u offset %lu\n", idx, + cur_rec->lrh_type, cur_rec->lrh_len, offset); } else { printf("Bit %d of %d not set\n", idx, recs_num); cur_rec->lrh_id = CANCELLED;