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 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs