+/* find_missing - helper routine for load_super_imsm_all that identifies
+ * disks that have disappeared from the system. This routine relies on
+ * the mpb being uptodate, which it is at load time.
+ */
+static int find_missing(struct intel_super *super)
+{
+ int i;
+ struct imsm_super *mpb = super->anchor;
+ struct dl *dl;
+ struct imsm_disk *disk;
+ __u32 status;
+
+ for (i = 0; i < mpb->num_disks; i++) {
+ disk = __get_imsm_disk(mpb, i);
+ for (dl = super->disks; dl; dl = dl->next)
+ if (serialcmp(dl->disk.serial, disk->serial) == 0)
+ break;
+ if (dl)
+ continue;
+ /* ok we have a 'disk' without a live entry in
+ * super->disks
+ */
+ status = __le32_to_cpu(disk->status);
+ if (status & FAILED_DISK || !(status & USABLE_DISK))
+ continue; /* never mind, already marked */
+
+ dl = malloc(sizeof(*dl));
+ if (!dl)
+ return 1;
+ dl->major = 0;
+ dl->minor = 0;
+ dl->fd = -1;
+ dl->devname = strdup("missing");
+ dl->index = i;
+ serialcpy(dl->serial, disk->serial);
+ dl->disk = *disk;
+ dl->next = super->missing;
+ super->missing = dl;
+ }
+
+ return 0;
+}
+