Merge branch 'xfs-misc-fixes-for-4.2-2' into for-next
authorDave Chinner <david@fromorbit.com>
Thu, 4 Jun 2015 03:31:13 +0000 (13:31 +1000)
committerDave Chinner <david@fromorbit.com>
Thu, 4 Jun 2015 03:31:13 +0000 (13:31 +1000)
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/xfs_inode.c

index a18bc75cc2160af82945523b1112eb9f68625052..66efc702452a0cd45920ce3fd021c689d7bdd40b 100644 (file)
@@ -606,20 +606,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.
@@ -768,6 +768,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;
        }
 
index 4c054f6634b92872dad6ae31578e180185ecc036..17cd90c1963494f728927191ed6154d0557caa20 100644 (file)
@@ -2244,6 +2244,7 @@ xfs_ifree_cluster(
        int                     inodes_per_cluster;
        int                     nbufs;
        int                     i, j;
+       int                     ioffset;
        xfs_daddr_t             blkno;
        xfs_buf_t               *bp;
        xfs_inode_t             *ip;
@@ -2264,9 +2265,9 @@ xfs_ifree_cluster(
                 * physically allocated. Skip the cluster if an inode falls into
                 * a sparse region.
                 */
-               if ((xic->alloc & XFS_INOBT_MASK(inum - xic->first_ino)) == 0) {
-                       ASSERT(((inum - xic->first_ino) %
-                               inodes_per_cluster) == 0);
+               ioffset = inum - xic->first_ino;
+               if ((xic->alloc & XFS_INOBT_MASK(ioffset)) == 0) {
+                       ASSERT(do_mod(ioffset, inodes_per_cluster) == 0);
                        continue;
                }