"Set to Y if all devices in each array reliably return zeroes on reads from discarded regions");
 static struct workqueue_struct *raid5_wq;
 
+static void raid5_quiesce(struct mddev *mddev, int quiesce);
+
 static inline struct hlist_head *stripe_hash(struct r5conf *conf, sector_t sect)
 {
        int hash = (sect >> RAID5_STRIPE_SHIFT(conf)) & HASH_MASK;
        unsigned long cpu;
        int err = 0;
 
-       /*
-        * Never shrink. And mddev_suspend() could deadlock if this is called
-        * from raid5d. In that case, scribble_disks and scribble_sectors
-        * should equal to new_disks and new_sectors
-        */
+       /* Never shrink. */
        if (conf->scribble_disks >= new_disks &&
            conf->scribble_sectors >= new_sectors)
                return 0;
-       mddev_suspend(conf->mddev);
+
+       raid5_quiesce(conf->mddev, true);
        cpus_read_lock();
 
        for_each_present_cpu(cpu) {
        }
 
        cpus_read_unlock();
-       mddev_resume(conf->mddev);
+       raid5_quiesce(conf->mddev, false);
+
        if (!err) {
                conf->scribble_disks = new_disks;
                conf->scribble_sectors = new_sectors;
         * the reshape wasn't running - like Discard or Read - have
         * completed.
         */
-       mddev_suspend(mddev);
-       mddev_resume(mddev);
+       raid5_quiesce(mddev, true);
+       raid5_quiesce(mddev, false);
 
        /* Add some new drives, as many as will fit.
         * We know there are enough to make the newly sized array work.