return best_disk;
 }
 
+static void wake_up_barrier(struct r1conf *conf)
+{
+       if (wq_has_sleeper(&conf->wait_barrier))
+               wake_up(&conf->wait_barrier);
+}
+
 static void flush_bio_list(struct r1conf *conf, struct bio *bio)
 {
        /* flush any pending bitmap writes to disk before proceeding w/ I/O */
        raid1_prepare_flush_writes(conf->mddev->bitmap);
-       wake_up(&conf->wait_barrier);
+       wake_up_barrier(conf);
 
        while (bio) { /* submit pending writes */
                struct bio *next = bio->bi_next;
         * In case freeze_array() is waiting for
         * get_unqueued_pending() == extra
         */
-       wake_up(&conf->wait_barrier);
+       wake_up_barrier(conf);
        /* Wait for the barrier in same barrier unit bucket to drop. */
 
        /* Return false when nowait flag is set */
         * In case freeze_array() is waiting for
         * get_unqueued_pending() == extra
         */
-       wake_up(&conf->wait_barrier);
+       wake_up_barrier(conf);
        /* Wait for array to be unfrozen */
 
        /* Return false when nowait flag is set */
 static void _allow_barrier(struct r1conf *conf, int idx)
 {
        atomic_dec(&conf->nr_pending[idx]);
-       wake_up(&conf->wait_barrier);
+       wake_up_barrier(conf);
 }
 
 static void allow_barrier(struct r1conf *conf, sector_t sector_nr)
                spin_lock_irq(&conf->device_lock);
                bio_list_merge(&conf->pending_bio_list, &plug->pending);
                spin_unlock_irq(&conf->device_lock);
-               wake_up(&conf->wait_barrier);
+               wake_up_barrier(conf);
                md_wakeup_thread(mddev->thread);
                kfree(plug);
                return;
        r1_bio_write_done(r1_bio);
 
        /* In case raid1d snuck in to freeze_array */
-       wake_up(&conf->wait_barrier);
+       wake_up_barrier(conf);
 }
 
 static bool raid1_make_request(struct mddev *mddev, struct bio *bio)