static void log_write_header(struct gfs2_sbd *sdp, u32 flags)
 {
        blk_opf_t op_flags = REQ_PREFLUSH | REQ_FUA | REQ_META | REQ_SYNC;
+       struct super_block *sb = sdp->sd_vfs;
 
-       gfs2_assert_withdraw(sdp, !test_bit(SDF_FROZEN, &sdp->sd_flags));
+       gfs2_assert_withdraw(sdp, sb->s_writers.frozen != SB_FREEZE_COMPLETE);
 
        if (test_bit(SDF_NOBARRIERS, &sdp->sd_flags)) {
                gfs2_ordered_wait(sdp);
 
        return sdp->sd_log_error;
 }
 
-static int gfs2_freeze_locally(struct gfs2_sbd *sdp)
-{
-       struct super_block *sb = sdp->sd_vfs;
-       int error;
-
-       error = freeze_super(sb, FREEZE_HOLDER_USERSPACE);
-       if (error)
-               return error;
-
-       if (test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
-               gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_FREEZE |
-                              GFS2_LFC_FREEZE_GO_SYNC);
-               if (gfs2_withdrawing_or_withdrawn(sdp)) {
-                       error = thaw_super(sb, FREEZE_HOLDER_USERSPACE);
-                       if (error)
-                               return error;
-                       return -EIO;
-               }
-       }
-       return 0;
-}
-
 static int gfs2_do_thaw(struct gfs2_sbd *sdp)
 {
        struct super_block *sb = sdp->sd_vfs;
        if (test_bit(SDF_FROZEN, &sdp->sd_flags))
                goto freeze_failed;
 
-       error = gfs2_freeze_locally(sdp);
+       error = freeze_super(sb, FREEZE_HOLDER_USERSPACE);
        if (error)
                goto freeze_failed;
 
        }
 
        for (;;) {
-               error = gfs2_freeze_locally(sdp);
+               error = freeze_super(sb, FREEZE_HOLDER_USERSPACE);
                if (error) {
                        fs_info(sdp, "GFS2: couldn't freeze filesystem: %d\n",
                                error);
        return error;
 }
 
+static int gfs2_freeze_fs(struct super_block *sb)
+{
+       struct gfs2_sbd *sdp = sb->s_fs_info;
+
+       if (test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
+               gfs2_log_flush(sdp, NULL, GFS2_LOG_HEAD_FLUSH_FREEZE |
+                              GFS2_LFC_FREEZE_GO_SYNC);
+               if (gfs2_withdrawing_or_withdrawn(sdp))
+                       return -EIO;
+       }
+       return 0;
+}
+
 /**
  * gfs2_thaw_super - reallow writes to the filesystem
  * @sb: the VFS structure for the filesystem
        .put_super              = gfs2_put_super,
        .sync_fs                = gfs2_sync_fs,
        .freeze_super           = gfs2_freeze_super,
+       .freeze_fs              = gfs2_freeze_fs,
        .thaw_super             = gfs2_thaw_super,
        .statfs                 = gfs2_statfs,
        .drop_inode             = gfs2_drop_inode,