aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/linux-2.6/xfs_super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_super.c')
-rw-r--r--fs/xfs/linux-2.6/xfs_super.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c
index dab5d3802374..003e5f29d684 100644
--- a/fs/xfs/linux-2.6/xfs_super.c
+++ b/fs/xfs/linux-2.6/xfs_super.c
@@ -659,9 +659,17 @@ xfs_fs_sync_super(
659 int error; 659 int error;
660 int flags; 660 int flags;
661 661
662 if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) 662 if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) {
663 flags = SYNC_QUIESCE; 663 /*
664 else 664 * First stage of freeze - no more writers will make progress
665 * now we are here, so we flush delwri and delalloc buffers
666 * here, then wait for all I/O to complete. Data is frozen at
667 * that point. Metadata is not frozen, transactions can still
668 * occur here so don't bother flushing the buftarg (i.e
669 * SYNC_QUIESCE) because it'll just get dirty again.
670 */
671 flags = SYNC_FSDATA | SYNC_DELWRI | SYNC_WAIT | SYNC_DIO_WAIT;
672 } else
665 flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); 673 flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0);
666 674
667 error = bhv_vfs_sync(vfsp, flags, NULL); 675 error = bhv_vfs_sync(vfsp, flags, NULL);