From: Bruno Faccini Date: Mon, 7 Nov 2016 23:49:42 +0000 (+0100) Subject: LU-8808 mdt: avoid out of order ChangeLog during restore X-Git-Tag: 2.9.55~22 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=17ab869d3a37607dbfb2ca8d85ac3549c539f148;p=fs%2Flustre-release.git LU-8808 mdt: avoid out of order ChangeLog during restore In hsm_cdt_request_completed(), upon restore completion, layout lock is returned before associated ChangeLog entry has been created. This allows for a timing window where concurrent file updater can take control and create its own ChangeLog out of order (before restore ChangeLog). This can puzzle, ChangeLog readers (like RobinHood), and have them think of a wrong file state. This patch fixes this hole by posting restore ChangeLog before giving back layout lock. Signed-off-by: Bruno Faccini Change-Id: I958cb61aab34a6a0edc97f4d1390eed623631c21 Reviewed-on: https://review.whamcloud.com/23638 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Henri Doreau Reviewed-by: John L. Hammond Reviewed-by: Oleg Drokin --- diff --git a/lustre/mdt/mdt_coordinator.c b/lustre/mdt/mdt_coordinator.c index a981809..da11033 100644 --- a/lustre/mdt/mdt_coordinator.c +++ b/lustre/mdt/mdt_coordinator.c @@ -1141,12 +1141,13 @@ static int hsm_cdt_request_completed(struct mdt_thread_info *mti, int cl_flags = 0, rc = 0; struct md_hsm mh; bool is_mh_changed; + bool need_changelog = true; ENTRY; /* default is to retry */ *status = ARS_WAITING; - /* find object by FID + /* find object by FID, mdt_hsm_get_md_hsm() returns obj or err * if error/removed continue anyway to get correct reporting done */ obj = mdt_hsm_get_md_hsm(mti, &car->car_hai->hai_fid, &mh); /* we will update MD HSM only if needed */ @@ -1305,6 +1306,13 @@ static int hsm_cdt_request_completed(struct mdt_thread_info *mti, if (*status == ARS_WAITING) GOTO(out, rc); + /* restore special case, need to create ChangeLog record + * before to give back layout lock to avoid concurrent + * file updater to post out of order ChangeLog */ + mo_changelog(env, CL_HSM, cl_flags, mdt->mdt_child, + &car->car_hai->hai_fid); + need_changelog = false; + /* give back layout lock */ mutex_lock(&cdt->cdt_restore_lock); crh = mdt_hsm_restore_hdl_find(cdt, &car->car_hai->hai_fid); @@ -1326,8 +1334,9 @@ static int hsm_cdt_request_completed(struct mdt_thread_info *mti, out: /* always add a ChangeLog record */ - mo_changelog(env, CL_HSM, cl_flags, mdt->mdt_child, - &car->car_hai->hai_fid); + if (need_changelog) + mo_changelog(env, CL_HSM, cl_flags, mdt->mdt_child, + &car->car_hai->hai_fid); if (!IS_ERR(obj)) mdt_object_put(mti->mti_env, obj);