gfs2: Only defer deletes when we have an iopen glock

The mechanism to defer deleting unlinked inodes is tied to
delete_work_func(), which is tied to iopen glocks.  When we don't have
an iopen glock, we must carry out deletes immediately instead.

Fixes a NULL pointer dereference in gfs2_evict_inode().

Fixes: 8c21c2c71e ("gfs2: Call gfs2_queue_verify_delete from gfs2_evict_inode")
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
Andreas Gruenbacher 2024-11-19 10:44:56 +01:00
parent b6900ce151
commit c5b7a2400e

View File

@ -1503,10 +1503,13 @@ static void gfs2_evict_inode(struct inode *inode)
!test_bit(SDF_KILL, &sdp->sd_flags)) {
struct gfs2_glock *io_gl = ip->i_iopen_gh.gh_gl;
gfs2_glock_hold(io_gl);
if (!gfs2_queue_verify_delete(io_gl, true))
gfs2_glock_put(io_gl);
goto out;
if (io_gl) {
gfs2_glock_hold(io_gl);
if (!gfs2_queue_verify_delete(io_gl, true))
gfs2_glock_put(io_gl);
goto out;
}
behavior = EVICT_SHOULD_DELETE;
}
if (behavior == EVICT_SHOULD_DELETE)
ret = evict_unlinked_inode(inode);