On Thu, Sep 05, 2019 at 03:18:23PM -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> > --- > fs/xfs/libxfs/xfs_attr_remote.c | 72 +++++++++++++++++++++++++++++++---------- > fs/xfs/libxfs/xfs_attr_remote.h | 3 +- > 2 files changed, 57 insertions(+), 18 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c > index db9247a..080a284 100644 > --- a/fs/xfs/libxfs/xfs_attr_remote.c > +++ b/fs/xfs/libxfs/xfs_attr_remote.c ... > @@ -500,6 +487,57 @@ xfs_attr_rmtval_set( > return error; > } > > + error = xfs_attr_rmtval_set_value(args); > + 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 = args->rmtblkno; The init of lfileoff looks a little strange here. It was originally initialized to zero, passed into the call below and then assigned to ->rmtblkno. Is this change intentional? With those nits fixed: Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > + > + /* > + * 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 >