for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) {
                DEFINE_WAIT(w);
                int previous;
+               int seq;
 
        retry:
+               seq = read_seqcount_begin(&conf->gen_lock);
                previous = 0;
                prepare_to_wait(&conf->wait_for_overlap, &w, TASK_UNINTERRUPTIBLE);
                if (unlikely(conf->reshape_progress != MaxSector)) {
                                                  previous,
                                                  &dd_idx, NULL);
                pr_debug("raid456: make_request, sector %llu logical %llu\n",
-                       (unsigned long long)new_sector, 
+                       (unsigned long long)new_sector,
                        (unsigned long long)logical_sector);
 
                sh = get_active_stripe(conf, new_sector, previous,
                                        goto retry;
                                }
                        }
+                       if (read_seqcount_retry(&conf->gen_lock, seq)) {
+                               /* Might have got the wrong stripe_head
+                                * by accident
+                                */
+                               release_stripe(sh);
+                               goto retry;
+                       }
 
                        if (rw == WRITE &&
                            logical_sector >= mddev->suspend_lo &&
        if (alloc_thread_groups(conf, 0))
                goto abort;
        spin_lock_init(&conf->device_lock);
+       seqcount_init(&conf->gen_lock);
        init_waitqueue_head(&conf->wait_for_stripe);
        init_waitqueue_head(&conf->wait_for_overlap);
        INIT_LIST_HEAD(&conf->handle_list);
 
        atomic_set(&conf->reshape_stripes, 0);
        spin_lock_irq(&conf->device_lock);
+       write_seqcount_begin(&conf->gen_lock);
        conf->previous_raid_disks = conf->raid_disks;
        conf->raid_disks += mddev->delta_disks;
        conf->prev_chunk_sectors = conf->chunk_sectors;
        else
                conf->reshape_progress = 0;
        conf->reshape_safe = conf->reshape_progress;
+       write_seqcount_end(&conf->gen_lock);
        spin_unlock_irq(&conf->device_lock);
 
        /* Add some new drives, as many as will fit.