]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: clean up bmap intent item recovery checking
authorDarrick J. Wong <darrick.wong@oracle.com>
Thu, 16 Feb 2023 05:20:08 +0000 (10:50 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Feb 2023 11:50:37 +0000 (12:50 +0100)
commit 919522e89f8e71fc6a8f8abe17be4011573c6ea0 upstream.

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>
Signed-off-by: Chandan Babu R <chandan.babu@oracle.com>
Acked-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/xfs/xfs_bmap_item.c

index e83729bf4997e3d3788e46b19eb8b7d452ea7ebd..381dd4f078b0a3997b966713897d6c3fa8e27c62 100644 (file)
@@ -434,9 +434,7 @@ xfs_bui_recover(
        xfs_fsblock_t                   startblock_fsb;
        xfs_fsblock_t                   inode_fsb;
        xfs_filblks_t                   count;
-       bool                            op_ok;
        struct xfs_bud_log_item         *budp;
-       enum xfs_bmap_intent_type       type;
        int                             whichfork;
        xfs_exntst_t                    state;
        struct xfs_trans                *tp;
@@ -462,16 +460,19 @@ xfs_bui_recover(
                           XFS_FSB_TO_DADDR(mp, bmap->me_startblock));
        inode_fsb = XFS_BB_TO_FSB(mp, XFS_FSB_TO_DADDR(mp,
                        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_UNMAP:
-               op_ok = true;
                break;
        default:
-               op_ok = false;
-               break;
+               return -EFSCORRUPTED;
        }
-       if (!op_ok || startblock_fsb == 0 ||
+       if (startblock_fsb == 0 ||
            bmap->me_len == 0 ||
            inode_fsb == 0 ||
            startblock_fsb >= mp->m_sb.sb_dblocks ||
@@ -502,32 +503,17 @@ xfs_bui_recover(
        if (VFS_I(ip)->i_nlink == 0)
                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);
 
        count = bmap->me_len;
-       error = xfs_trans_log_finish_bmap_update(tp, budp, type, ip, whichfork,
-                       bmap->me_startoff, bmap->me_startblock, &count, state);
+       error = xfs_trans_log_finish_bmap_update(tp, budp, bui_type, ip,
+                       whichfork, bmap->me_startoff, bmap->me_startblock,
+                       &count, state);
        if (error)
                goto err_inode;
 
        if (count > 0) {
-               ASSERT(type == XFS_BMAP_UNMAP);
+               ASSERT(bui_type == XFS_BMAP_UNMAP);
                irec.br_startblock = bmap->me_startblock;
                irec.br_blockcount = count;
                irec.br_startoff = bmap->me_startoff;