Re: [PATCH v4 06/17] xfs: Factor out new helper functions xfs_attr_rmtval_set

Allison Collins
2019-11-08T19:52:03Z

On 11/8/19 12:34 PM, Darrick J. Wong wrote:
> 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@oracle.com>
>> Reviewed-by: Brian Foster <bfoster@redhat.com>
>
> Looks good,
> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
>
> --D

Alrighty, thanks for the reviews!
Allison

>
>> ---
>> 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
>>