| From 3e68b7d2266cf71dbfec9fcc2df117903036d6d4 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 8 May 2020 15:01:25 -0500 |
| Subject: Revert "gfs2: Don't demote a glock until its revokes are written" |
| |
| From: Bob Peterson <rpeterso@redhat.com> |
| |
| [ Upstream commit b14c94908b1b884276a6608dea3d0b1b510338b7 ] |
| |
| This reverts commit df5db5f9ee112e76b5202fbc331f990a0fc316d6. |
| |
| This patch fixes a regression: patch df5db5f9ee112 allowed function |
| run_queue() to bypass its call to do_xmote() if revokes were queued for |
| the glock. That's wrong because its call to do_xmote() is what is |
| responsible for calling the go_sync() glops functions to sync both |
| the ail list and any revokes queued for it. By bypassing the call, |
| gfs2 could get into a stand-off where the glock could not be demoted |
| until its revokes are written back, but the revokes would not be |
| written back because do_xmote() was never called. |
| |
| It "sort of" works, however, because there are other mechanisms like |
| the log flush daemon (logd) that can sync the ail items and revokes, |
| if it deems it necessary. The problem is: without file system pressure, |
| it might never deem it necessary. |
| |
| Signed-off-by: Bob Peterson <rpeterso@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/gfs2/glock.c | 3 --- |
| 1 file changed, 3 deletions(-) |
| |
| diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c |
| index 19ebc6cd0f2b..d0eceaff3cea 100644 |
| --- a/fs/gfs2/glock.c |
| +++ b/fs/gfs2/glock.c |
| @@ -645,9 +645,6 @@ __acquires(&gl->gl_lockref.lock) |
| goto out_unlock; |
| if (nonblock) |
| goto out_sched; |
| - smp_mb(); |
| - if (atomic_read(&gl->gl_revokes) != 0) |
| - goto out_sched; |
| set_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags); |
| GLOCK_BUG_ON(gl, gl->gl_demote_state == LM_ST_EXCLUSIVE); |
| gl->gl_target = gl->gl_demote_state; |
| -- |
| 2.25.1 |
| |