diff options
author | 2023-09-12 08:05:51 -0500 | |
---|---|---|
committer | 2023-09-18 16:00:50 +0200 | |
commit | 62862485a4c3a52029fc30f4bdde9af04afdafc9 (patch) | |
tree | d31e512883f46d6a38c8953287ccd7911bd47ad2 /fs/gfs2 | |
parent | gfs2: Fix another freeze/thaw hang (diff) | |
download | linux-62862485a4c3a52029fc30f4bdde9af04afdafc9.tar.gz linux-62862485a4c3a52029fc30f4bdde9af04afdafc9.tar.bz2 linux-62862485a4c3a52029fc30f4bdde9af04afdafc9.zip |
gfs2: fix glock shrinker ref issues
Before this patch, function gfs2_scan_glock_lru would only try to free
glocks that had a reference count of 0. But if the reference count ever
got to 0, the glock should have already been freed.
Shrinker function gfs2_dispose_glock_lru checks whether glocks on the
LRU are demote_ok, and if so, tries to demote them. But that's only
possible if the reference count is at least 1.
This patch changes gfs2_scan_glock_lru so it will try to demote and/or
dispose of glocks that have a reference count of 1 and which are either
demotable, or are already unlocked.
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/glock.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 9cbf8d98489a..4a280be229a6 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -2010,7 +2010,9 @@ static long gfs2_scan_glock_lru(int nr) if (!test_bit(GLF_LOCK, &gl->gl_flags)) { if (!spin_trylock(&gl->gl_lockref.lock)) continue; - if (!gl->gl_lockref.count) { + if (gl->gl_lockref.count <= 1 && + (gl->gl_state == LM_ST_UNLOCKED || + demote_ok(gl))) { list_move(&gl->gl_lru, &dispose); atomic_dec(&lru_count); freed++; |