* Write the MMP block using REQ_SYNC to try to get the block on-disk
  * faster.
  */
-static int write_mmp_block(struct super_block *sb, struct buffer_head *bh)
+static int write_mmp_block_thawed(struct super_block *sb,
+                                 struct buffer_head *bh)
 {
        struct mmp_struct *mmp = (struct mmp_struct *)(bh->b_data);
 
-       /*
-        * We protect against freezing so that we don't create dirty buffers
-        * on frozen filesystem.
-        */
-       sb_start_write(sb);
        ext4_mmp_csum_set(sb, mmp);
        lock_buffer(bh);
        bh->b_end_io = end_buffer_write_sync;
        get_bh(bh);
        submit_bh(REQ_OP_WRITE | REQ_SYNC | REQ_META | REQ_PRIO, bh);
        wait_on_buffer(bh);
-       sb_end_write(sb);
        if (unlikely(!buffer_uptodate(bh)))
                return -EIO;
-
        return 0;
 }
 
+static int write_mmp_block(struct super_block *sb, struct buffer_head *bh)
+{
+       int err;
+
+       /*
+        * We protect against freezing so that we don't create dirty buffers
+        * on frozen filesystem.
+        */
+       sb_start_write(sb);
+       err = write_mmp_block_thawed(sb, bh);
+       sb_end_write(sb);
+       return err;
+}
+
 /*
  * Read the MMP block. It _must_ be read from disk and hence we clear the
  * uptodate flag on the buffer.
        seq = mmp_new_seq();
        mmp->mmp_seq = cpu_to_le32(seq);
 
-       retval = write_mmp_block(sb, bh);
+       /*
+        * On mount / remount we are protected against fs freezing (by s_umount
+        * semaphore) and grabbing freeze protection upsets lockdep
+        */
+       retval = write_mmp_block_thawed(sb, bh);
        if (retval)
                goto failed;