Deleted Added
full compact
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 ---