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 --- |