On Mon, Jul 26, 2021 at 05:15:41PM +0530, Chandan Babu R wrote: > This commit adds a new error tag to allow user space tests to check if V5 > bulkstat ioctl skips reporting inodes with large extent count. > > Signed-off-by: Chandan Babu R <chandanrlinux@xxxxxxxxx> Keep in mind that each of these injection knobs costs us 4 bytes per mount. No particular objections, but I don't know how urgently we need to do that to test a corner case... Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/xfs/libxfs/xfs_errortag.h | 4 +++- > fs/xfs/xfs_error.c | 3 +++ > fs/xfs/xfs_itable.c | 9 ++++++++- > 3 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_errortag.h b/fs/xfs/libxfs/xfs_errortag.h > index f5fa2151e05d..b2c533153737 100644 > --- a/fs/xfs/libxfs/xfs_errortag.h > +++ b/fs/xfs/libxfs/xfs_errortag.h > @@ -60,7 +60,8 @@ > #define XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT 37 > #define XFS_ERRTAG_AG_RESV_FAIL 38 > #define XFS_ERRTAG_SWAPEXT_FINISH_ONE 39 > -#define XFS_ERRTAG_MAX 40 > +#define XFS_ERRTAG_BULKSTAT_REDUCE_MAX_IEXTENTS 40 > +#define XFS_ERRTAG_MAX 41 > > /* > * Random factors for above tags, 1 means always, 2 means 1/2 time, etc. > @@ -105,5 +106,6 @@ > #define XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT 1 > #define XFS_RANDOM_AG_RESV_FAIL 1 > #define XFS_RANDOM_SWAPEXT_FINISH_ONE 1 > +#define XFS_RANDOM_BULKSTAT_REDUCE_MAX_IEXTENTS 1 > > #endif /* __XFS_ERRORTAG_H_ */ > diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c > index e25b440cbfd3..e2a9446fb025 100644 > --- a/fs/xfs/xfs_error.c > +++ b/fs/xfs/xfs_error.c > @@ -58,6 +58,7 @@ static unsigned int xfs_errortag_random_default[] = { > XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT, > XFS_RANDOM_AG_RESV_FAIL, > XFS_RANDOM_SWAPEXT_FINISH_ONE, > + XFS_RANDOM_BULKSTAT_REDUCE_MAX_IEXTENTS, > }; > > struct xfs_errortag_attr { > @@ -172,6 +173,7 @@ XFS_ERRORTAG_ATTR_RW(reduce_max_iextents, XFS_ERRTAG_REDUCE_MAX_IEXTENTS); > XFS_ERRORTAG_ATTR_RW(bmap_alloc_minlen_extent, XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT); > XFS_ERRORTAG_ATTR_RW(ag_resv_fail, XFS_ERRTAG_AG_RESV_FAIL); > XFS_ERRORTAG_ATTR_RW(swapext_finish_one, XFS_RANDOM_SWAPEXT_FINISH_ONE); > +XFS_ERRORTAG_ATTR_RW(bulkstat_reduce_max_iextents, XFS_ERRTAG_BULKSTAT_REDUCE_MAX_IEXTENTS); > > static struct attribute *xfs_errortag_attrs[] = { > XFS_ERRORTAG_ATTR_LIST(noerror), > @@ -214,6 +216,7 @@ static struct attribute *xfs_errortag_attrs[] = { > XFS_ERRORTAG_ATTR_LIST(bmap_alloc_minlen_extent), > XFS_ERRORTAG_ATTR_LIST(ag_resv_fail), > XFS_ERRORTAG_ATTR_LIST(swapext_finish_one), > + XFS_ERRORTAG_ATTR_LIST(bulkstat_reduce_max_iextents), > NULL, > }; > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 8493870a0a87..1b252d1cda9d 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -20,6 +20,7 @@ > #include "xfs_icache.h" > #include "xfs_health.h" > #include "xfs_trans.h" > +#include "xfs_errortag.h" > > /* > * Bulk Stat > @@ -143,7 +144,13 @@ xfs_bulkstat_one_int( > > nextents = xfs_ifork_nextents(&ip->i_df); > if (bc->breq->version != XFS_BULKSTAT_VERSION_V6) { > - if (nextents > XFS_IFORK_EXTCNT_MAXS32) { > + xfs_extnum_t max_nextents = XFS_IFORK_EXTCNT_MAXS32; > + > + if (unlikely(XFS_TEST_ERROR(false, mp, > + XFS_ERRTAG_BULKSTAT_REDUCE_MAX_IEXTENTS))) > + max_nextents = 10; > + > + if (nextents > max_nextents) { > xfs_iunlock(ip, XFS_ILOCK_SHARED); > xfs_irele(ip); > error = -EINVAL; > -- > 2.30.2 >