From 10a29ad7616aeaadabf6d96146f52ef348a3a6f1 Mon Sep 17 00:00:00 2001 From: Mikhail Pershin Date: Tue, 17 May 2022 12:57:28 +0300 Subject: [PATCH] LU-15776 tgt: fix transaction handling in tgt_brw_write() Hotfix to prevent possible data loss during WRITE replay. Since commit f0f92773ee18 from LU-14187 the obd_commitrw() may restart write transaction in OFD and MDT. That causes transaction number to be assigned multiple times if such restart happens. Without flag tti_mult_trans the first transaction number is stored only so later one could remain not applied causing data loss after recovery. Patch sets tti_mult_trans for tgt_brw_write() so the latest transaction number will be used as request transno. Fixes: f0f92773ee ("LU-14187 osd-ldiskfs: fix locking in write commit") Signed-off-by: Mikhail Pershin Change-Id: I364b478591942be5562c3e98ee6e6aa487f3e0c5 Reviewed-on: https://review.whamcloud.com/47371 Tested-by: jenkins Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev Tested-by: Maloo Reviewed-by: Wang Shilong Reviewed-by: Oleg Drokin --- lustre/target/tgt_handler.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lustre/target/tgt_handler.c b/lustre/target/tgt_handler.c index 681f3d4..c42c74b 100644 --- a/lustre/target/tgt_handler.c +++ b/lustre/target/tgt_handler.c @@ -2604,6 +2604,7 @@ static void tgt_warn_on_cksum(struct ptlrpc_request *req, int tgt_brw_write(struct tgt_session_info *tsi) { + struct tgt_thread_info *tti = tgt_th_info(tsi->tsi_env); struct ptlrpc_request *req = tgt_ses_req(tsi); struct ptlrpc_bulk_desc *desc = NULL; struct obd_export *exp = req->rq_export; @@ -2846,6 +2847,9 @@ out_commitrw: nob += len; } + /* multiple transactions can be assigned during write commit */ + tti->tti_mult_trans = 1; + /* Must commit after prep above in all cases */ rc = obd_commitrw(tsi->tsi_env, OBD_BRW_WRITE, exp, &repbody->oa, objcount, ioo, remote_nb, npages, local_nb, rc, nob, -- 1.8.3.1