| From de51dedaaa8ed97e170ae8632669de64f46e27cd Mon Sep 17 00:00:00 2001 |
| From: Bob Peterson <rpeterso@redhat.com> |
| Date: Wed, 13 Nov 2019 14:08:45 -0600 |
| Subject: [PATCH] gfs2: Don't demote a glock until its revokes are written |
| |
| commit df5db5f9ee112e76b5202fbc331f990a0fc316d6 upstream. |
| |
| Before this patch, run_queue would demote glocks based on whether |
| there are any more holders. But if the glock has pending revokes that |
| haven't been written to the media, giving up the glock might end in |
| file system corruption if the revokes never get written due to |
| io errors, node crashes and fences, etc. In that case, another node |
| will replay the metadata blocks associated with the glock, but |
| because the revoke was never written, it could replay that block |
| even though the glock had since been granted to another node who |
| might have made changes. |
| |
| This patch changes the logic in run_queue so that it never demotes |
| a glock until its count of pending revokes reaches zero. |
| |
| Signed-off-by: Bob Peterson <rpeterso@redhat.com> |
| Reviewed-by: Andreas Gruenbacher <agruenba@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c |
| index f1ebcb42cbf5..ecd861ef512b 100644 |
| --- a/fs/gfs2/glock.c |
| +++ b/fs/gfs2/glock.c |
| @@ -634,6 +634,9 @@ __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.7.4 |
| |