Skip to content

Commit

Permalink
xfs: add BMAPI_NORMAP flag to perform block remapping without updatin…
Browse files Browse the repository at this point in the history
…g rmapbt

Add a new flag, XFS_BMAPI_NORMAP, which will perform file block
remapping without updating the rmapbt.  This will be used by the repair
code to reconstruct bmbts from the rmapbt, in which case we don't want
the rmapbt update.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
  • Loading branch information
Darrick J. Wong committed May 16, 2018
1 parent 08daa3c commit 95eb308
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 12 deletions.
29 changes: 18 additions & 11 deletions fs/xfs/libxfs/xfs_bmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2005,10 +2005,13 @@ xfs_bmap_add_extent_delay_real(
ASSERT(0);
}

/* add reverse mapping */
error = xfs_rmap_map_extent(mp, bma->dfops, bma->ip, whichfork, new);
if (error)
goto done;
/* add reverse mapping unless caller opted out */
if (!(bma->flags & XFS_BMAPI_NORMAP)) {
error = xfs_rmap_map_extent(mp, bma->dfops, bma->ip,
whichfork, new);
if (error)
goto done;
}

/* convert to a btree if necessary */
if (xfs_bmap_needs_btree(bma->ip, whichfork)) {
Expand Down Expand Up @@ -2672,7 +2675,8 @@ xfs_bmap_add_extent_hole_real(
struct xfs_bmbt_irec *new,
xfs_fsblock_t *first,
struct xfs_defer_ops *dfops,
int *logflagsp)
int *logflagsp,
int flags)
{
struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork);
struct xfs_mount *mp = ip->i_mount;
Expand Down Expand Up @@ -2849,10 +2853,12 @@ xfs_bmap_add_extent_hole_real(
break;
}

/* add reverse mapping */
error = xfs_rmap_map_extent(mp, dfops, ip, whichfork, new);
if (error)
goto done;
/* add reverse mapping unless caller opted out */
if (!(flags & XFS_BMAPI_NORMAP)) {
error = xfs_rmap_map_extent(mp, dfops, ip, whichfork, new);
if (error)
goto done;
}

/* convert to a btree if necessary */
if (xfs_bmap_needs_btree(ip, whichfork)) {
Expand Down Expand Up @@ -4127,7 +4133,8 @@ xfs_bmapi_allocate(
else
error = xfs_bmap_add_extent_hole_real(bma->tp, bma->ip,
whichfork, &bma->icur, &bma->cur, &bma->got,
bma->firstblock, bma->dfops, &bma->logflags);
bma->firstblock, bma->dfops, &bma->logflags,
bma->flags);

bma->logflags |= tmp_logflags;
if (error)
Expand Down Expand Up @@ -4573,7 +4580,7 @@ xfs_bmapi_remap(
got.br_state = XFS_EXT_NORM;

error = xfs_bmap_add_extent_hole_real(tp, ip, XFS_DATA_FORK, &icur,
&cur, &got, &firstblock, dfops, &logflags);
&cur, &got, &firstblock, dfops, &logflags, 0);
if (error)
goto error0;

Expand Down
6 changes: 5 additions & 1 deletion fs/xfs/libxfs/xfs_bmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ struct xfs_extent_free_item
/* Skip online discard of freed extents */
#define XFS_BMAPI_NODISCARD 0x1000

/* Do not update the rmap btree. Used for reconstructing bmbt from rmapbt. */
#define XFS_BMAPI_NORMAP 0x2000

#define XFS_BMAPI_FLAGS \
{ XFS_BMAPI_ENTIRE, "ENTIRE" }, \
{ XFS_BMAPI_METADATA, "METADATA" }, \
Expand All @@ -133,7 +136,8 @@ struct xfs_extent_free_item
{ XFS_BMAPI_COWFORK, "COWFORK" }, \
{ XFS_BMAPI_DELALLOC, "DELALLOC" }, \
{ XFS_BMAPI_CONVERT_ONLY, "CONVERT_ONLY" }, \
{ XFS_BMAPI_NODISCARD, "NODISCARD" }
{ XFS_BMAPI_NODISCARD, "NODISCARD" }, \
{ XFS_BMAPI_NORMAP, "NORMAP" }


static inline int xfs_bmapi_aflag(int w)
Expand Down

0 comments on commit 95eb308

Please sign in to comment.