Skip to content

Commit 14c4547

Browse files
AstralBobgregkh
authored andcommitted
gfs2: Don't deref jdesc in evict
[ Upstream commit 504a10d ] On corrupt gfs2 file systems the evict code can try to reference the journal descriptor structure, jdesc, after it has been freed and set to NULL. The sequence of events is: init_journal() ... fail_jindex: gfs2_jindex_free(sdp); <------frees journals, sets jdesc = NULL if (gfs2_holder_initialized(&ji_gh)) gfs2_glock_dq_uninit(&ji_gh); fail: iput(sdp->sd_jindex); <--references jdesc in evict_linked_inode evict() gfs2_evict_inode() evict_linked_inode() ret = gfs2_trans_begin(sdp, 0, sdp->sd_jdesc->jd_blocks); <------references the now freed/zeroed sd_jdesc pointer. The call to gfs2_trans_begin is done because the truncate_inode_pages call can cause gfs2 events that require a transaction, such as removing journaled data (jdata) blocks from the journal. This patch fixes the problem by adding a check for sdp->sd_jdesc to function gfs2_evict_inode. In theory, this should only happen to corrupt gfs2 file systems, when gfs2 detects the problem, reports it, then tries to evict all the system inodes it has read in up to that point. Reported-by: Yang Lan <lanyang0908@gmail.com> Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 4d45754 commit 14c4547

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

fs/gfs2/super.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,6 +1410,14 @@ static void gfs2_evict_inode(struct inode *inode)
14101410
if (inode->i_nlink || sb_rdonly(sb) || !ip->i_no_addr)
14111411
goto out;
14121412

1413+
/*
1414+
* In case of an incomplete mount, gfs2_evict_inode() may be called for
1415+
* system files without having an active journal to write to. In that
1416+
* case, skip the filesystem evict.
1417+
*/
1418+
if (!sdp->sd_jdesc)
1419+
goto out;
1420+
14131421
gfs2_holder_mark_uninitialized(&gh);
14141422
ret = evict_should_delete(inode, &gh);
14151423
if (ret == SHOULD_DEFER_EVICTION)

0 commit comments

Comments
 (0)