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