|
@@ -933,6 +933,32 @@ xfs_fs_alloc_inode(
|
|
return NULL;
|
|
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
|
|
* Now that the generic code is guaranteed not to be accessing
|
|
* the linux inode, we can inactivate and reclaim the inode.
|
|
* the linux inode, we can inactivate and reclaim the inode.
|
|
@@ -951,7 +977,12 @@ xfs_fs_destroy_inode(
|
|
|
|
|
|
xfs_inactive(ip);
|
|
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);
|
|
XFS_STATS_INC(ip->i_mount, vn_reclaim);
|
|
|
|
|
|
/*
|
|
/*
|