From 20a603c42ecc1a5c6f1b3d5a0e31b2b323777abb Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Thu, 30 Aug 2018 21:08:57 +0800 Subject: [PATCH] LU-11419 lfsck: lfsck_namespace_shrink_linkea() dead loop lfsck_namespace_shrink_linkea() may fall in dead loop if it tries to delete XATTR_NAME_LINK. Signed-off-by: Lai Siyao Change-Id: I43e6e7917f8f89eb2cc873c8521cd3fbb528f495 Reviewed-on: https://review.whamcloud.com/33252 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Hongchao Zhang Reviewed-by: Oleg Drokin --- lustre/lfsck/lfsck_namespace.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lustre/lfsck/lfsck_namespace.c b/lustre/lfsck/lfsck_namespace.c index 6893b0c..d88a352 100644 --- a/lustre/lfsck/lfsck_namespace.c +++ b/lustre/lfsck/lfsck_namespace.c @@ -1614,16 +1614,22 @@ again: lfsck_namespace_filter_linkea_entry(&ldata_new, cname, pfid, true); - if (buflen < ldata_new.ld_leh->leh_len) { + /* + * linkea may change because it doesn't take lock in the first read, if + * it becomes larger, restart from beginning. + */ + if ((ldata_new.ld_leh->leh_reccount > 0 || + unlikely(ldata_new.ld_leh->leh_overflow_time)) && + buflen < ldata_new.ld_leh->leh_len) { dt_write_unlock(env, obj); dt_trans_stop(env, dev, th); lfsck_buf_init(&linkea_buf, ldata_new.ld_buf->lb_buf, ldata_new.ld_leh->leh_len); + buflen = linkea_buf.lb_len; goto again; } - if (ldata_new.ld_leh->leh_reccount > 0 || - unlikely(ldata->ld_leh->leh_overflow_time)) + if (buflen) rc = lfsck_links_write(env, obj, &ldata_new, th); else rc = dt_xattr_del(env, obj, XATTR_NAME_LINK, th); -- 1.8.3.1