Hi Bob,

On Tue, Nov 24, 2020 at 9:28 PM Bob Peterson <[email protected]> wrote:
> GFS2's freeze/thaw mechanism uses a special freeze glock to control its
> operation. It does this with a sync glock operation (glops.c) called
> freeze_go_sync. When the freeze glock is demoted (glock's do_xmote) the
> glops function causes the file system to be frozen. This is intended. However,
> GFS2's mount and unmount processes also hold the freeze glock to prevent other
> processes, perhaps on different cluster nodes, from mounting the frozen file
> system in read-write mode.
>
> Before this patch, there was no check in freeze_go_sync for whether a freeze
> in intended or whether the glock demote was caused by a normal unmount.
> So it was trying to freeze the file system it's trying to unmount, which
> ends up in a deadlock.
>
> This patch adds an additional check to freeze_go_sync so that demotes of the
> freeze glock are ignored if they come from the unmount process.
>
> Signed-off-by: Bob Peterson <[email protected]>
> ---
>  fs/gfs2/glops.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
> index e2cfc00ab936..3faa421568b0 100644
> --- a/fs/gfs2/glops.c
> +++ b/fs/gfs2/glops.c
> @@ -582,7 +582,8 @@ static int freeze_go_sync(struct gfs2_glock *gl)
>          * Once thawed, the work func acquires the freeze glock in
>          * SH and everybody goes back to thawed.
>          */
> -       if (gl->gl_state == LM_ST_SHARED && !gfs2_withdrawn(sdp)) {
> +       if (gl->gl_state == LM_ST_SHARED && !gfs2_withdrawn(sdp) &&
> +           !test_bit(SDF_NORECOVERY, &sdp->sd_flags)) {
>                 atomic_set(&sdp->sd_freeze_state, SFS_STARTING_FREEZE);
>                 error = freeze_super(sdp->sd_vfs);
>                 if (error) {

I'll send this to Linus in the next batch of 5.10 fixes.

Thanks,
Andreas

Reply via email to