Re: [RESEND PATCH] gfs2: do not evict glocks with populated address spaces

Andreas Gruenbacher <[email protected]>
Newsgroups dev.linux.lists.gfs2,org.kernel.vger.linux-kernel
Message-ID <CAHc6FU7kH3VfyERRTFuCshiSq0c-ttJLG7OeX_j31K9ehvH7uQ@mail.gmail.com>
Guilherme,

On Tue, Feb 3, 2026 at 11:40 AM Guilherme Giacomo Simoes
<[email protected]> wrote:
> Metadata glocks may have associated address spaces used as caches. Avoid
> reclaiming such glocks under memory pressure while their mappings are
> still populated or their state is not unlocked, as this can lead to
> invalid page cache state and GLOCK_BUG_ON().

What invalid page cache state and GLOCK_BUG_ON() errors is this about, exactly?

> Signed-off-by: Guilherme Giacomo Simoes <[email protected]>
> ---
>  fs/gfs2/glock.h | 30 ++++++++++++++++++++++++++++++
>  fs/gfs2/super.c |  3 +++
>  2 files changed, 33 insertions(+)
>
> diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h
> index 55d5985f32a0..12f57461f687 100644
> --- a/fs/gfs2/glock.h
> +++ b/fs/gfs2/glock.h
> @@ -305,4 +305,34 @@ static inline bool glock_needs_demote(struct gfs2_glock *gl)
>                 test_bit(GLF_PENDING_DEMOTE, &gl->gl_flags));
>  }
>
> +/*
> + * gfs2_glock_not_evictable - check if a glock is not evictable
> + * @gl:        The glock to check
> + *
> + * Glocks which do not represent normal filesystem inodes (e.g. statfs, quota, rindex)
> + * may have associated address spaces used as metadata caches. These glocks must not
> + * be reclaimed under memory pressure while their mappings are still populated or their
> + * state is not unlocked.
> + */
> +
> +static inline bool gfs2_glock_not_evictable(struct gfs2_glock *gl)
> +{
> +       if (gl->gl_name.ln_type == LM_TYPE_INODE)
> +               return false;
> +
> +       if (gl->gl_ops->go_flags & GLOF_ASPACE) {
> +               struct gfs2_glock_aspace *gla;
> +
> +               gla = container_of(gl, struct gfs2_glock_aspace, glock);
> +
> +               if (!mapping_empty(&gla->mapping))
> +                       return true;
> +       }
> +
> +       if (gl->gl_state != LM_ST_UNLOCKED)
> +               return true;
> +
> +       return false;
> +}
> +
>  #endif /* __GLOCK_DOT_H__ */
> diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
> index f6cd907b3ec6..86544cdafe53 100644
> --- a/fs/gfs2/super.c
> +++ b/fs/gfs2/super.c
> @@ -1164,6 +1164,9 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root)
>
>  static void gfs2_glock_put_eventually(struct gfs2_glock *gl)
>  {
> +       if (gfs2_glock_not_evictable(gl))
> +               return;
> +

This leaks a glock reference, so it's definitely wrong.

>         if (current->flags & PF_MEMALLOC)
>                 gfs2_glock_put_async(gl);
>         else
> --
> 2.34.1
>

Thanks,
Andreas
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.