From 01fb4edfd7bde7e495e767c5321235565cfadaee Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Mon, 5 Mar 2018 23:11:21 +0800 Subject: [PATCH] LU-10773 obdclass: yield cpu during changelog_block_trim_ext To avoid soft-lockup if there are too many records to be handled. The patch also filters out zero-sized records to avoid dead loop. Signed-off-by: Fan Yong Change-Id: Ia094f9153b5ef2602103d2ee13ee7ad3ffe6dc4f Reviewed-on: https://review.whamcloud.com/31516 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Mike Pershin Reviewed-by: Oleg Drokin --- lustre/obdclass/llog_osd.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lustre/obdclass/llog_osd.c b/lustre/obdclass/llog_osd.c index 2fee9d8..f25126d 100644 --- a/lustre/obdclass/llog_osd.c +++ b/lustre/obdclass/llog_osd.c @@ -822,8 +822,26 @@ static void changelog_block_trim_ext(struct llog_rec_hdr *hdr, extra_flags; } + if (unlikely(hdr->lrh_len == 0)) { + /* It is corruption case, we cannot know the next rec, + * jump to the last one directly to avoid dead loop. */ + LCONSOLE(D_WARNING, "Hit invalid llog record: " + "idx %u, type %u, id %u\n", + hdr->lrh_index, hdr->lrh_type, hdr->lrh_id); + hdr = llog_rec_hdr_next(last_hdr); + if (unlikely(hdr == last_hdr)) + LCONSOLE(D_WARNING, "The last record crashed: " + "idx %u, type %u, id %u\n", + hdr->lrh_index, hdr->lrh_type, + hdr->lrh_id); + break; + } + changelog_remap_rec(rec, rec->cr_flags & flags, xflag); hdr = llog_rec_hdr_next(hdr); + /* Yield CPU to avoid soft-lockup if there are too many records + * to be handled. */ + cond_resched(); } while ((char *)hdr <= (char *)last_hdr); } -- 1.8.3.1