aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Foster <bfoster@redhat.com>2015-07-03 11:54:41 +1000
committerDave Chinner <david@fromorbit.com>2015-07-03 11:54:41 +1000
commite736ab9b351ad3300dd223b6e4a4e3fdbf37afca (patch)
treec2e9da66602655cb5d97a796415f0184bf6e067c
parentb0e6012463a50a2ca840ade4b0cfb3702d99c23c (diff)
downloadxfsprogs-dev-libxfs-4.2-rc1-update.tar.gz
xfs: check min blks for random debug mode sparse allocationslibxfs-4.2-rc1-update
The inode allocator enables random sparse inode chunk allocations in DEBUG mode to facilitate testing. Sparse inode allocations are not always possible, however, depending on the fs geometry. For example, there is no possibility for a sparse inode allocation on filesystems where the block size is large enough to fit one or more inode chunks within a single block. Fix up the DEBUG mode sparse inode allocation logic to trigger random sparse allocations only when the geometry of the fs allows it. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r--libxfs/xfs_ialloc.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c
index b57f89a7e0..05ecd06176 100644
--- a/libxfs/xfs_ialloc.c
+++ b/libxfs/xfs_ialloc.c
@@ -601,20 +601,20 @@ xfs_ialloc_ag_alloc(
uint16_t allocmask = (uint16_t) -1; /* init. to full chunk */
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;
+#ifdef DEBUG
+ /* randomly do sparse inode allocations */
+ if (xfs_sb_version_hassparseinodes(&tp->t_mountp->m_sb) &&
+ args.mp->m_ialloc_min_blks < args.mp->m_ialloc_blks)
+ do_sparse = prandom_u32() & 1;
+#endif
+
/*
* Locking will ensure that we don't have two callers in here
* at one time.
@@ -763,6 +763,7 @@ sparse_alloc:
return error;
newlen = args.len << args.mp->m_sb.sb_inopblog;
+ ASSERT(newlen <= XFS_INODES_PER_CHUNK);
allocmask = (1 << (newlen / XFS_INODES_PER_HOLEMASK_BIT)) - 1;
}