From e87e30460b18e73d1dbf2627e59485ae3d670e60 Mon Sep 17 00:00:00 2001 From: Alexander Zarochentsev Date: Sat, 4 Apr 2020 09:44:26 +0300 Subject: [PATCH] LU-13389 tgt: not rollback obsolete rq Restoring old pre-LU-11444 behavior in last_rcvd/reply_data update, do not generate a error for obsolete requests. Othewise tx_end tries to rollback the operation and does it partially leaving inodes unattached and changelog records not cleared; Fixing reply_data slot leak on error. Fixes: 23773b3 ("LU-11444 ptlrpc: resend may corrupt the data") HPE-bug-id: LUS-8590 Signed-off-by: Alexander Zarochentsev Change-Id: I76c2de7b820da0239ce2f0a9d17b7dedadc0519b Reviewed-on: https://review.whamcloud.com/38221 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andriy Skulysh Reviewed-by: Alexander Boyko Reviewed-by: Oleg Drokin --- lustre/target/tgt_lastrcvd.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/lustre/target/tgt_lastrcvd.c b/lustre/target/tgt_lastrcvd.c index 8961215..0db82ed 100644 --- a/lustre/target/tgt_lastrcvd.c +++ b/lustre/target/tgt_lastrcvd.c @@ -1200,6 +1200,7 @@ static int tgt_add_reply_data(const struct lu_env *env, struct lu_target *tgt, { struct lsd_reply_data *lrd; int i; + int rc; lrd = &trd->trd_reply; /* update export last transno */ @@ -1220,7 +1221,6 @@ static int tgt_add_reply_data(const struct lu_env *env, struct lu_target *tgt, if (update_lrd_file) { loff_t off; - int rc; /* write reply data to disk */ off = sizeof(struct lsd_reply_header) + sizeof(*lrd) * i; @@ -1228,7 +1228,7 @@ static int tgt_add_reply_data(const struct lu_env *env, struct lu_target *tgt, if (unlikely(rc != 0)) { CERROR("%s: can't update %s file: rc = %d\n", tgt_name(tgt), REPLY_DATA, rc); - RETURN(rc); + GOTO(free_slot, rc); } } } else { @@ -1242,8 +1242,12 @@ static int tgt_add_reply_data(const struct lu_env *env, struct lu_target *tgt, MSG_REPLAY : MSG_REPLAY|MSG_RESENT; if (req->rq_obsolete) { + CDEBUG(D_INFO, + "drop reply data update for obsolete req xid=%llu," + "transno=%llu, tag=%hu\n", req->rq_xid, + lrd->lrd_transno, trd->trd_tag); mutex_unlock(&ted->ted_lcd_lock); - RETURN(-EALREADY); + GOTO(free_slot, rc = -EBADR); } if (!(lustre_msg_get_flags(req->rq_reqmsg) & exclude)) @@ -1262,6 +1266,11 @@ static int tgt_add_reply_data(const struct lu_env *env, struct lu_target *tgt, trd->trd_tag, lrd->lrd_client_gen, trd->trd_index); RETURN(0); + +free_slot: + if (tgt != NULL) + tgt_clear_reply_slot(tgt, trd->trd_index); + return rc; } int tgt_mk_reply_data(const struct lu_env *env, @@ -1315,8 +1324,11 @@ int tgt_mk_reply_data(const struct lu_env *env, rc = tgt_add_reply_data(env, tgt, ted, trd, req, th, write_update); - if (rc < 0) + if (rc < 0) { OBD_FREE_PTR(trd); + if (rc == -EBADR) + rc = 0; + } return rc; } -- 1.8.3.1