gfs2: Replace GIF_DEFER_DELETE with GLF_DEFER_DELETE

[ Upstream commit 3774f53d7f0b30a996eab4a1264611489b48f14c ]

Having this flag attached to the iopen glock instead of the inode is
much simpler; it eliminates a protential weird race in gfs2_try_evict().

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Stable-dep-of: 2c63986dd35f ("gfs2: deallocate inodes in gfs2_create_inode")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Andreas Gruenbacher
2025-02-04 17:35:13 +01:00
committed by Greg Kroah-Hartman
parent 7df46e6f88
commit 4f66983aeb
4 changed files with 9 additions and 5 deletions
+4 -2
View File
@@ -994,15 +994,15 @@ static bool gfs2_try_evict(struct gfs2_glock *gl)
} }
} }
if (ip) { if (ip) {
set_bit(GIF_DEFER_DELETE, &ip->i_flags); set_bit(GLF_DEFER_DELETE, &gl->gl_flags);
d_prune_aliases(&ip->i_inode); d_prune_aliases(&ip->i_inode);
iput(&ip->i_inode); iput(&ip->i_inode);
clear_bit(GLF_DEFER_DELETE, &gl->gl_flags);
/* If the inode was evicted, gl->gl_object will now be NULL. */ /* If the inode was evicted, gl->gl_object will now be NULL. */
spin_lock(&gl->gl_lockref.lock); spin_lock(&gl->gl_lockref.lock);
ip = gl->gl_object; ip = gl->gl_object;
if (ip) { if (ip) {
clear_bit(GIF_DEFER_DELETE, &ip->i_flags);
if (!igrab(&ip->i_inode)) if (!igrab(&ip->i_inode))
ip = NULL; ip = NULL;
} }
@@ -2389,6 +2389,8 @@ static const char *gflags2str(char *buf, const struct gfs2_glock *gl)
*p++ = 'e'; *p++ = 'e';
if (test_bit(GLF_VERIFY_DELETE, gflags)) if (test_bit(GLF_VERIFY_DELETE, gflags))
*p++ = 'E'; *p++ = 'E';
if (test_bit(GLF_DEFER_DELETE, gflags))
*p++ = 's';
*p = 0; *p = 0;
return buf; return buf;
} }
+1 -1
View File
@@ -331,6 +331,7 @@ enum {
GLF_TRY_TO_EVICT = 17, /* iopen glocks only */ GLF_TRY_TO_EVICT = 17, /* iopen glocks only */
GLF_VERIFY_DELETE = 18, /* iopen glocks only */ GLF_VERIFY_DELETE = 18, /* iopen glocks only */
GLF_PENDING_REPLY = 19, GLF_PENDING_REPLY = 19,
GLF_DEFER_DELETE = 20, /* iopen glocks only */
}; };
struct gfs2_glock { struct gfs2_glock {
@@ -377,7 +378,6 @@ enum {
GIF_SW_PAGED = 3, GIF_SW_PAGED = 3,
GIF_FREE_VFS_INODE = 5, GIF_FREE_VFS_INODE = 5,
GIF_GLOP_PENDING = 6, GIF_GLOP_PENDING = 6,
GIF_DEFER_DELETE = 7,
}; };
struct gfs2_inode { struct gfs2_inode {
+2 -1
View File
@@ -1326,7 +1326,8 @@ static enum evict_behavior evict_should_delete(struct inode *inode,
if (unlikely(test_bit(GIF_ALLOC_FAILED, &ip->i_flags))) if (unlikely(test_bit(GIF_ALLOC_FAILED, &ip->i_flags)))
goto should_delete; goto should_delete;
if (test_bit(GIF_DEFER_DELETE, &ip->i_flags)) if (gfs2_holder_initialized(&ip->i_iopen_gh) &&
test_bit(GLF_DEFER_DELETE, &ip->i_iopen_gh.gh_gl->gl_flags))
return EVICT_SHOULD_DEFER_DELETE; return EVICT_SHOULD_DEFER_DELETE;
/* Deletes should never happen under memory pressure anymore. */ /* Deletes should never happen under memory pressure anymore. */
+2 -1
View File
@@ -64,7 +64,8 @@
{(1UL << GLF_INSTANTIATE_NEEDED), "n" }, \ {(1UL << GLF_INSTANTIATE_NEEDED), "n" }, \
{(1UL << GLF_INSTANTIATE_IN_PROG), "N" }, \ {(1UL << GLF_INSTANTIATE_IN_PROG), "N" }, \
{(1UL << GLF_TRY_TO_EVICT), "e" }, \ {(1UL << GLF_TRY_TO_EVICT), "e" }, \
{(1UL << GLF_VERIFY_DELETE), "E" }) {(1UL << GLF_VERIFY_DELETE), "E" }, \
{(1UL << GLF_DEFER_DELETE), "s" })
#ifndef NUMPTY #ifndef NUMPTY
#define NUMPTY #define NUMPTY