mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
gfs2: Fix unlinked inode cleanup
[ Upstream commit 7c6f714d88475ceae5342264858a641eafa19632 ] Before commitf0e56edc2e("gfs2: Split the two kinds of glock "delete" work"), function delete_work_func() was used to trigger the eviction of in-memory inodes from remote as well as deleting unlinked inodes at a later point. These two kinds of work were then split into two kinds of work, and the two places in the code were deferred deletion of inodes is required accidentally ended up queuing the wrong kind of work. This caused unlinked inodes to be left behind, which could in the worst case fill up filesystems and require a filesystem check to recover. Fix that by queuing the right kind of work in try_rgrp_unlink() and gfs2_drop_inode(). Fixes:f0e56edc2e("gfs2: Split the two kinds of glock "delete" work") Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8264963475
commit
e30cab288c
@@ -1028,7 +1028,7 @@ bool gfs2_queue_try_to_evict(struct gfs2_glock *gl)
|
||||
&gl->gl_delete, 0);
|
||||
}
|
||||
|
||||
static bool gfs2_queue_verify_delete(struct gfs2_glock *gl, bool later)
|
||||
bool gfs2_queue_verify_delete(struct gfs2_glock *gl, bool later)
|
||||
{
|
||||
struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
|
||||
unsigned long delay;
|
||||
|
||||
@@ -259,6 +259,7 @@ static inline int gfs2_glock_nq_init(struct gfs2_glock *gl,
|
||||
void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state);
|
||||
void gfs2_glock_complete(struct gfs2_glock *gl, int ret);
|
||||
bool gfs2_queue_try_to_evict(struct gfs2_glock *gl);
|
||||
bool gfs2_queue_verify_delete(struct gfs2_glock *gl, bool later);
|
||||
void gfs2_cancel_delete_work(struct gfs2_glock *gl);
|
||||
void gfs2_flush_delete_work(struct gfs2_sbd *sdp);
|
||||
void gfs2_gl_hash_clear(struct gfs2_sbd *sdp);
|
||||
|
||||
@@ -1879,7 +1879,7 @@ static void try_rgrp_unlink(struct gfs2_rgrpd *rgd, u64 *last_unlinked, u64 skip
|
||||
*/
|
||||
ip = gl->gl_object;
|
||||
|
||||
if (ip || !gfs2_queue_try_to_evict(gl))
|
||||
if (ip || !gfs2_queue_verify_delete(gl, false))
|
||||
gfs2_glock_put(gl);
|
||||
else
|
||||
found++;
|
||||
|
||||
@@ -1053,7 +1053,7 @@ static int gfs2_drop_inode(struct inode *inode)
|
||||
struct gfs2_glock *gl = ip->i_iopen_gh.gh_gl;
|
||||
|
||||
gfs2_glock_hold(gl);
|
||||
if (!gfs2_queue_try_to_evict(gl))
|
||||
if (!gfs2_queue_verify_delete(gl, true))
|
||||
gfs2_glock_put_async(gl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user