xfs: don't assume a left rmap when allocating a new rmap
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 17 Jul 2018 21:24:11 +0000 (14:24 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 17 Jul 2018 21:25:57 +0000 (14:25 -0700)
The original rmap code assumed that there would always be at least one
rmap in the rmapbt (the AG sb/agf/agi) and so errored out if it didn't
find one.  This assumption isn't true for the rmapbt repair function
(and it won't be true for realtime rmap either), so remove the check and
just deal with the situation.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
fs/xfs/libxfs/xfs_rmap.c

index d4460b0d2d81583fe52960df611a903a8def1800..8b2a2f81d110b2bb2c5e60d5be35c80381a8262a 100644 (file)
@@ -753,19 +753,19 @@ xfs_rmap_map(
                        &have_lt);
        if (error)
                goto out_error;
-       XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error);
-
-       error = xfs_rmap_get_rec(cur, &ltrec, &have_lt);
-       if (error)
-               goto out_error;
-       XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error);
-       trace_xfs_rmap_lookup_le_range_result(cur->bc_mp,
-                       cur->bc_private.a.agno, ltrec.rm_startblock,
-                       ltrec.rm_blockcount, ltrec.rm_owner,
-                       ltrec.rm_offset, ltrec.rm_flags);
+       if (have_lt) {
+               error = xfs_rmap_get_rec(cur, &ltrec, &have_lt);
+               if (error)
+                       goto out_error;
+               XFS_WANT_CORRUPTED_GOTO(mp, have_lt == 1, out_error);
+               trace_xfs_rmap_lookup_le_range_result(cur->bc_mp,
+                               cur->bc_private.a.agno, ltrec.rm_startblock,
+                               ltrec.rm_blockcount, ltrec.rm_owner,
+                               ltrec.rm_offset, ltrec.rm_flags);
 
-       if (!xfs_rmap_is_mergeable(&ltrec, owner, flags))
-               have_lt = 0;
+               if (!xfs_rmap_is_mergeable(&ltrec, owner, flags))
+                       have_lt = 0;
+       }
 
        XFS_WANT_CORRUPTED_GOTO(mp,
                have_lt == 0 ||