mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 00:21:59 +00:00
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:
parent
463958af5c
commit
7f43c907ad
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user