[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAHc6FU7kH3VfyERRTFuCshiSq0c-ttJLG7OeX_j31K9ehvH7uQ@mail.gmail.com>
Date: Tue, 3 Feb 2026 12:16:57 +0100
From: Andreas Gruenbacher <agruenba@...hat.com>
To: Guilherme Giacomo Simoes <trintaeoitogc@...il.com>
Cc: gfs2@...ts.linux.dev, linux-kernel@...r.kernel.org
Subject: Re: [RESEND PATCH] gfs2: do not evict glocks with populated address spaces
Guilherme,
On Tue, Feb 3, 2026 at 11:40 AM Guilherme Giacomo Simoes
<trintaeoitogc@...il.com> 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 <trintaeoitogc@...il.com>
> ---
> 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
Powered by blists - more mailing lists