/* Fill in disk info */
- adi = &aai->aai_disks[curdrive];
+ diskidx = aai->aai_curdisk++;
+ adi = &aai->aai_disks[diskidx];
adi->adi_status = 0;
- if (info->disk[curdrive].flags & INTEL_F_ONLINE)
+ if (info->disk[diskidx].flags & INTEL_F_ONLINE)
adi->adi_status |= ADI_S_ONLINE;
- if (info->disk[curdrive].flags & INTEL_F_ASSIGNED)
+ if (info->disk[diskidx].flags & INTEL_F_ASSIGNED)
adi->adi_status |= ADI_S_ASSIGNED;
- if (info->disk[curdrive].flags & INTEL_F_SPARE) {
+ if (info->disk[diskidx].flags & INTEL_F_SPARE) {
adi->adi_status &= ~ADI_S_ONLINE;
adi->adi_status |= ADI_S_SPARE;
}
- if (info->disk[curdrive].flags & INTEL_F_DOWN)
+ if (info->disk[diskidx].flags & INTEL_F_DOWN)
adi->adi_status &= ~ADI_S_ONLINE;
if (adi->adi_status) {
adi->adi_dev = sc->sc_dev;
- adi->adi_sectors = info->disk[curdrive].sectors;
+ adi->adi_sectors = info->disk[diskidx].sectors;
adi->adi_compsize = adi->adi_sectors - aai->aai_reserved;
+
/*
* Check if that is the only volume, otherwise repeat
* the process to find more.
@@ -281,10 +294,57 @@
&map->disk_idx[map->total_disks];
goto findvol;
}
- curdrive++;
}
out:
free(info, M_DEVBUF);
return error;
}
+
+
+/*
+ * Assign `volume id' to RAID volumes.
+ */
+static struct {
+ /* We assume disks are on the same array if these three values
+ are same. */
+ uint32_t config_id;
+ uint32_t generation;
+ uint32_t checksum;
+
+ int id;
+} array_note[10]; /* XXX: this array is not used after ld_ataraid is
+ * configured. */
+
+static int n_array = 0;
+static int volume_id = 0;
+
+static int
+find_volume_id(struct intel_raid_conf *info)
+{
+ int i, ret;
+
+ for (i=0; i < n_array; ++i) {
+ if (info->checksum == array_note[i].checksum &&
+ info->config_id == array_note[i].config_id &&
+ info->generation == array_note[i].generation) {
+ /* we have already seen this array */
+ return array_note[i].id;
+ }
+ }
+
+ if (n_array >= __arraycount(array_note)) {
+ /* Too many arrays */
+ return -1;
+ }
+
+ array_note[n_array].checksum = info->checksum;
+ array_note[n_array].config_id = info->config_id;
+ array_note[n_array].generation = info->generation;
+ array_note[n_array].id = ret = volume_id;
+
+ /* Allocate volume ids for all volumes in this array */
+ volume_id += info->total_volumes;
+ ++n_array;
+ return ret;
+}
diff -r d8ec6a195b58 src/sys/dev/ata/ata_raidvar.h
--- a/src/sys/dev/ata/ata_raidvar.h Tue Jun 01 00:42:40 2010 +0900
+++ b/src/sys/dev/ata/ata_raidvar.h Wed Jun 02 23:02:46 2010 +0900
@@ -67,8 +67,8 @@
struct ataraid_disk_info {
device_t adi_dev; /* disk's device */
int adi_status; /* disk's status */
- u_int adi_sectors;
- u_int adi_compsize; /* in sectors */
+ uint64_t adi_sectors;
+ uint64_t adi_compsize; /* in sectors */
};