md_sii.c (220209) | md_sii.c (220210) |
---|---|
1/*- 2 * Copyright (c) 2011 Alexander Motin <mav@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2011 Alexander Motin <mav@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/geom/raid/md_sii.c 220209 2011-03-31 16:14:35Z mav $"); | 28__FBSDID("$FreeBSD: head/sys/geom/raid/md_sii.c 220210 2011-03-31 16:19:53Z mav $"); |
29 30#include <sys/param.h> 31#include <sys/bio.h> 32#include <sys/endian.h> 33#include <sys/kernel.h> 34#include <sys/kobj.h> 35#include <sys/limits.h> 36#include <sys/lock.h> --- 599 unchanged lines hidden (view full) --- 636 free(arg, M_MD_SII); 637} 638 639static void 640g_raid_md_sii_refill(struct g_raid_softc *sc) 641{ 642 struct g_raid_md_object *md; 643 struct g_raid_md_sii_object *mdi; | 29 30#include <sys/param.h> 31#include <sys/bio.h> 32#include <sys/endian.h> 33#include <sys/kernel.h> 34#include <sys/kobj.h> 35#include <sys/limits.h> 36#include <sys/lock.h> --- 599 unchanged lines hidden (view full) --- 636 free(arg, M_MD_SII); 637} 638 639static void 640g_raid_md_sii_refill(struct g_raid_softc *sc) 641{ 642 struct g_raid_md_object *md; 643 struct g_raid_md_sii_object *mdi; |
644 struct sii_raid_conf *meta; | |
645 struct g_raid_disk *disk; 646 struct task *task; 647 int update, na; 648 649 md = sc->sc_md; 650 mdi = (struct g_raid_md_sii_object *)md; | 644 struct g_raid_disk *disk; 645 struct task *task; 646 int update, na; 647 648 md = sc->sc_md; 649 mdi = (struct g_raid_md_sii_object *)md; |
651 meta = mdi->mdio_meta; | |
652 update = 0; 653 do { 654 /* Make sure we miss anything. */ 655 na = g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE); 656 if (na == mdi->mdio_total_disks) 657 break; 658 659 G_RAID_DEBUG1(1, md->mdo_softc, --- 17 unchanged lines hidden (view full) --- 677 update += g_raid_md_sii_start_disk(disk); 678 if (disk->d_state == G_RAID_DISK_S_ACTIVE) 679 break; 680 } 681 } 682 } while (disk != NULL); 683 684 /* Write new metadata if we changed something. */ | 650 update = 0; 651 do { 652 /* Make sure we miss anything. */ 653 na = g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE); 654 if (na == mdi->mdio_total_disks) 655 break; 656 657 G_RAID_DEBUG1(1, md->mdo_softc, --- 17 unchanged lines hidden (view full) --- 675 update += g_raid_md_sii_start_disk(disk); 676 if (disk->d_state == G_RAID_DISK_S_ACTIVE) 677 break; 678 } 679 } 680 } while (disk != NULL); 681 682 /* Write new metadata if we changed something. */ |
685 if (update) { | 683 if (update) |
686 g_raid_md_write_sii(md, NULL, NULL, NULL); | 684 g_raid_md_write_sii(md, NULL, NULL, NULL); |
687 meta = mdi->mdio_meta; 688 } | |
689 690 /* Update status of our need for spare. */ 691 mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < 692 mdi->mdio_total_disks); 693 694 /* Request retaste hoping to find spare. */ 695 if (mdi->mdio_incomplete) { 696 task = malloc(sizeof(struct task), --- 219 unchanged lines hidden (view full) --- 916 uint16_t vendor; 917 918 G_RAID_DEBUG(1, "Tasting SiI on %s", cp->provider->name); 919 mdi = (struct g_raid_md_sii_object *)md; 920 pp = cp->provider; 921 922 /* Read metadata from device. */ 923 meta = NULL; | 685 686 /* Update status of our need for spare. */ 687 mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) < 688 mdi->mdio_total_disks); 689 690 /* Request retaste hoping to find spare. */ 691 if (mdi->mdio_incomplete) { 692 task = malloc(sizeof(struct task), --- 219 unchanged lines hidden (view full) --- 912 uint16_t vendor; 913 914 G_RAID_DEBUG(1, "Tasting SiI on %s", cp->provider->name); 915 mdi = (struct g_raid_md_sii_object *)md; 916 pp = cp->provider; 917 918 /* Read metadata from device. */ 919 meta = NULL; |
924 spare = 0; | |
925 vendor = 0xffff; | 920 vendor = 0xffff; |
926 disk_pos = 0; | |
927 if (g_access(cp, 1, 0, 0) != 0) 928 return (G_RAID_MD_TASTE_FAIL); 929 g_topology_unlock(); 930 len = 2; 931 if (pp->geom->rank == 1) 932 g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); 933 meta = sii_meta_read(cp); 934 g_topology_lock(); --- 279 unchanged lines hidden (view full) --- 1214 if (size > pp->mediasize) 1215 size = pp->mediasize; 1216 if (sectorsize < pp->sectorsize) 1217 sectorsize = pp->sectorsize; 1218 } 1219 if (error != 0) 1220 return (error); 1221 | 921 if (g_access(cp, 1, 0, 0) != 0) 922 return (G_RAID_MD_TASTE_FAIL); 923 g_topology_unlock(); 924 len = 2; 925 if (pp->geom->rank == 1) 926 g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor); 927 meta = sii_meta_read(cp); 928 g_topology_lock(); --- 279 unchanged lines hidden (view full) --- 1208 if (size > pp->mediasize) 1209 size = pp->mediasize; 1210 if (sectorsize < pp->sectorsize) 1211 sectorsize = pp->sectorsize; 1212 } 1213 if (error != 0) 1214 return (error); 1215 |
1216 if (sectorsize <= 0) { 1217 gctl_error(req, "Can't get sector size."); 1218 return (-8); 1219 } 1220 |
|
1222 /* Reserve space for metadata. */ 1223 size -= 0x800 * sectorsize; 1224 1225 /* Handle size argument. */ 1226 len = sizeof(*sizearg); 1227 sizearg = gctl_get_param(req, "size", &len); 1228 if (sizearg != NULL && len == sizeof(*sizearg) && 1229 *sizearg > 0) { --- 214 unchanged lines hidden (view full) --- 1444 pp = cp->provider; 1445 1446 pd = malloc(sizeof(*pd), M_MD_SII, M_WAITOK | M_ZERO); 1447 pd->pd_disk_pos = -3; 1448 pd->pd_disk_size = pp->mediasize; 1449 1450 disk = g_raid_create_disk(sc); 1451 disk->d_consumer = cp; | 1221 /* Reserve space for metadata. */ 1222 size -= 0x800 * sectorsize; 1223 1224 /* Handle size argument. */ 1225 len = sizeof(*sizearg); 1226 sizearg = gctl_get_param(req, "size", &len); 1227 if (sizearg != NULL && len == sizeof(*sizearg) && 1228 *sizearg > 0) { --- 214 unchanged lines hidden (view full) --- 1443 pp = cp->provider; 1444 1445 pd = malloc(sizeof(*pd), M_MD_SII, M_WAITOK | M_ZERO); 1446 pd->pd_disk_pos = -3; 1447 pd->pd_disk_size = pp->mediasize; 1448 1449 disk = g_raid_create_disk(sc); 1450 disk->d_consumer = cp; |
1452 disk->d_consumer->private = disk; | |
1453 disk->d_md_data = (void *)pd; 1454 cp->private = disk; 1455 g_topology_unlock(); 1456 1457 /* Read kernel dumping information. */ 1458 disk->d_kd.offset = 0; 1459 disk->d_kd.length = OFF_MAX; 1460 len = sizeof(disk->d_kd); --- 93 unchanged lines hidden (view full) --- 1554 } 1555 meta->raid_location = mdi->mdio_location; 1556 sii_meta_put_name(meta, vol->v_name); 1557 1558 /* We are done. Print meta data and store them to disks. */ 1559 if (mdi->mdio_meta != NULL) 1560 free(mdi->mdio_meta, M_MD_SII); 1561 mdi->mdio_meta = meta; | 1451 disk->d_md_data = (void *)pd; 1452 cp->private = disk; 1453 g_topology_unlock(); 1454 1455 /* Read kernel dumping information. */ 1456 disk->d_kd.offset = 0; 1457 disk->d_kd.length = OFF_MAX; 1458 len = sizeof(disk->d_kd); --- 93 unchanged lines hidden (view full) --- 1552 } 1553 meta->raid_location = mdi->mdio_location; 1554 sii_meta_put_name(meta, vol->v_name); 1555 1556 /* We are done. Print meta data and store them to disks. */ 1557 if (mdi->mdio_meta != NULL) 1558 free(mdi->mdio_meta, M_MD_SII); 1559 mdi->mdio_meta = meta; |
1562 i = 0; | |
1563 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { 1564 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; 1565 if (disk->d_state != G_RAID_DISK_S_ACTIVE) 1566 continue; 1567 if (pd->pd_meta != NULL) { 1568 free(pd->pd_meta, M_MD_SII); 1569 pd->pd_meta = NULL; 1570 } --- 29 unchanged lines hidden (view full) --- 1600 return (0); 1601} 1602 1603static int 1604g_raid_md_fail_disk_sii(struct g_raid_md_object *md, 1605 struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) 1606{ 1607 struct g_raid_softc *sc; | 1560 TAILQ_FOREACH(disk, &sc->sc_disks, d_next) { 1561 pd = (struct g_raid_md_sii_perdisk *)disk->d_md_data; 1562 if (disk->d_state != G_RAID_DISK_S_ACTIVE) 1563 continue; 1564 if (pd->pd_meta != NULL) { 1565 free(pd->pd_meta, M_MD_SII); 1566 pd->pd_meta = NULL; 1567 } --- 29 unchanged lines hidden (view full) --- 1597 return (0); 1598} 1599 1600static int 1601g_raid_md_fail_disk_sii(struct g_raid_md_object *md, 1602 struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk) 1603{ 1604 struct g_raid_softc *sc; |
1608 struct g_raid_md_sii_object *mdi; | |
1609 struct g_raid_md_sii_perdisk *pd; 1610 struct g_raid_subdisk *sd; 1611 1612 sc = md->mdo_softc; | 1605 struct g_raid_md_sii_perdisk *pd; 1606 struct g_raid_subdisk *sd; 1607 1608 sc = md->mdo_softc; |
1613 mdi = (struct g_raid_md_sii_object *)md; | |
1614 pd = (struct g_raid_md_sii_perdisk *)tdisk->d_md_data; 1615 1616 /* We can't fail disk that is not a part of array now. */ 1617 if (pd->pd_disk_pos < 0) 1618 return (-1); 1619 1620 /* 1621 * Mark disk as failed in metadata and try to write that metadata --- 69 unchanged lines hidden --- | 1609 pd = (struct g_raid_md_sii_perdisk *)tdisk->d_md_data; 1610 1611 /* We can't fail disk that is not a part of array now. */ 1612 if (pd->pd_disk_pos < 0) 1613 return (-1); 1614 1615 /* 1616 * Mark disk as failed in metadata and try to write that metadata --- 69 unchanged lines hidden --- |