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: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Brian Foster 2015-05-29 09:06:30 +10:00 committed by Dave Chinner
parent 463958af5c
commit 7f43c907ad
1 changed files with 16 additions and 6 deletions

View File

@ -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;
}