xfs: clean up bmap intent item recovery checking
The bmap intent item checking code in xfs_bui_item_recover is spread all over the function. We should check the recovered log item at the top before we allocate any resources or do anything else, so do that. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
929b92f640
commit
919522e89f
|
@ -437,8 +437,6 @@ xfs_bui_item_recover(
|
||||||
xfs_fsblock_t inode_fsb;
|
xfs_fsblock_t inode_fsb;
|
||||||
xfs_filblks_t count;
|
xfs_filblks_t count;
|
||||||
xfs_exntst_t state;
|
xfs_exntst_t state;
|
||||||
enum xfs_bmap_intent_type type;
|
|
||||||
bool op_ok;
|
|
||||||
unsigned int bui_type;
|
unsigned int bui_type;
|
||||||
int whichfork;
|
int whichfork;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
@ -456,16 +454,19 @@ xfs_bui_item_recover(
|
||||||
XFS_FSB_TO_DADDR(mp, bmap->me_startblock));
|
XFS_FSB_TO_DADDR(mp, bmap->me_startblock));
|
||||||
inode_fsb = XFS_BB_TO_FSB(mp, XFS_FSB_TO_DADDR(mp,
|
inode_fsb = XFS_BB_TO_FSB(mp, XFS_FSB_TO_DADDR(mp,
|
||||||
XFS_INO_TO_FSB(mp, bmap->me_owner)));
|
XFS_INO_TO_FSB(mp, bmap->me_owner)));
|
||||||
switch (bmap->me_flags & XFS_BMAP_EXTENT_TYPE_MASK) {
|
state = (bmap->me_flags & XFS_BMAP_EXTENT_UNWRITTEN) ?
|
||||||
|
XFS_EXT_UNWRITTEN : XFS_EXT_NORM;
|
||||||
|
whichfork = (bmap->me_flags & XFS_BMAP_EXTENT_ATTR_FORK) ?
|
||||||
|
XFS_ATTR_FORK : XFS_DATA_FORK;
|
||||||
|
bui_type = bmap->me_flags & XFS_BMAP_EXTENT_TYPE_MASK;
|
||||||
|
switch (bui_type) {
|
||||||
case XFS_BMAP_MAP:
|
case XFS_BMAP_MAP:
|
||||||
case XFS_BMAP_UNMAP:
|
case XFS_BMAP_UNMAP:
|
||||||
op_ok = true;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
op_ok = false;
|
return -EFSCORRUPTED;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if (!op_ok || startblock_fsb == 0 ||
|
if (startblock_fsb == 0 ||
|
||||||
bmap->me_len == 0 ||
|
bmap->me_len == 0 ||
|
||||||
inode_fsb == 0 ||
|
inode_fsb == 0 ||
|
||||||
startblock_fsb >= mp->m_sb.sb_dblocks ||
|
startblock_fsb >= mp->m_sb.sb_dblocks ||
|
||||||
|
@ -493,32 +494,17 @@ xfs_bui_item_recover(
|
||||||
if (VFS_I(ip)->i_nlink == 0)
|
if (VFS_I(ip)->i_nlink == 0)
|
||||||
xfs_iflags_set(ip, XFS_IRECOVERY);
|
xfs_iflags_set(ip, XFS_IRECOVERY);
|
||||||
|
|
||||||
/* Process deferred bmap item. */
|
|
||||||
state = (bmap->me_flags & XFS_BMAP_EXTENT_UNWRITTEN) ?
|
|
||||||
XFS_EXT_UNWRITTEN : XFS_EXT_NORM;
|
|
||||||
whichfork = (bmap->me_flags & XFS_BMAP_EXTENT_ATTR_FORK) ?
|
|
||||||
XFS_ATTR_FORK : XFS_DATA_FORK;
|
|
||||||
bui_type = bmap->me_flags & XFS_BMAP_EXTENT_TYPE_MASK;
|
|
||||||
switch (bui_type) {
|
|
||||||
case XFS_BMAP_MAP:
|
|
||||||
case XFS_BMAP_UNMAP:
|
|
||||||
type = bui_type;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
|
|
||||||
error = -EFSCORRUPTED;
|
|
||||||
goto err_inode;
|
|
||||||
}
|
|
||||||
xfs_trans_ijoin(tp, ip, 0);
|
xfs_trans_ijoin(tp, ip, 0);
|
||||||
|
|
||||||
count = bmap->me_len;
|
count = bmap->me_len;
|
||||||
error = xfs_trans_log_finish_bmap_update(tp, budp, type, ip, whichfork,
|
error = xfs_trans_log_finish_bmap_update(tp, budp, bui_type, ip,
|
||||||
bmap->me_startoff, bmap->me_startblock, &count, state);
|
whichfork, bmap->me_startoff, bmap->me_startblock,
|
||||||
|
&count, state);
|
||||||
if (error)
|
if (error)
|
||||||
goto err_inode;
|
goto err_inode;
|
||||||
|
|
||||||
if (count > 0) {
|
if (count > 0) {
|
||||||
ASSERT(type == XFS_BMAP_UNMAP);
|
ASSERT(bui_type == XFS_BMAP_UNMAP);
|
||||||
irec.br_startblock = bmap->me_startblock;
|
irec.br_startblock = bmap->me_startblock;
|
||||||
irec.br_blockcount = count;
|
irec.br_blockcount = count;
|
||||||
irec.br_startoff = bmap->me_startoff;
|
irec.br_startoff = bmap->me_startoff;
|
||||||
|
|
Loading…
Reference in New Issue