remove_hash(sh);
 
+       sh->generation = conf->generation - previous;
        sh->disks = previous ? conf->previous_raid_disks : conf->raid_disks;
        sh->sector = sector;
        stripe_set_idx(sector, conf, previous, sh);
        insert_hash(conf, sh);
 }
 
-static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector, int disks)
+static struct stripe_head *__find_stripe(raid5_conf_t *conf, sector_t sector,
+                                        short generation)
 {
        struct stripe_head *sh;
        struct hlist_node *hn;
        CHECK_DEVLOCK();
        pr_debug("__find_stripe, sector %llu\n", (unsigned long long)sector);
        hlist_for_each_entry(sh, hn, stripe_hash(conf, sector), hash)
-               if (sh->sector == sector && sh->disks == disks)
+               if (sh->sector == sector && sh->generation == generation)
                        return sh;
        pr_debug("__stripe %llu not in cache\n", (unsigned long long)sector);
        return NULL;
                  int previous, int noblock)
 {
        struct stripe_head *sh;
-       int disks = previous ? conf->previous_raid_disks : conf->raid_disks;
 
        pr_debug("get_stripe, sector %llu\n", (unsigned long long)sector);
 
                wait_event_lock_irq(conf->wait_for_stripe,
                                    conf->quiesce == 0,
                                    conf->device_lock, /* nothing */);
-               sh = __find_stripe(conf, sector, disks);
+               sh = __find_stripe(conf, sector, conf->generation - previous);
                if (!sh) {
                        if (!conf->inactive_blocked)
                                sh = get_free_stripe(conf);
                                if ((mddev->delta_disks < 0
                                     ? logical_sector >= conf->reshape_progress
                                     : logical_sector < conf->reshape_progress)
-                                   && disks == conf->previous_raid_disks)
+                                   && previous)
                                        /* mismatch, need to try again */
                                        must_retry = 1;
                                spin_unlock_irq(&conf->device_lock);
        else
                conf->reshape_progress = 0;
        conf->reshape_safe = conf->reshape_progress;
+       conf->generation++;
        spin_unlock_irq(&conf->device_lock);
 
        /* Add some new drives, as many as will fit.
 
        struct hlist_node       hash;
        struct list_head        lru;          /* inactive_list or handle_list */
        struct raid5_private_data *raid_conf;
+       short                   generation;     /* increments with every
+                                                * reshape */
        sector_t                sector;         /* sector of this row */
        short                   pd_idx;         /* parity disk index */
        short                   qd_idx;         /* 'Q' disk index for raid6 */
         */
        sector_t                reshape_safe;
        int                     previous_raid_disks;
+       short                   generation; /* increments with every reshape */
 
        struct list_head        handle_list; /* stripes needing handling */
        struct list_head        hold_list; /* preread ready stripes */