From owner-svn-src-projects@FreeBSD.ORG Mon Mar 14 17:22:35 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 138071065670; Mon, 14 Mar 2011 17:22:35 +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 F3C678FC0C; Mon, 14 Mar 2011 17:22:34 +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 p2EHMYTg001175; Mon, 14 Mar 2011 17:22:34 GMT (envelope-from mav@svn.freebsd.org) Received: (from mav@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2EHMYSV001172; Mon, 14 Mar 2011 17:22:34 GMT (envelope-from mav@svn.freebsd.org) Message-Id: <201103141722.p2EHMYSV001172@svn.freebsd.org> From: Alexander Motin Date: Mon, 14 Mar 2011 17:22:34 +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: r219643 - 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: Mon, 14 Mar 2011 17:22:35 -0000 Author: mav Date: Mon Mar 14 17:22:34 2011 New Revision: 219643 URL: http://svn.freebsd.org/changeset/base/219643 Log: Few more bricks making Promise volumes reading basically working. Extend volume name fields from 16 to 32 characters, supported by Promise. Modified: projects/graid/head/sys/geom/raid/g_raid.h projects/graid/head/sys/geom/raid/md_promise.c Modified: projects/graid/head/sys/geom/raid/g_raid.h ============================================================================== --- projects/graid/head/sys/geom/raid/g_raid.h Mon Mar 14 17:08:30 2011 (r219642) +++ projects/graid/head/sys/geom/raid/g_raid.h Mon Mar 14 17:22:34 2011 (r219643) @@ -193,7 +193,7 @@ struct g_raid_subdisk { }; #define G_RAID_MAX_SUBDISKS 16 -#define G_RAID_MAX_VOLUMENAME 16 +#define G_RAID_MAX_VOLUMENAME 32 #define G_RAID_VOLUME_S_STARTING 0x00 #define G_RAID_VOLUME_S_BROKEN 0x01 Modified: projects/graid/head/sys/geom/raid/md_promise.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 17:08:30 2011 (r219642) +++ projects/graid/head/sys/geom/raid/md_promise.c Mon Mar 14 17:22:34 2011 (r219643) @@ -214,7 +214,7 @@ g_raid_md_promise_print(struct promise_r meta->disks[i].channel, meta->disks[i].device, meta->disks[i].id); } - printf("name <%.24s>\n", meta->name); + printf("name <%.32s>\n", meta->name); printf("=================================================\n"); } @@ -228,7 +228,6 @@ promise_meta_copy(struct promise_raid_co return (nmeta); } -#if 0 static int promise_meta_find_disk(struct promise_raid_conf *meta, uint64_t id) { @@ -240,6 +239,29 @@ promise_meta_find_disk(struct promise_ra } return (-1); } + +static void +promise_meta_get_name(struct promise_raid_conf *meta, char *buf) +{ + int i; + + strncpy(buf, meta->name, 32); + buf[32] = 0; + for (i = 31; i >= 0; i--) { + if (buf[i] > 0x20) + break; + buf[i] = 0; + } +} + +#if 0 +static void +promise_meta_put_name(struct promise_raid_conf *meta, char *buf) +{ + + memset(meta->name, 0x20, 32); + memcpy(meta->name, buf, MIN(strlen(buf), 32)); +} #endif static int @@ -381,20 +403,6 @@ promise_meta_write_spare(struct g_consum free(meta, M_MD_PROMISE); return (error); } - -static struct g_raid_disk * -g_raid_md_promise_get_disk(struct g_raid_softc *sc, int id) -{ - struct g_raid_disk *disk; - struct g_raid_md_promise_perdisk *pd; - - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; - if (pd->pd_disk_pos == id) - break; - } - return (disk); -} #endif static struct g_raid_volume * @@ -451,41 +459,46 @@ g_raid_md_promise_supported(int level, i static int g_raid_md_promise_start_disk(struct g_raid_disk *disk, int sdn) { -#if 0 struct g_raid_softc *sc; - struct g_raid_subdisk *sd, *tmpsd; - struct g_raid_disk *olddisk, *tmpdisk; + struct g_raid_volume *vol; + struct g_raid_subdisk *sd; + struct g_raid_disk *olddisk; struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; struct g_raid_md_promise_perdisk *pd, *oldpd; + struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; - struct promise_raid_vol *mvol; - struct promise_raid_map *mmap0, *mmap1; int disk_pos, resurrection = 0; sc = disk->d_softc; md = sc->sc_md; mdi = (struct g_raid_md_promise_object *)md; - meta = mdi->mdio_meta; pd = (struct g_raid_md_promise_perdisk *)disk->d_md_data; olddisk = NULL; + vol = g_raid_md_promise_get_volume(sc, pd->pd_meta[sdn]->volume_id); + KASSERT(vol != NULL, ("No Promise volume with ID %16jx", + pd->pd_meta[sdn]->volume_id)); + pv = vol->v_md_data; + meta = pv->pv_meta; + /* Find disk position in metadata by it's serial. */ - disk_pos = promise_meta_find_disk(meta, pd->pd_disk_meta.id); + disk_pos = promise_meta_find_disk(meta, pd->pd_meta[sdn]->disk.id); if (disk_pos < 0) { G_RAID_DEBUG1(1, sc, "Unknown, probably new or stale disk"); /* Failed stale disk is useless for us. */ - if (pd->pd_disk_meta.flags & PROMISE_F_FAILED) { - g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE_FAILED); - return (0); - } +// if (pd->pd_disk_meta.flags & PROMISE_F_FAILED) { +// g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE_FAILED); +// return (0); +// } /* If we are in the start process, that's all for now. */ - if (!mdi->mdio_started) + if (!pv->pv_started) goto nofit; /* * If we have already started - try to get use of the disk. * Try to replace OFFLINE disks first, then FAILED. */ +#if 0 TAILQ_FOREACH(tmpdisk, &sc->sc_disks, d_next) { if (tmpdisk->d_state != G_RAID_DISK_S_OFFLINE && tmpdisk->d_state != G_RAID_DISK_S_FAILED) @@ -511,29 +524,32 @@ g_raid_md_promise_start_disk(struct g_ra } else if (olddisk == NULL) olddisk = tmpdisk; } +#endif if (olddisk == NULL) { nofit: +#if 0 if (pd->pd_disk_meta.flags & PROMISE_F_SPARE) { g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); return (1); } else { +#endif g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE); return (0); - } +// } } oldpd = (struct g_raid_md_promise_perdisk *)olddisk->d_md_data; - disk_pos = oldpd->pd_disk_pos; +// disk_pos = oldpd->pd_disk_pos; resurrection = 1; } + sd = &vol->v_subdisks[disk_pos]; + if (olddisk == NULL) { - /* Find placeholder by position. */ - olddisk = g_raid_md_promise_get_disk(sc, disk_pos); - if (olddisk == NULL) - panic("No disk at position %d!", disk_pos); - if (olddisk->d_state != G_RAID_DISK_S_OFFLINE) { + /* Look for disk at position. */ + olddisk = sd->sd_disk; + if (olddisk != NULL) { G_RAID_DEBUG1(1, sc, "More then one disk for pos %d", disk_pos); g_raid_change_disk_state(disk, G_RAID_DISK_S_STALE); @@ -542,6 +558,7 @@ nofit: oldpd = (struct g_raid_md_promise_perdisk *)olddisk->d_md_data; } +#if 0 /* Replace failed disk or placeholder with new disk. */ TAILQ_FOREACH_SAFE(sd, &olddisk->d_subdisks, sd_next, tmpsd) { TAILQ_REMOVE(&olddisk->d_subdisks, sd, sd_next); @@ -552,25 +569,33 @@ nofit: pd->pd_disk_pos = disk_pos; /* If it was placeholder -- destroy it. */ - if (olddisk->d_state == G_RAID_DISK_S_OFFLINE) { - g_raid_destroy_disk(olddisk); - } else { + if (olddisk != NULL) { /* Otherwise, make it STALE_FAILED. */ g_raid_change_disk_state(olddisk, G_RAID_DISK_S_STALE_FAILED); /* Update global metadata just in case. */ memcpy(&meta->disk[disk_pos], &pd->pd_disk_meta, sizeof(struct promise_raid_disk)); } +#endif + + vol->v_subdisks[disk_pos].sd_disk = disk; + TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next); /* Welcome the new disk. */ if (resurrection) g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); - else if (meta->disk[disk_pos].flags & PROMISE_F_FAILED) +/* else if (meta->disk[disk_pos].flags & PROMISE_F_FAILED) g_raid_change_disk_state(disk, G_RAID_DISK_S_FAILED); else if (meta->disk[disk_pos].flags & PROMISE_F_SPARE) g_raid_change_disk_state(disk, G_RAID_DISK_S_SPARE); - else +*/ else g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE); + /* Up to date disk. */ + g_raid_change_subdisk_state(sd, + G_RAID_SUBDISK_S_ACTIVE); + g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW, + G_RAID_EVENT_SUBDISK); +#if 0 TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) { mvol = promise_get_volume(meta, (uintptr_t)(sd->sd_volume->v_md_data)); @@ -671,10 +696,9 @@ nofit: (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < meta->total_disks); } +#endif return (resurrection); -#endif - return (0); } #if 0 @@ -758,19 +782,13 @@ static void g_raid_md_promise_start(struct g_raid_volume *vol) { struct g_raid_softc *sc; + struct g_raid_disk *disk; struct g_raid_md_object *md; struct g_raid_md_promise_object *mdi; + struct g_raid_md_promise_perdisk *pd; struct g_raid_md_promise_pervolume *pv; struct promise_raid_conf *meta; -#if 0 - struct g_raid_md_promise_perdisk *pd; - struct promise_raid_vol *mvol; - struct promise_raid_map *mmap; - struct g_raid_volume *vol; - struct g_raid_subdisk *sd; - struct g_raid_disk *disk; - int i, j, disk_pos; -#endif + int i; sc = vol->v_softc; md = sc->sc_md; @@ -802,17 +820,14 @@ g_raid_md_promise_start(struct g_raid_vo vol->v_sectorsize = 512; //ZZZ g_raid_start_volume(vol); -#if 0 /* Make all disks found till the moment take their places. */ - do { - TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { - if (disk->d_state == G_RAID_DISK_S_NONE) { - g_raid_md_promise_start_disk(disk); - break; - } + TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { + pd = disk->d_md_data; + for (i = 0; i < pd->pd_subdisks; i++) { + if (pd->pd_meta[i]->volume_id == meta->volume_id) + g_raid_md_promise_start_disk(disk, i); } - } while (disk != NULL); -#endif + } pv->pv_started = 1; G_RAID_DEBUG1(0, sc, "Volume started."); @@ -859,6 +874,7 @@ g_raid_md_promise_new_disk(struct g_raid struct g_raid_md_promise_pervolume *pv; struct g_raid_volume *vol; int i; + char buf[33]; sc = disk->d_softc; md = sc->sc_md; @@ -872,7 +888,8 @@ g_raid_md_promise_new_disk(struct g_raid vol = g_raid_md_promise_get_volume(sc, pdmeta->volume_id); if (vol == NULL) { - vol = g_raid_create_volume(sc, pdmeta->name); + promise_meta_get_name(pdmeta, buf); + vol = g_raid_create_volume(sc, buf); pv = malloc(sizeof(*pv), M_MD_PROMISE, M_WAITOK | M_ZERO); pv->pv_id = pdmeta->volume_id; vol->v_md_data = pv;