Skip to content

Commit

Permalink
gfs2: allow journal replay to hold sd_log_flush_lock
Browse files Browse the repository at this point in the history
Before this patch, journal replays could stomp on log flushes
and each other because both log flushes and journal replays used
the same sd_log_bio. Function gfs2_log_flush prevents other log
flushes from interfering by taking the sd_log_flush_lock rwsem
during the flush. However, it does not protect against journal
replays. This patch allows the journal replay to take the same
sd_log_flush_lock rwsem so use of the sd_log_bio is not stomped.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
  • Loading branch information
Bob Peterson committed Feb 27, 2020
1 parent 019dd66 commit c9ebc4b
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions fs/gfs2/recovery.c
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,10 @@ void gfs2_recover_func(struct work_struct *work)
fs_info(sdp, "jid=%u: Replaying journal...0x%x to 0x%x\n",
jd->jd_jid, head.lh_tail, head.lh_blkno);

/* We take the sd_log_flush_lock here primarily to prevent log
* flushes and simultaneous journal replays from stomping on
* each other wrt sd_log_bio. */
down_write(&sdp->sd_log_flush_lock);
for (pass = 0; pass < 2; pass++) {
lops_before_scan(jd, &head, pass);
error = foreach_descriptor(jd, head.lh_tail,
Expand All @@ -408,6 +412,7 @@ void gfs2_recover_func(struct work_struct *work)
}

clean_journal(jd, &head);
up_write(&sdp->sd_log_flush_lock);

gfs2_glock_dq_uninit(&thaw_gh);
t_rep = ktime_get();
Expand Down

0 comments on commit c9ebc4b

Please sign in to comment.