From owner-svn-src-projects@FreeBSD.ORG Wed Mar 23 19:30:47 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9EFE81065676; Wed, 23 Mar 2011 19:30:47 +0000 (UTC) (envelope-from mav@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 742B68FC0A; Wed, 23 Mar 2011 19:30:47 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2NJUlKD004867; Wed, 23 Mar 2011 19:30:47 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2NJUlJ4004865; Wed, 23 Mar 2011 19:30:47 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103231930.p2NJUlJ4004865@svn.freebsd.org> From: Alexander Motin Date: Wed, 23 Mar 2011 19:30:47 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219929 - projects/graid/head/sys/geom/raid X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Mar 2011 19:30:47 -0000 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++;