summaryrefslogtreecommitdiff
path: root/fs/xfs/xfs_super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_super.c')
-rw-r--r--fs/xfs/xfs_super.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index b234e484fad0..919c6f4b0c22 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1116,6 +1116,24 @@ xfs_fs_sync_fs(
if (!wait)
return 0;
+ /*
+ * If we're in the middle of freezing the filesystem, this is our last
+ * chance to run regular transactions. Clear all the COW staging
+ * extents so that we can freeze the filesystem with as little recovery
+ * work to do at the next mount as possible. It's safe to do this
+ * without locking inodes because the freezer code flushed all the
+ * dirty data from the page cache and locked out writes and page faults.
+ */
+ if (sb->s_writers.frozen == SB_FREEZE_PAGEFAULT) {
+ int error;
+
+ error = xfs_icache_free_cowblocks(mp, NULL);
+ if (error) {
+ xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
+ return error;
+ }
+ }
+
xfs_log_force(mp, XFS_LOG_SYNC);
if (laptop_mode) {
/*