+/* must be called while manager is quiesced */
+static void imsm_delete(struct intel_super *super, struct dl **dlp)
+{
+ struct imsm_super *mpb = super->anchor;
+ struct dl *dl = *dlp;
+ struct dl *iter;
+ struct imsm_dev *dev;
+ struct imsm_map *map;
+ int i, j;
+
+ dprintf("%s: deleting device %x:%x from imsm_super\n",
+ __func__, dl->major, dl->minor);
+
+ /* shift all indexes down one */
+ for (iter = super->disks; iter; iter = iter->next)
+ if (iter->index > dl->index)
+ iter->index--;
+
+ for (i = 0; i < mpb->num_raid_devs; i++) {
+ dev = get_imsm_dev(super, i);
+ map = get_imsm_map(dev, 0);
+
+ for (j = 0; j < map->num_members; j++) {
+ int idx = get_imsm_disk_idx(map, j);
+
+ if (idx > dl->index)
+ map->disk_ord_tbl[j] = __cpu_to_le32(idx - 1);
+ }
+ }
+
+ mpb->num_disks--;
+ super->updates_pending++;
+ *dlp = (*dlp)->next;
+ __free_imsm_disk(dl);
+}
+