diff --git a/lustre/mds/mds_fs.c b/lustre/mds/mds_fs.c index e32ba3fcc8e49c83c35a80e52c457dc01e0ebd9d..38654a5d1bd4b0a3c94efe60ff55fc322456d63a 100644 --- a/lustre/mds/mds_fs.c +++ b/lustre/mds/mds_fs.c @@ -167,6 +167,12 @@ int mds_client_free(struct obd_export *exp, int clear_client) LBUG(); } + + /* Make sure the server's last_transno is up to date. Do this + * after the client is freed so we know all the client's + * transactions have been committed. */ + mds_update_server_data(exp->exp_obd, 1); + free_and_out: OBD_FREE(med->med_mcd, sizeof(*med->med_mcd)); diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c index 8fe771e65b39d02eaeba049f1760f91404f69f56..b464c7b106e0bada1c5449911112bbe58b2ef999 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -263,6 +263,10 @@ static int filter_client_free(struct obd_export *exp, int flags) push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); rc = fsfilt_write_record(obd, filter->fo_rcvd_filp, &zero_fcd, sizeof(zero_fcd), &off, 1); + if (rc == 0) + /* update server's transno */ + filter_update_server_data(obd, filter->fo_rcvd_filp, + filter->fo_fsd, 1); pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); CDEBUG(rc == 0 ? D_INFO : D_ERROR, diff --git a/lustre/tests/replay-single.sh b/lustre/tests/replay-single.sh index 2a6cddb3036e775a16d70a8b34f2fa404960e068..271b242293ef9b3fe123372ca9f82cff7ac6bcc4 100755 --- a/lustre/tests/replay-single.sh +++ b/lustre/tests/replay-single.sh @@ -956,6 +956,27 @@ test_47() { } run_test 47 "MDS->OSC failure during precreate cleanup (2824)" + +test_48() { + createmany -o $DIR/${tfile}- 100 + $CHECKSTAT $DIR/${tfile}-99 || return 1 + mds_evict_client + df $MOUNT || df $MOUNT || return 2 + sleep 1 + $CHECKSTAT $DIR/${tfile}-99 || return 3 + + dmesg -c >/dev/null + replay_barrier mds1 + fail mds1 + unlinkmany $DIR/${tfile}- 100 || return 4 + if dmesg | grep "back in time"; then + echo "server went back in time!" + return 5 + fi + return 0 +} +run_test 48 "Don't lose transno when client is evicted (2525)" + equals_msg test complete, cleaning up $CLEANUP