blk_limits_io_opt(limits, chunk_size * mddev_data_stripes(rs));
 }
 
-static void raid_presuspend(struct dm_target *ti)
-{
-       struct raid_set *rs = ti->private;
-
-       md_stop_writes(&rs->md);
-}
-
 static void raid_postsuspend(struct dm_target *ti)
 {
        struct raid_set *rs = ti->private;
 
        if (!test_and_set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags)) {
+               /* Writes have to be stopped before suspending to avoid deadlocks. */
+               if (!test_bit(MD_RECOVERY_FROZEN, &rs->md.recovery))
+                       md_stop_writes(&rs->md);
+
                mddev_lock_nointr(&rs->md);
                mddev_suspend(&rs->md);
                mddev_unlock(&rs->md);
        }
-
-       rs->md.ro = 1;
 }
 
 static void attempt_restore_of_faulty_devices(struct raid_set *rs)
        .message = raid_message,
        .iterate_devices = raid_iterate_devices,
        .io_hints = raid_io_hints,
-       .presuspend = raid_presuspend,
        .postsuspend = raid_postsuspend,
        .preresume = raid_preresume,
        .resume = raid_resume,