svn commit: r219929 - projects/graid/head/sys/geom/raid
Alexander Motin
mav at FreeBSD.org
Wed Mar 23 19:30:47 UTC 2011
Author: mav
Date: Wed Mar 23 19:30:47 2011
New Revision: 219929
URL: http://svn.freebsd.org/changeset/base/219929
Log:
- Fix rebuild_lba field usage -- it should be per-volume.
- Add safety belt against touching volumes in RAID level migration.
Modified:
projects/graid/head/sys/geom/raid/md_nvidia.c
Modified: projects/graid/head/sys/geom/raid/md_nvidia.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_nvidia.c Wed Mar 23 19:12:48 2011 (r219928)
+++ projects/graid/head/sys/geom/raid/md_nvidia.c Wed Mar 23 19:30:47 2011 (r219929)
@@ -265,20 +265,13 @@ nvidia_meta_read(struct g_consumer *cp)
return (NULL);
}
if (meta->config_size > 128 ||
- meta->config_size < 10) {
+ meta->config_size < 30) {
G_RAID_DEBUG(1, "NVIDIA metadata size looks wrong: %d",
meta->config_size);
free(meta, M_MD_NVIDIA);
return (NULL);
}
- /* Check metadata major version. */
-/* if (meta->version_major != 2) {
- G_RAID_DEBUG(1, "NVIDIA version check failed on %s (%d.%d)",
- pp->name, meta->version_major, meta->version_minor);
- free(meta, M_MD_NVIDIA);
- return (NULL);
- }
-*/
+
/* Check metadata checksum. */
for (checksum = 0, ptr = (uint32_t *)meta,
i = 0; i < meta->config_size; i++)
@@ -289,6 +282,15 @@ nvidia_meta_read(struct g_consumer *cp)
return (NULL);
}
+ /* Check volume state. */
+ if (meta->state != NVIDIA_S_IDLE && meta->state != NVIDIA_S_INIT &&
+ meta->state != NVIDIA_S_REBUILD && meta->state != NVIDIA_S_SYNC) {
+ G_RAID_DEBUG(1, "NVIDIA unknown state on %s (0x%02x)",
+ pp->name, meta->state);
+ free(meta, M_MD_NVIDIA);
+ return (NULL);
+ }
+
/* Check raid type. */
if (meta->type != NVIDIA_T_RAID0 && meta->type != NVIDIA_T_RAID1 &&
meta->type != NVIDIA_T_RAID3 && meta->type != NVIDIA_T_RAID5 &&
@@ -541,14 +543,14 @@ nofit:
/* Rebuilding disk. */
g_raid_change_subdisk_state(sd,
G_RAID_SUBDISK_S_REBUILD);
- sd->sd_rebuild_pos = pd->pd_meta->rebuild_lba *
- pd->pd_meta->sector_size;
+ sd->sd_rebuild_pos = (off_t)pd->pd_meta->rebuild_lba /
+ meta->array_width * pd->pd_meta->sector_size;
} else if (meta->state == NVIDIA_S_SYNC) {
/* Resyncing/dirty disk. */
g_raid_change_subdisk_state(sd,
G_RAID_SUBDISK_S_RESYNC);
- sd->sd_rebuild_pos = pd->pd_meta->rebuild_lba *
- pd->pd_meta->sector_size;
+ sd->sd_rebuild_pos = (off_t)pd->pd_meta->rebuild_lba /
+ meta->array_width * pd->pd_meta->sector_size;
} else {
/* Up to date disk. */
g_raid_change_subdisk_state(sd,
@@ -1510,7 +1512,8 @@ g_raid_md_write_nvidia(struct g_raid_md_
if (sd->sd_state != G_RAID_SUBDISK_S_ACTIVE) {
pd->pd_meta->disk_status = 0x100;
pd->pd_meta->rebuild_lba =
- sd->sd_rebuild_pos / vol->v_sectorsize;
+ sd->sd_rebuild_pos / vol->v_sectorsize *
+ meta->array_width;
}
} else
pd->pd_meta->disk_number = meta->total_disks + spares++;
More information about the svn-src-projects
mailing list