diff --git a/fs/xfs/scrub/attr_repair.c b/fs/xfs/scrub/attr_repair.c index c7695d4cc8e7..f2868fb4d27a 100644 --- a/fs/xfs/scrub/attr_repair.c +++ b/fs/xfs/scrub/attr_repair.c @@ -1319,21 +1319,8 @@ xrep_xattr_swap_prep( * that to an empty extent list in preparation for the atomic mapping * exchange. */ - if (ip_local) { - struct xfs_ifork *ifp; - - ifp = xfs_ifork_ptr(sc->ip, XFS_ATTR_FORK); - - xfs_idestroy_fork(ifp); - ifp->if_format = XFS_DINODE_FMT_EXTENTS; - ifp->if_nextents = 0; - ifp->if_bytes = 0; - ifp->if_data = NULL; - ifp->if_height = 0; - - xfs_trans_log_inode(sc->tp, sc->ip, - XFS_ILOG_CORE | XFS_ILOG_ADATA); - } + if (ip_local) + xrep_reset_fork_to_extents(sc, XFS_ATTR_FORK); return 0; } diff --git a/fs/xfs/scrub/dir_repair.c b/fs/xfs/scrub/dir_repair.c index 2cfcf1c35679..5db1ec324409 100644 --- a/fs/xfs/scrub/dir_repair.c +++ b/fs/xfs/scrub/dir_repair.c @@ -1510,20 +1510,8 @@ xrep_dir_swap_prep( * to an empty extent list in preparation for the atomic mapping * exchange. */ - if (ip_local) { - struct xfs_ifork *ifp; - - ifp = xfs_ifork_ptr(sc->ip, XFS_DATA_FORK); - xfs_idestroy_fork(ifp); - ifp->if_format = XFS_DINODE_FMT_EXTENTS; - ifp->if_nextents = 0; - ifp->if_bytes = 0; - ifp->if_data = NULL; - ifp->if_height = 0; - - xfs_trans_log_inode(sc->tp, sc->ip, - XFS_ILOG_CORE | XFS_ILOG_DDATA); - } + if (ip_local) + xrep_reset_fork_to_extents(sc, XFS_DATA_FORK); return 0; } diff --git a/fs/xfs/scrub/repair.c b/fs/xfs/scrub/repair.c index 956aa75218aa..dd00d4ed8c17 100644 --- a/fs/xfs/scrub/repair.c +++ b/fs/xfs/scrub/repair.c @@ -882,6 +882,37 @@ xrep_ino_ensure_extent_count( return 0; } +/* Discard the contents of this fork and initialize as empty extent-format. */ +void +xrep_reset_fork_to_extents( + struct xfs_scrub *sc, + int whichfork) +{ + struct xfs_ifork *ifp = xfs_ifork_ptr(sc->ip, whichfork); + uint ilog_flags = XFS_ILOG_CORE; + + switch (whichfork) { + case XFS_DATA_FORK: + ilog_flags |= XFS_ILOG_DDATA; + break; + case XFS_ATTR_FORK: + ilog_flags |= XFS_ILOG_ADATA; + break; + default: + ASSERT(0); + return; + } + + xfs_idestroy_fork(ifp); + ifp->if_format = XFS_DINODE_FMT_EXTENTS; + ifp->if_nextents = 0; + ifp->if_bytes = 0; + ifp->if_data = NULL; + ifp->if_height = 0; + + xfs_trans_log_inode(sc->tp, sc->ip, ilog_flags); +} + /* * Initialize all the btree cursors for an AG repair except for the btree that * we're rebuilding. diff --git a/fs/xfs/scrub/repair.h b/fs/xfs/scrub/repair.h index 2bb125c4f9bf..c1ba462e4426 100644 --- a/fs/xfs/scrub/repair.h +++ b/fs/xfs/scrub/repair.h @@ -81,6 +81,7 @@ int xrep_setup_xfbtree(struct xfs_scrub *sc, const char *descr); int xrep_ino_ensure_extent_count(struct xfs_scrub *sc, int whichfork, xfs_extnum_t nextents); int xrep_reset_perag_resv(struct xfs_scrub *sc); +void xrep_reset_fork_to_extents(struct xfs_scrub *sc, int whichfork); int xrep_bmap(struct xfs_scrub *sc, int whichfork, bool allow_unwritten); int xrep_metadata_inode_forks(struct xfs_scrub *sc); int xrep_setup_ag_rmapbt(struct xfs_scrub *sc); diff --git a/fs/xfs/scrub/symlink_repair.c b/fs/xfs/scrub/symlink_repair.c index 181961364233..9f6901905bfd 100644 --- a/fs/xfs/scrub/symlink_repair.c +++ b/fs/xfs/scrub/symlink_repair.c @@ -303,20 +303,8 @@ xrep_symlink_swap_prep( * to an empty extent list in preparation for the atomic mapping * exchange. */ - if (ip_local) { - struct xfs_ifork *ifp; - - ifp = xfs_ifork_ptr(sc->ip, XFS_DATA_FORK); - xfs_idestroy_fork(ifp); - ifp->if_format = XFS_DINODE_FMT_EXTENTS; - ifp->if_nextents = 0; - ifp->if_bytes = 0; - ifp->if_data = NULL; - ifp->if_height = 0; - - xfs_trans_log_inode(sc->tp, sc->ip, - XFS_ILOG_CORE | XFS_ILOG_DDATA); - } + if (ip_local) + xrep_reset_fork_to_extents(sc, XFS_DATA_FORK); return 0; }