mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-03 12:35:02 +00:00
Windows handles INIT and VERIFY as array-wide and it doesn't specify which
disks should be rebuilt. Our rebuild code is same time disk-centric. To handle this situation properly check all disks for RBLD flags, and if no disk specified try rebuild/resync all of them except newly inserted.
This commit is contained in:
parent
ca57f64f7d
commit
865aea63c3
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=245341
@ -774,7 +774,7 @@ g_raid_md_intel_start_disk(struct g_raid_disk *disk)
|
|||||||
struct intel_raid_conf *meta;
|
struct intel_raid_conf *meta;
|
||||||
struct intel_raid_vol *mvol;
|
struct intel_raid_vol *mvol;
|
||||||
struct intel_raid_map *mmap0, *mmap1;
|
struct intel_raid_map *mmap0, *mmap1;
|
||||||
int disk_pos, resurrection = 0;
|
int disk_pos, resurrection = 0, migr_global, i;
|
||||||
|
|
||||||
sc = disk->d_softc;
|
sc = disk->d_softc;
|
||||||
md = sc->sc_md;
|
md = sc->sc_md;
|
||||||
@ -903,6 +903,13 @@ g_raid_md_intel_start_disk(struct g_raid_disk *disk)
|
|||||||
else
|
else
|
||||||
mmap1 = mmap0;
|
mmap1 = mmap0;
|
||||||
|
|
||||||
|
migr_global = 1;
|
||||||
|
for (i = 0; i < mmap0->total_disks; i++) {
|
||||||
|
if ((mmap0->disk_idx[i] & INTEL_DI_RBLD) == 0 &&
|
||||||
|
(mmap1->disk_idx[i] & INTEL_DI_RBLD) != 0)
|
||||||
|
migr_global = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (resurrection) {
|
if (resurrection) {
|
||||||
/* Stale disk, almost same as new. */
|
/* Stale disk, almost same as new. */
|
||||||
g_raid_change_subdisk_state(sd,
|
g_raid_change_subdisk_state(sd,
|
||||||
@ -953,6 +960,11 @@ g_raid_md_intel_start_disk(struct g_raid_disk *disk)
|
|||||||
sd->sd_volume->v_strip_size *
|
sd->sd_volume->v_strip_size *
|
||||||
mmap0->total_domains;
|
mmap0->total_domains;
|
||||||
}
|
}
|
||||||
|
} else if (mvol->migr_type == INTEL_MT_INIT &&
|
||||||
|
migr_global) {
|
||||||
|
/* Freshly created uninitialized volume. */
|
||||||
|
g_raid_change_subdisk_state(sd,
|
||||||
|
G_RAID_SUBDISK_S_UNINITIALIZED);
|
||||||
} else if (mvol->dirty && (!pv->pv_cng ||
|
} else if (mvol->dirty && (!pv->pv_cng ||
|
||||||
pv->pv_cng_master_disk != disk_pos)) {
|
pv->pv_cng_master_disk != disk_pos)) {
|
||||||
/* Dirty volume (unclean shutdown). */
|
/* Dirty volume (unclean shutdown). */
|
||||||
@ -969,7 +981,8 @@ g_raid_md_intel_start_disk(struct g_raid_disk *disk)
|
|||||||
/* Freshly inserted disk. */
|
/* Freshly inserted disk. */
|
||||||
g_raid_change_subdisk_state(sd,
|
g_raid_change_subdisk_state(sd,
|
||||||
G_RAID_SUBDISK_S_NEW);
|
G_RAID_SUBDISK_S_NEW);
|
||||||
} else if (mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) {
|
} else if ((mmap1->disk_idx[sd->sd_pos] & INTEL_DI_RBLD) ||
|
||||||
|
migr_global) {
|
||||||
/* Resyncing disk. */
|
/* Resyncing disk. */
|
||||||
g_raid_change_subdisk_state(sd,
|
g_raid_change_subdisk_state(sd,
|
||||||
G_RAID_SUBDISK_S_RESYNC);
|
G_RAID_SUBDISK_S_RESYNC);
|
||||||
|
Loading…
Reference in New Issue
Block a user