On Mon, Oct 07, 2019 at 09:19:38AM -0400, Brian Foster wrote: > The callers of xfs_bmap_local_to_extents_empty() log the inode > external to the function, yet this function is where the on-disk > format value is updated. Push the inode logging down into the > function itself to help prevent future mistakes. > > Note that internal bmap callers track the inode logging flags > independently and thus may log the inode core twice due to this > change. This is harmless, so leave this code around for consistency > with the other attr fork conversion functions. > > Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx> Looks ok, Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --D > --- > fs/xfs/libxfs/xfs_attr_leaf.c | 3 +-- > fs/xfs/libxfs/xfs_bmap.c | 6 ++++-- > fs/xfs/libxfs/xfs_bmap.h | 3 ++- > fs/xfs/libxfs/xfs_dir2_block.c | 3 +-- > 4 files changed, 8 insertions(+), 7 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c > index 1b956c313b6b..f0089e862216 100644 > --- a/fs/xfs/libxfs/xfs_attr_leaf.c > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c > @@ -826,8 +826,7 @@ xfs_attr_shortform_to_leaf( > sf = (xfs_attr_shortform_t *)tmpbuffer; > > xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); > - xfs_bmap_local_to_extents_empty(dp, XFS_ATTR_FORK); > - xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE); > + xfs_bmap_local_to_extents_empty(args->trans, dp, XFS_ATTR_FORK); > > bp = NULL; > error = xfs_da_grow_inode(args, &blkno); > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 4edc25a2ba80..02469d59c787 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -792,6 +792,7 @@ xfs_bmap_extents_to_btree( > */ > void > xfs_bmap_local_to_extents_empty( > + struct xfs_trans *tp, > struct xfs_inode *ip, > int whichfork) > { > @@ -808,6 +809,7 @@ xfs_bmap_local_to_extents_empty( > ifp->if_u1.if_root = NULL; > ifp->if_height = 0; > XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > } > > > @@ -840,7 +842,7 @@ xfs_bmap_local_to_extents( > ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL); > > if (!ifp->if_bytes) { > - xfs_bmap_local_to_extents_empty(ip, whichfork); > + xfs_bmap_local_to_extents_empty(tp, ip, whichfork); > flags = XFS_ILOG_CORE; > goto done; > } > @@ -887,7 +889,7 @@ xfs_bmap_local_to_extents( > > /* account for the change in fork size */ > xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); > - xfs_bmap_local_to_extents_empty(ip, whichfork); > + xfs_bmap_local_to_extents_empty(tp, ip, whichfork); > flags |= XFS_ILOG_CORE; > > ifp->if_u1.if_root = NULL; > diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h > index 5bb446d80542..e2798c6f3a5f 100644 > --- a/fs/xfs/libxfs/xfs_bmap.h > +++ b/fs/xfs/libxfs/xfs_bmap.h > @@ -182,7 +182,8 @@ void xfs_trim_extent(struct xfs_bmbt_irec *irec, xfs_fileoff_t bno, > xfs_filblks_t len); > int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); > int xfs_bmap_set_attrforkoff(struct xfs_inode *ip, int size, int *version); > -void xfs_bmap_local_to_extents_empty(struct xfs_inode *ip, int whichfork); > +void xfs_bmap_local_to_extents_empty(struct xfs_trans *tp, > + struct xfs_inode *ip, int whichfork); > void __xfs_bmap_add_free(struct xfs_trans *tp, xfs_fsblock_t bno, > xfs_filblks_t len, const struct xfs_owner_info *oinfo, > bool skip_discard); > diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c > index 3d1e5f6d64fd..49e4bc39e7bb 100644 > --- a/fs/xfs/libxfs/xfs_dir2_block.c > +++ b/fs/xfs/libxfs/xfs_dir2_block.c > @@ -1096,9 +1096,8 @@ xfs_dir2_sf_to_block( > memcpy(sfp, oldsfp, ifp->if_bytes); > > xfs_idata_realloc(dp, -ifp->if_bytes, XFS_DATA_FORK); > - xfs_bmap_local_to_extents_empty(dp, XFS_DATA_FORK); > + xfs_bmap_local_to_extents_empty(tp, dp, XFS_DATA_FORK); > dp->i_d.di_size = 0; > - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); > > /* > * Add block 0 to the inode. > -- > 2.20.1 >