]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: randomly do sparse inode allocations in DEBUG mode
authorBrian Foster <bfoster@redhat.com>
Thu, 28 May 2015 23:19:29 +0000 (09:19 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 30 Jul 2015 23:11:07 +0000 (09:11 +1000)
Sparse inode allocations generally only occur when full inode chunk
allocation fails. This requires some level of filesystem space usage and
fragmentation.

For filesystems formatted with sparse inode chunks enabled, do random
sparse inode chunk allocs when compiled in DEBUG mode to increase test
coverage.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
libxfs/xfs_ialloc.c

index ac7fcecf3e4488cd0e1d5063cafe0c1ce4e7f898..ebb0cc5216cdfb4703a654922676baaeb0953359 100644 (file)
@@ -602,9 +602,18 @@ xfs_ialloc_ag_alloc(
        struct xfs_inobt_rec_incore rec;
        struct xfs_perag *pag;
 
+       int             do_sparse = 0;
+
+#ifdef DEBUG
+       /* randomly do sparse inode allocations */
+       if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb))
+               do_sparse = prandom_u32() & 1;
+#endif
+
        memset(&args, 0, sizeof(args));
        args.tp = tp;
        args.mp = tp->t_mountp;
+       args.fsbno = NULLFSBLOCK;
 
        /*
         * Locking will ensure that we don't have two callers in here
@@ -626,6 +635,8 @@ xfs_ialloc_ag_alloc(
        agno = be32_to_cpu(agi->agi_seqno);
        args.agbno = XFS_AGINO_TO_AGBNO(args.mp, newino) +
                     args.mp->m_ialloc_blks;
+       if (do_sparse)
+               goto sparse_alloc;
        if (likely(newino != NULLAGINO &&
                  (args.agbno < be32_to_cpu(agi->agi_length)))) {
                args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno);
@@ -664,8 +675,7 @@ xfs_ialloc_ag_alloc(
                 * subsequent requests.
                 */
                args.minalignslop = 0;
-       } else
-               args.fsbno = NULLFSBLOCK;
+       }
 
        if (unlikely(args.fsbno == NULLFSBLOCK)) {
                /*
@@ -723,6 +733,7 @@ xfs_ialloc_ag_alloc(
        if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) &&
            args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks &&
            args.fsbno == NULLFSBLOCK) {
+sparse_alloc:
                args.type = XFS_ALLOCTYPE_NEAR_BNO;
                args.agbno = be32_to_cpu(agi->agi_root);
                args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno);