Deleted Added
full compact
md_nvidia.c (220209) md_nvidia.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_nvidia.c 220209 2011-03-31 16:14:35Z mav $");
28__FBSDID("$FreeBSD: head/sys/geom/raid/md_nvidia.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>

--- 542 unchanged lines hidden (view full) ---

579 free(arg, M_MD_NVIDIA);
580}
581
582static void
583g_raid_md_nvidia_refill(struct g_raid_softc *sc)
584{
585 struct g_raid_md_object *md;
586 struct g_raid_md_nvidia_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>

--- 542 unchanged lines hidden (view full) ---

579 free(arg, M_MD_NVIDIA);
580}
581
582static void
583g_raid_md_nvidia_refill(struct g_raid_softc *sc)
584{
585 struct g_raid_md_object *md;
586 struct g_raid_md_nvidia_object *mdi;
587 struct nvidia_raid_conf *meta;
588 struct g_raid_disk *disk;
589 struct task *task;
590 int update, na;
591
592 md = sc->sc_md;
593 mdi = (struct g_raid_md_nvidia_object *)md;
587 struct g_raid_disk *disk;
588 struct task *task;
589 int update, na;
590
591 md = sc->sc_md;
592 mdi = (struct g_raid_md_nvidia_object *)md;
594 meta = mdi->mdio_meta;
595 update = 0;
596 do {
597 /* Make sure we miss anything. */
598 na = g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE);
599 if (na == mdi->mdio_total_disks)
600 break;
601
602 G_RAID_DEBUG1(1, md->mdo_softc,

--- 17 unchanged lines hidden (view full) ---

620 update += g_raid_md_nvidia_start_disk(disk);
621 if (disk->d_state == G_RAID_DISK_S_ACTIVE)
622 break;
623 }
624 }
625 } while (disk != NULL);
626
627 /* Write new metadata if we changed something. */
593 update = 0;
594 do {
595 /* Make sure we miss anything. */
596 na = g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE);
597 if (na == mdi->mdio_total_disks)
598 break;
599
600 G_RAID_DEBUG1(1, md->mdo_softc,

--- 17 unchanged lines hidden (view full) ---

618 update += g_raid_md_nvidia_start_disk(disk);
619 if (disk->d_state == G_RAID_DISK_S_ACTIVE)
620 break;
621 }
622 }
623 } while (disk != NULL);
624
625 /* Write new metadata if we changed something. */
628 if (update) {
626 if (update)
629 g_raid_md_write_nvidia(md, NULL, NULL, NULL);
627 g_raid_md_write_nvidia(md, NULL, NULL, NULL);
630 meta = mdi->mdio_meta;
631 }
632
633 /* Update status of our need for spare. */
634 mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) <
635 mdi->mdio_total_disks);
636
637 /* Request retaste hoping to find spare. */
638 if (mdi->mdio_incomplete) {
639 task = malloc(sizeof(struct task),

--- 183 unchanged lines hidden (view full) ---

823 struct g_consumer *rcp;
824 struct g_provider *pp;
825 struct g_raid_md_nvidia_object *mdi, *mdi1;
826 struct g_raid_softc *sc;
827 struct g_raid_disk *disk;
828 struct nvidia_raid_conf *meta;
829 struct g_raid_md_nvidia_perdisk *pd;
830 struct g_geom *geom;
628
629 /* Update status of our need for spare. */
630 mdi->mdio_incomplete = (g_raid_ndisks(sc, G_RAID_DISK_S_ACTIVE) <
631 mdi->mdio_total_disks);
632
633 /* Request retaste hoping to find spare. */
634 if (mdi->mdio_incomplete) {
635 task = malloc(sizeof(struct task),

--- 183 unchanged lines hidden (view full) ---

819 struct g_consumer *rcp;
820 struct g_provider *pp;
821 struct g_raid_md_nvidia_object *mdi, *mdi1;
822 struct g_raid_softc *sc;
823 struct g_raid_disk *disk;
824 struct nvidia_raid_conf *meta;
825 struct g_raid_md_nvidia_perdisk *pd;
826 struct g_geom *geom;
831 int error, disk_pos, result, spare, len;
827 int error, result, spare, len;
832 char name[32];
833 uint16_t vendor;
834
835 G_RAID_DEBUG(1, "Tasting NVIDIA on %s", cp->provider->name);
836 mdi = (struct g_raid_md_nvidia_object *)md;
837 pp = cp->provider;
838
839 /* Read metadata from device. */
840 meta = NULL;
828 char name[32];
829 uint16_t vendor;
830
831 G_RAID_DEBUG(1, "Tasting NVIDIA on %s", cp->provider->name);
832 mdi = (struct g_raid_md_nvidia_object *)md;
833 pp = cp->provider;
834
835 /* Read metadata from device. */
836 meta = NULL;
841 spare = 0;
842 vendor = 0xffff;
837 vendor = 0xffff;
843 disk_pos = 0;
844 if (g_access(cp, 1, 0, 0) != 0)
845 return (G_RAID_MD_TASTE_FAIL);
846 g_topology_unlock();
847 len = 2;
848 if (pp->geom->rank == 1)
849 g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor);
850 meta = nvidia_meta_read(cp);
851 g_topology_lock();

--- 9 unchanged lines hidden (view full) ---

861 G_RAID_DEBUG(1,
862 "NVIDIA vendor mismatch 0x%04x != 0x10de",
863 vendor);
864 }
865 }
866 return (G_RAID_MD_TASTE_FAIL);
867 }
868
838 if (g_access(cp, 1, 0, 0) != 0)
839 return (G_RAID_MD_TASTE_FAIL);
840 g_topology_unlock();
841 len = 2;
842 if (pp->geom->rank == 1)
843 g_io_getattr("GEOM::hba_vendor", cp, &len, &vendor);
844 meta = nvidia_meta_read(cp);
845 g_topology_lock();

--- 9 unchanged lines hidden (view full) ---

855 G_RAID_DEBUG(1,
856 "NVIDIA vendor mismatch 0x%04x != 0x10de",
857 vendor);
858 }
859 }
860 return (G_RAID_MD_TASTE_FAIL);
861 }
862
869 /* Check this disk position in obtained metadata. */
870 disk_pos = meta->disk_number;
871 if (disk_pos == -1) {
872 G_RAID_DEBUG(1, "NVIDIA disk position not found");
873 goto fail1;
874 }
875
876 /* Metadata valid. Print it. */
877 g_raid_md_nvidia_print(meta);
863 /* Metadata valid. Print it. */
864 g_raid_md_nvidia_print(meta);
878 G_RAID_DEBUG(1, "NVIDIA disk position %d", disk_pos);
865 G_RAID_DEBUG(1, "NVIDIA disk position %d", meta->disk_number);
879 spare = 0;//(meta->type == NVIDIA_T_SPARE) ? 1 : 0;
880
881search:
882 /* Search for matching node. */
883 sc = NULL;
884 mdi1 = NULL;
885 LIST_FOREACH(geom, &mp->geom, geom) {
886 sc = geom->softc;

--- 249 unchanged lines hidden (view full) ---

1136 if (size > pp->mediasize)
1137 size = pp->mediasize;
1138 if (sectorsize < pp->sectorsize)
1139 sectorsize = pp->sectorsize;
1140 }
1141 if (error != 0)
1142 return (error);
1143
866 spare = 0;//(meta->type == NVIDIA_T_SPARE) ? 1 : 0;
867
868search:
869 /* Search for matching node. */
870 sc = NULL;
871 mdi1 = NULL;
872 LIST_FOREACH(geom, &mp->geom, geom) {
873 sc = geom->softc;

--- 249 unchanged lines hidden (view full) ---

1123 if (size > pp->mediasize)
1124 size = pp->mediasize;
1125 if (sectorsize < pp->sectorsize)
1126 sectorsize = pp->sectorsize;
1127 }
1128 if (error != 0)
1129 return (error);
1130
1131 if (sectorsize <= 0) {
1132 gctl_error(req, "Can't get sector size.");
1133 return (-8);
1134 }
1135
1144 /* Reserve space for metadata. */
1145 size -= 2 * sectorsize;
1146
1147 /* Handle size argument. */
1148 len = sizeof(*sizearg);
1149 sizearg = gctl_get_param(req, "size", &len);
1150 if (sizearg != NULL && len == sizeof(*sizearg) &&
1151 *sizearg > 0) {

--- 214 unchanged lines hidden (view full) ---

1366 pp = cp->provider;
1367
1368 pd = malloc(sizeof(*pd), M_MD_NVIDIA, M_WAITOK | M_ZERO);
1369 pd->pd_disk_pos = -3;
1370 pd->pd_disk_size = pp->mediasize;
1371
1372 disk = g_raid_create_disk(sc);
1373 disk->d_consumer = cp;
1136 /* Reserve space for metadata. */
1137 size -= 2 * sectorsize;
1138
1139 /* Handle size argument. */
1140 len = sizeof(*sizearg);
1141 sizearg = gctl_get_param(req, "size", &len);
1142 if (sizearg != NULL && len == sizeof(*sizearg) &&
1143 *sizearg > 0) {

--- 214 unchanged lines hidden (view full) ---

1358 pp = cp->provider;
1359
1360 pd = malloc(sizeof(*pd), M_MD_NVIDIA, M_WAITOK | M_ZERO);
1361 pd->pd_disk_pos = -3;
1362 pd->pd_disk_size = pp->mediasize;
1363
1364 disk = g_raid_create_disk(sc);
1365 disk->d_consumer = cp;
1374 disk->d_consumer->private = disk;
1375 disk->d_md_data = (void *)pd;
1376 cp->private = disk;
1377 g_topology_unlock();
1378
1379 /* Read kernel dumping information. */
1380 disk->d_kd.offset = 0;
1381 disk->d_kd.length = OFF_MAX;
1382 len = sizeof(disk->d_kd);

--- 140 unchanged lines hidden (view full) ---

1523 return (0);
1524}
1525
1526static int
1527g_raid_md_fail_disk_nvidia(struct g_raid_md_object *md,
1528 struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk)
1529{
1530 struct g_raid_softc *sc;
1366 disk->d_md_data = (void *)pd;
1367 cp->private = disk;
1368 g_topology_unlock();
1369
1370 /* Read kernel dumping information. */
1371 disk->d_kd.offset = 0;
1372 disk->d_kd.length = OFF_MAX;
1373 len = sizeof(disk->d_kd);

--- 140 unchanged lines hidden (view full) ---

1514 return (0);
1515}
1516
1517static int
1518g_raid_md_fail_disk_nvidia(struct g_raid_md_object *md,
1519 struct g_raid_subdisk *tsd, struct g_raid_disk *tdisk)
1520{
1521 struct g_raid_softc *sc;
1531 struct g_raid_md_nvidia_object *mdi;
1532 struct g_raid_md_nvidia_perdisk *pd;
1533 struct g_raid_subdisk *sd;
1534
1535 sc = md->mdo_softc;
1522 struct g_raid_md_nvidia_perdisk *pd;
1523 struct g_raid_subdisk *sd;
1524
1525 sc = md->mdo_softc;
1536 mdi = (struct g_raid_md_nvidia_object *)md;
1537 pd = (struct g_raid_md_nvidia_perdisk *)tdisk->d_md_data;
1538
1539 /* We can't fail disk that is not a part of array now. */
1540 if (pd->pd_disk_pos < 0)
1541 return (-1);
1542
1543 /* Erase metadata to prevent disks's later resurrection. */
1544 if (tdisk->d_consumer)

--- 61 unchanged lines hidden ---
1526 pd = (struct g_raid_md_nvidia_perdisk *)tdisk->d_md_data;
1527
1528 /* We can't fail disk that is not a part of array now. */
1529 if (pd->pd_disk_pos < 0)
1530 return (-1);
1531
1532 /* Erase metadata to prevent disks's later resurrection. */
1533 if (tdisk->d_consumer)

--- 61 unchanged lines hidden ---