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:
Родитель
463958af5c
Коммит
7f43c907ad
|
@ -3068,12 +3068,22 @@ xlog_recover_do_icreate_pass2(
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* existing allocation is fixed value */
|
/*
|
||||||
ASSERT(count == mp->m_ialloc_inos);
|
* The inode chunk is either full or sparse and we only support
|
||||||
ASSERT(length == mp->m_ialloc_blks);
|
* m_ialloc_min_blks sized sparse allocations at this time.
|
||||||
if (count != mp->m_ialloc_inos ||
|
*/
|
||||||
length != mp->m_ialloc_blks) {
|
if (length != mp->m_ialloc_blks &&
|
||||||
xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2");
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче