From: Niu Yawei Date: Fri, 26 Aug 2011 02:58:36 +0000 (-0700) Subject: LU-617 temporary fix for the setattr from open X-Git-Tag: 2.1.0~7 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=71fc2a4d9d37c488b64ef882bc83e5096171c703 LU-617 temporary fix for the setattr from open The setattr from open(open(O_TRUNC)) is serialized with 'cl_setattr_lock' on client and goes to a dedicate portal, which is different with other reint operations, consequently, setattr RPC can be parallel with other reint RPCs, and that result in the race of updating last_transno/last_xid on server. This temporary fix removes the LASSERT(req_is_replay(req)) in mdt_last_rcvd_update(). Signed-off-by: Niu Yawei Change-Id: I7e07eaf9e718c2d75d9a503207523be9c700ea4a Reviewed-on: http://review.whamcloud.com/1295 Tested-by: Hudson Reviewed-by: Mikhail Pershin Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- diff --git a/lustre/mdt/mdt_recovery.c b/lustre/mdt/mdt_recovery.c index 9c1367d..50c69eb 100644 --- a/lustre/mdt/mdt_recovery.c +++ b/lustre/mdt/mdt_recovery.c @@ -758,16 +758,18 @@ static int mdt_last_rcvd_update(struct mdt_thread_info *mti, lustre_msg_get_opc(req->rq_reqmsg) == MDS_DONE_WRITING) { if (mti->mti_transno != 0) { if (lcd->lcd_last_close_transno > mti->mti_transno) { - LASSERT(req_is_replay(req)); CERROR("Trying to overwrite bigger transno:" - "on-disk: "LPU64", new: "LPU64"\n", + "on-disk: "LPU64", new: "LPU64" " + "replay: %d. see LU-617.\n", lcd->lcd_last_close_transno, - mti->mti_transno); - cfs_spin_lock(&req->rq_export->exp_lock); - req->rq_export->exp_vbr_failed = 1; - cfs_spin_unlock(&req->rq_export->exp_lock); + mti->mti_transno, req_is_replay(req)); + if (req_is_replay(req)) { + cfs_spin_lock(&req->rq_export->exp_lock); + req->rq_export->exp_vbr_failed = 1; + cfs_spin_unlock(&req->rq_export->exp_lock); + } cfs_mutex_up(&ted->ted_lcd_lock); - RETURN(-EOVERFLOW); + RETURN(req_is_replay(req) ? -EOVERFLOW : 0); } lcd->lcd_last_close_transno = mti->mti_transno; } @@ -784,16 +786,18 @@ static int mdt_last_rcvd_update(struct mdt_thread_info *mti, } if (mti->mti_transno != 0) { if (lcd->lcd_last_transno > mti->mti_transno) { - LASSERT(req_is_replay(req)); CERROR("Trying to overwrite bigger transno:" - "on-disk: "LPU64", new: "LPU64"\n", + "on-disk: "LPU64", new: "LPU64" " + "replay: %d. see LU-617.\n", lcd->lcd_last_transno, - mti->mti_transno); - cfs_spin_lock(&req->rq_export->exp_lock); - req->rq_export->exp_vbr_failed = 1; - cfs_spin_unlock(&req->rq_export->exp_lock); + mti->mti_transno, req_is_replay(req)); + if (req_is_replay(req)) { + cfs_spin_lock(&req->rq_export->exp_lock); + req->rq_export->exp_vbr_failed = 1; + cfs_spin_unlock(&req->rq_export->exp_lock); + } cfs_mutex_up(&ted->ted_lcd_lock); - RETURN(-EOVERFLOW); + RETURN(req_is_replay(req) ? -EOVERFLOW : 0); } lcd->lcd_last_transno = mti->mti_transno; }