On Sat, Dec 19, 2015 at 12:56:42AM -0800, Darrick J. Wong wrote:
> Create a macro to generate btree height calculator functions.
> This will be used (much) later when we get to the refcount
> btree.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
....
> +/* btree size calculator templates */
> +#define DECLARE_BTREE_SIZE_FN(btree) \
> +xfs_filblks_t xfs_##btree##_calc_btree_size(struct xfs_mount *mp, \
> + unsigned long len);
> +
> +#define DEFINE_BTREE_SIZE_FN(btree, limitfield, maxlevels) \
> +xfs_filblks_t \
> +xfs_##btree##_calc_btree_size( \
> + struct xfs_mount *mp, \
> + unsigned long len) \
> +{ \
> + int level; \
> + int maxrecs; \
> + xfs_filblks_t rval; \
> +\
> + maxrecs = mp->limitfield[0]; \
> + for (level = 0, rval = 0; level < maxlevels; level++) { \
> + len += maxrecs - 1; \
> + do_div(len, maxrecs); \
> + rval += len; \
> + if (len == 1) \
> + return rval + maxlevels - \
> + level - 1; \
> + if (level == 0) \
> + maxrecs = mp->limitfield[1]; \
> + } \
> + return rval; \
> +}
I really don't like using macros like this. The code becomes hard to
debug, hard to edit, the functions don't show up in grep/cscope,
etc.
A helper function like this:
xfs_filblks_t
xfs_btree_calc_size(
struct xfs_mount *mp,
int *limits,
int maxlevels,
unsigned long len)
{
int level;
int maxrecs;
xfs_filblks_t rval;
maxrecs = limits[0];
for (level = 0, rval = 0; level < maxlevels; level++) {
len += maxrecs - 1;
do_div(len, maxrecs);
rval += len;
if (len == 1)
return rval + maxlevels - level - 1;
if (level == 0)
maxrecs = limits[1];
}
return rval;
}
will work just as well when wrapped with the btree specific calling
function and that will have none of the problems using a macro to
build the functions has...
Cheers,
Dave.
--
Dave Chinner
david@xxxxxxxxxxxxx
|