Function clean_journal was setting the value of sd_log_flush_head,
but that's only a valid thing to do if it is replaying its own journal.
If it's replaying another node's journal, that's completely wrong and
will lead to multiple problems.

Signed-off-by: Bob Peterson <rpete...@redhat.com>
---
 fs/gfs2/recovery.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
index 020cac0e1002..bee5758fd027 100644
--- a/fs/gfs2/recovery.c
+++ b/fs/gfs2/recovery.c
@@ -387,8 +387,10 @@ static void clean_journal(struct gfs2_jdesc *jd,
 {
        struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
 
-       sdp->sd_log_flush_head = head->lh_blkno;
-       gfs2_replay_incr_blk(jd, &sdp->sd_log_flush_head);
+       if (jd->jd_jid == sdp->sd_lockstruct.ls_jid) {
+               sdp->sd_log_flush_head = head->lh_blkno;
+               gfs2_replay_incr_blk(jd, &sdp->sd_log_flush_head);
+       }
        gfs2_write_log_header(sdp, jd, head->lh_sequence + 1, 0,
                              GFS2_LOG_HEAD_UNMOUNT | GFS2_LOG_HEAD_RECOVERY,
                              REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC);
-- 
2.20.1

Reply via email to