xfs: print dangling delalloc extents
authorChristoph Hellwig <hch@lst.de>
Thu, 18 Oct 2018 06:20:11 +0000 (17:20 +1100)
committerDave Chinner <david@fromorbit.com>
Thu, 18 Oct 2018 06:20:11 +0000 (17:20 +1100)
Instead of just asserting that we have no delalloc space dangling
in an inode that gets freed print the actual offenders for debug
mode.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_super.c

index 207ee30..99250bc 100644 (file)
@@ -933,6 +933,32 @@ xfs_fs_alloc_inode(
        return NULL;
 }
 
+#ifdef DEBUG
+static void
+xfs_check_delalloc(
+       struct xfs_inode        *ip,
+       int                     whichfork)
+{
+       struct xfs_ifork        *ifp = XFS_IFORK_PTR(ip, whichfork);
+       struct xfs_bmbt_irec    got;
+       struct xfs_iext_cursor  icur;
+
+       if (!ifp || !xfs_iext_lookup_extent(ip, ifp, 0, &icur, &got))
+               return;
+       do {
+               if (isnullstartblock(got.br_startblock)) {
+                       xfs_warn(ip->i_mount,
+       "ino %llx %s fork has delalloc extent at [0x%llx:0x%llx]",
+                               ip->i_ino,
+                               whichfork == XFS_DATA_FORK ? "data" : "cow",
+                               got.br_startoff, got.br_blockcount);
+               }
+       } while (xfs_iext_next_extent(ifp, &icur, &got));
+}
+#else
+#define xfs_check_delalloc(ip, whichfork)      do { } while (0)
+#endif
+
 /*
  * Now that the generic code is guaranteed not to be accessing
  * the linux inode, we can inactivate and reclaim the inode.
@@ -951,7 +977,12 @@ xfs_fs_destroy_inode(
 
        xfs_inactive(ip);
 
-       ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0);
+       if (!XFS_FORCED_SHUTDOWN(ip->i_mount) && ip->i_delayed_blks) {
+               xfs_check_delalloc(ip, XFS_DATA_FORK);
+               xfs_check_delalloc(ip, XFS_COW_FORK);
+               ASSERT(0);
+       }
+
        XFS_STATS_INC(ip->i_mount, vn_reclaim);
 
        /*