Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f43c907 authored by Brian Foster's avatar Brian Foster Committed by Dave Chinner
Browse files

xfs: handle sparse inode chunks in icreate log recovery



Recovery of icreate transactions assumes hardcoded values for the inode
count and chunk length.

Sparse inode chunks are allocated in units of m_ialloc_min_blks. Update
the icreate validity checks to allow for appropriately sized inode
chunks and verify the inode count matches what is expected based on the
extent length rather than assuming a hardcoded count.

Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent 463958af
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -3068,12 +3068,22 @@ xlog_recover_do_icreate_pass2(
		return -EINVAL;
	}

	/* existing allocation is fixed value */
	ASSERT(count == mp->m_ialloc_inos);
	ASSERT(length == mp->m_ialloc_blks);
	if (count != mp->m_ialloc_inos ||
	     length != mp->m_ialloc_blks) {
		xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2");
	/*
	 * The inode chunk is either full or sparse and we only support
	 * m_ialloc_min_blks sized sparse allocations at this time.
	 */
	if (length != mp->m_ialloc_blks &&
	    length != mp->m_ialloc_min_blks) {
		xfs_warn(log->l_mp,
			 "%s: unsupported chunk length", __FUNCTION__);
		return -EINVAL;
	}

	/* verify inode count is consistent with extent length */
	if ((count >> mp->m_sb.sb_inopblog) != length) {
		xfs_warn(log->l_mp,
			 "%s: inconsistent inode count and chunk length",
			 __FUNCTION__);
		return -EINVAL;
	}