On Wed, Nov 06, 2019 at 06:27:50PM -0700, Allison Collins wrote: > Break xfs_attr_rmtval_set into two helper functions > xfs_attr_rmt_find_hole and xfs_attr_rmtval_set_value. > xfs_attr_rmtval_set rolls the transaction between the > helpers, but delayed operations cannot. We will use > the helpers later when constructing new delayed > attribute routines. > > Signed-off-by: Allison Collins <allison.henderson@xxxxxxxxxx> > Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> Looks good, Reviewed-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --D > --- > fs/xfs/libxfs/xfs_attr_remote.c | 71 +++++++++++++++++++++++++++++++---------- > fs/xfs/libxfs/xfs_attr_remote.h | 3 +- > 2 files changed, 56 insertions(+), 18 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c > index db9247a..db51388 100644 > --- a/fs/xfs/libxfs/xfs_attr_remote.c > +++ b/fs/xfs/libxfs/xfs_attr_remote.c > @@ -21,6 +21,7 @@ > #include "xfs_attr.h" > #include "xfs_trace.h" > #include "xfs_error.h" > +#include "xfs_attr_remote.h" > > #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ > > @@ -432,34 +433,20 @@ xfs_attr_rmtval_set( > struct xfs_da_args *args) > { > struct xfs_inode *dp = args->dp; > - struct xfs_mount *mp = dp->i_mount; > struct xfs_bmbt_irec map; > xfs_dablk_t lblkno; > - xfs_fileoff_t lfileoff = 0; > - uint8_t *src = args->value; > int blkcnt; > - int valuelen; > int nmap; > int error; > - int offset = 0; > > trace_xfs_attr_rmtval_set(args); > > - /* > - * Find a "hole" in the attribute address space large enough for > - * us to drop the new attribute's value into. Because CRC enable > - * attributes have headers, we can't just do a straight byte to FSB > - * conversion and have to take the header space into account. > - */ > - blkcnt = xfs_attr3_rmt_blocks(mp, args->rmtvaluelen); > - error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, > - XFS_ATTR_FORK); > + error = xfs_attr_rmt_find_hole(args); > if (error) > return error; > > - args->rmtblkno = lblkno = (xfs_dablk_t)lfileoff; > - args->rmtblkcnt = blkcnt; > - > + blkcnt = args->rmtblkcnt; > + lblkno = (xfs_dablk_t)args->rmtblkno; > /* > * Roll through the "value", allocating blocks on disk as required. > */ > @@ -500,6 +487,56 @@ xfs_attr_rmtval_set( > return error; > } > > + return xfs_attr_rmtval_set_value(args); > +} > + > + > +/* > + * Find a "hole" in the attribute address space large enough for us to drop the > + * new attribute's value into > + */ > +int > +xfs_attr_rmt_find_hole( > + struct xfs_da_args *args) > +{ > + struct xfs_inode *dp = args->dp; > + struct xfs_mount *mp = dp->i_mount; > + int error; > + int blkcnt; > + xfs_fileoff_t lfileoff = 0; > + > + /* > + * Because CRC enable attributes have headers, we can't just do a > + * straight byte to FSB conversion and have to take the header space > + * into account. > + */ > + blkcnt = xfs_attr3_rmt_blocks(mp, args->rmtvaluelen); > + error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff, > + XFS_ATTR_FORK); > + if (error) > + return error; > + > + args->rmtblkno = (xfs_dablk_t)lfileoff; > + args->rmtblkcnt = blkcnt; > + > + return 0; > +} > + > +int > +xfs_attr_rmtval_set_value( > + struct xfs_da_args *args) > +{ > + struct xfs_inode *dp = args->dp; > + struct xfs_mount *mp = dp->i_mount; > + struct xfs_bmbt_irec map; > + xfs_dablk_t lblkno; > + uint8_t *src = args->value; > + int blkcnt; > + int valuelen; > + int nmap; > + int error; > + int offset = 0; > + > /* > * Roll through the "value", copying the attribute value to the > * already-allocated blocks. Blocks are written synchronously > diff --git a/fs/xfs/libxfs/xfs_attr_remote.h b/fs/xfs/libxfs/xfs_attr_remote.h > index 9d20b66..cd7670d 100644 > --- a/fs/xfs/libxfs/xfs_attr_remote.h > +++ b/fs/xfs/libxfs/xfs_attr_remote.h > @@ -11,5 +11,6 @@ int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); > int xfs_attr_rmtval_get(struct xfs_da_args *args); > int xfs_attr_rmtval_set(struct xfs_da_args *args); > int xfs_attr_rmtval_remove(struct xfs_da_args *args); > - > +int xfs_attr_rmtval_set_value(struct xfs_da_args *args); > +int xfs_attr_rmt_find_hole(struct xfs_da_args *args); > #endif /* __XFS_ATTR_REMOTE_H__ */ > -- > 2.7.4 >