diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2018-02-14 12:41:01 +0000 |
---|---|---|
committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2018-02-14 12:41:01 +0000 |
commit | b765746f152284954a1f5d8b38a5db126d45645a (patch) | |
tree | 7b8e0dd6aeeb6310cd24a8e0464ac79fd33c38fa | |
parent | 016c6e4a03266bfa546041c49c47c62000cded99 (diff) | |
parent | 750a7e45cc1795462d627c610964b7ceb020a0b0 (diff) | |
download | illumos-joyent-release-20180215.tar.gz |
[illumos-gate merge]release-20180215
commit 750a7e45cc1795462d627c610964b7ceb020a0b0
9078 Update hwdata - 20180208
commit d6e1c446d7897003fd9fd36ef5aa7da350b7f6af
8857 zio_remove_child() panic due to already destroyed parent zio
commit d9a54dd1ef75248420c035ec1d240674f8d1f4fb
9074 domount() interprets ZFS filesystem names as relative paths
commit 213fcdcbdccbdeb7d33fbae7ba8d2639a6f8fd01
9077 zloop misses core files because they're no longer written into cwd
commit 544132fce3fa6583f01318f9559adc46614343a7
8940 Sending an intra-pool resumable send stream may result in EXDEV
commit bdfded42e66b9fc1395ff2401aa2952f7c44ae34
9080 recursive enter of vdev_indirect_rwlock from vdev_indirect_remap()
commit 667ec66f1b4f491d5e839644e0912cad1c9e7122
9079 race condition in starting and ending condesing thread for indirect vdevs
commit 6f7938128a2c5e23f4b970ea101137eadd1470a1
9075 Improve ZFS pool import/load process and corrupted pool recovery
commit 6bb6b5762ca4b17cd5fb3c6c123f17489d5635aa
9100 remove sunman rules from the gate
Conflicts:
usr/src/cmd/smbios/smbios.c
63 files changed, 5171 insertions, 1018 deletions
diff --git a/usr/src/cmd/Makefile.cmd b/usr/src/cmd/Makefile.cmd index e00665a839..14102c6008 100644 --- a/usr/src/cmd/Makefile.cmd +++ b/usr/src/cmd/Makefile.cmd @@ -96,10 +96,6 @@ ROOTCMDDIR64= $(ROOTCMDDIR)/$(MACH64) ROOTLIB64= $(ROOTLIB)/$(MACH64) ROOTUSRSBIN32= $(ROOTUSRSBIN)/$(MACH32) ROOTUSRSBIN64= $(ROOTUSRSBIN)/$(MACH64) -ROOTMAN= $(ROOT)/usr/share/man -ROOTMAN1= $(ROOTMAN)/man1 -ROOTMAN1M= $(ROOTMAN)/man1m -ROOTMAN3= $(ROOTMAN)/man3 ROOTVARSMB= $(ROOT)/var/smb @@ -164,12 +160,6 @@ ROOTPROG32= $(PROG:%=$(ROOTBIN32)/%) ROOTCMD64= $(PROG:%=$(ROOTCMDDIR64)/%) ROOTUSRSBINPROG32= $(PROG:%=$(ROOTUSRSBIN32)/%) ROOTUSRSBINPROG64= $(PROG:%=$(ROOTUSRSBIN64)/%) -ROOTMAN1FILES= $(MAN1FILES:%=$(ROOTMAN1)/%) -$(ROOTMAN1FILES) := FILEMODE= 444 -ROOTMAN1MFILES= $(MAN1MFILES:%=$(ROOTMAN1M)/%) -$(ROOTMAN1MFILES) := FILEMODE= 444 -ROOTMAN3FILES= $(MAN3FILES:%=$(ROOTMAN3)/%) -$(ROOTMAN3FILES) := FILEMODE= 444 # Symlink rules for /usr/ccs/bin commands. Note, those commands under # the rule of the linker area, are controlled by a different set of @@ -475,15 +465,6 @@ $(ROOTCCSBINLINKDIR)/%: % $(ROOTCCSBINLINKDIR64)/%: % $(INS.ccsbinlink64) -$(ROOTMAN1)/%: %.sunman - $(INS.rename) - -$(ROOTMAN1M)/%: %.sunman - $(INS.rename) - -$(ROOTMAN3)/%: %.sunman - $(INS.rename) - $(ROOTVARSMB)/%: % $(INS.file) diff --git a/usr/src/cmd/mdb/common/modules/zfs/zfs.c b/usr/src/cmd/mdb/common/modules/zfs/zfs.c index 75d9fbd102..5a28582be0 100644 --- a/usr/src/cmd/mdb/common/modules/zfs/zfs.c +++ b/usr/src/cmd/mdb/common/modules/zfs/zfs.c @@ -1569,6 +1569,9 @@ do_print_vdev(uintptr_t addr, int flags, int depth, boolean_t recursive, case VDEV_AUX_SPLIT_POOL: aux = "SPLIT_POOL"; break; + case VDEV_AUX_CHILDREN_OFFLINE: + aux = "CHILDREN_OFFLINE"; + break; default: aux = "UNKNOWN"; break; diff --git a/usr/src/cmd/pcitool/i386/Makefile b/usr/src/cmd/pcitool/i386/Makefile index 49e793dddf..5d25e74b30 100644 --- a/usr/src/cmd/pcitool/i386/Makefile +++ b/usr/src/cmd/pcitool/i386/Makefile @@ -17,14 +17,15 @@ # # CDDL HEADER END # + +# # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -# cmd/pcitool/i386/Makefile include ../Makefile.com CPPFLAGS += -I../../../../src/uts/i86pc LINTFLAGS += -erroff=E_STATIC_UNUSED -install: all $(ROOTUSRSBINPROG) $(ROOTMAN1MFILES) +install: all $(ROOTUSRSBINPROG) diff --git a/usr/src/cmd/pcitool/sparc/Makefile b/usr/src/cmd/pcitool/sparc/Makefile index 8860a49d3a..960d780517 100644 --- a/usr/src/cmd/pcitool/sparc/Makefile +++ b/usr/src/cmd/pcitool/sparc/Makefile @@ -17,13 +17,14 @@ # # CDDL HEADER END # + +# # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # -# cmd/pcitool/sparc/Makefile include ../Makefile.com LINTFLAGS += -erroff=E_STATIC_UNUSED -install: all $(ROOTUSRSBINPROG) $(ROOTMAN1MFILES) +install: all $(ROOTUSRSBINPROG) diff --git a/usr/src/cmd/smbios/smbios.c b/usr/src/cmd/smbios/smbios.c index 8c1d7a4d7e..2bac9156a5 100644 --- a/usr/src/cmd/smbios/smbios.c +++ b/usr/src/cmd/smbios/smbios.c @@ -550,9 +550,9 @@ print_processor(smbios_hdl_t *shp, id_t id, FILE *fp) else oprintf(fp, " Current Speed: Unknown\n"); - id_printf(fp, " L1 Cache Handle: ", p.smbp_l1cache); - id_printf(fp, " L2 Cache Handle: ", p.smbp_l2cache); - id_printf(fp, " L3 Cache Handle: ", p.smbp_l3cache); + id_printf(fp, " L1 Cache: ", p.smbp_l1cache); + id_printf(fp, " L2 Cache: ", p.smbp_l2cache); + id_printf(fp, " L3 Cache: ", p.smbp_l3cache); } static void diff --git a/usr/src/cmd/zpool/zpool_main.c b/usr/src/cmd/zpool/zpool_main.c index 8d9c95b958..f3a313907b 100644 --- a/usr/src/cmd/zpool/zpool_main.c +++ b/usr/src/cmd/zpool/zpool_main.c @@ -1563,6 +1563,10 @@ print_status_config(zpool_handle_t *zhp, const char *name, nvlist_t *nv, (void) printf(gettext("split into new pool")); break; + case VDEV_AUX_CHILDREN_OFFLINE: + (void) printf(gettext("all children offline")); + break; + default: (void) printf(gettext("corrupted data")); break; @@ -1650,6 +1654,10 @@ print_import_config(const char *name, nvlist_t *nv, int namewidth, int depth) (void) printf(gettext("too many errors")); break; + case VDEV_AUX_CHILDREN_OFFLINE: + (void) printf(gettext("all children offline")); + break; + default: (void) printf(gettext("corrupted data")); break; @@ -2297,6 +2305,7 @@ zpool_do_import(int argc, char **argv) idata.poolname = searchname; idata.guid = searchguid; idata.cachefile = cachefile; + idata.policy = policy; pools = zpool_search_import(g_zfs, &idata); diff --git a/usr/src/cmd/ztest/zloop.bash b/usr/src/cmd/ztest/zloop.bash index 2410eaa985..96d796ae0c 100755 --- a/usr/src/cmd/ztest/zloop.bash +++ b/usr/src/cmd/ztest/zloop.bash @@ -16,7 +16,7 @@ # # -# Copyright (c) 2015, 2016 by Delphix. All rights reserved. +# Copyright (c) 2015, 2017 by Delphix. All rights reserved. # set -x @@ -146,6 +146,9 @@ fi or_die /bin/rm -f ztest.history or_die /bin/rm -f ztest.cores +# Allow core files to be written to cwd if that's currently disabled. +sudo coreadm -e process + ztrc=0 # ztest return value foundcrashes=0 # number of crashes found so far starttime=$(/bin/date +%s) diff --git a/usr/src/data/hwdata/pci.ids b/usr/src/data/hwdata/pci.ids index 962da7b80a..80375f5d29 100644 --- a/usr/src/data/hwdata/pci.ids +++ b/usr/src/data/hwdata/pci.ids @@ -1,8 +1,8 @@ # # List of PCI ID's # -# Version: 2017.04.23 -# Date: 2017-04-23 03:15:02 +# Version: 2018.02.08 +# Date: 2018-02-08 03:15:01 # # Maintained by Albert Pool, Martin Mares, and other volunteers from # the PCI ID Project at http://pci-ids.ucw.cz/. @@ -39,8 +39,10 @@ 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD # Wrong ID used in subsystem ID of the TELES.S0/PCI 2.x ISDN adapter 00a7 Teles AG (Wrong ID) -0100 Ncipher Corp Ltd +# nee nCipher +0100 Thales e-Security 0123 General Dynamics +0128 Dell (wrong ID) # 018a is not LevelOne but there is a board misprogrammed 018a LevelOne 0106 FPC-0106TX misprogrammed [RTL81xx] @@ -76,18 +78,18 @@ 0b0b Rhino Equipment Corp. 0105 R1T1 0205 R4FXO - 0206 RCB4FXO 4-channel FXO analog telphony card + 0206 RCB4FXO 4-channel FXO analog telephony card 0305 R4T1 0405 R8FXX - 0406 RCB8FXX 8-channel modular analog telphony card + 0406 RCB8FXX 8-channel modular analog telephony card 0505 R24FXX - 0506 RCB24FXS 24-Channel FXS analog telphony card + 0506 RCB24FXS 24-Channel FXS analog telephony card 0605 R2T1 0705 R24FXS - 0706 RCB24FXO 24-Channel FXO analog telphony card + 0706 RCB24FXO 24-Channel FXO analog telephony card 0905 R1T3 Single T3 Digital Telephony Card - 0906 RCB24FXX 24-channel modular analog telphony card - 0a06 RCB672FXX 672-channel modular analog telphony card + 0906 RCB24FXX 24-channel modular analog telephony card + 0a06 RCB672FXX 672-channel modular analog telephony card 0e11 Compaq Computer Corporation 0001 PCI to EISA Bridge 0002 PCI to ISA Bridge @@ -248,6 +250,10 @@ 1028 1fd4 PERC H745P MX 1d49 0602 ThinkSystem RAID 930-16i 4GB Flash PCIe 12Gb Adapter 1d49 0604 ThinkSystem RAID 930-8e 4GB Flash PCIe 12Gb Adapter + 1d49 0607 ThinkSystem RAID 930-16i 8GB Flash PCIe 12Gb Adapter + 8086 352d Integrated RAID Module RMSP3AD160F + 8086 9460 RAID Controller RSP3TD160F + 8086 9480 RAID Controller RSP3MD088F 0015 MegaRAID Tri-Mode SAS3416 0016 MegaRAID Tri-Mode SAS3508 1028 1fc9 PERC H840 Adapter @@ -257,9 +263,15 @@ 1d49 0601 ThinkSystem RAID 930-8i 2GB Flash PCIe 12Gb Adapter 1d49 0603 ThinkSystem RAID 930-24i 4GB Flash PCIe 12Gb Adapter 1d49 0604 ThinkSystem RAID 930-8e 4GB Flash PCIe 12Gb Adapter + 8086 352e Integrated RAID Module RMSP3CD080F + 8086 352f Integrated RAID Module RMSP3HD080E + 8086 9461 RAID Controller RSP3DD080F 0017 MegaRAID Tri-Mode SAS3408 1d49 0500 ThinkSystem RAID 530-8i PCIe 12Gb Adapter 1d49 0502 ThinkSystem RAID 530-8i Dense Adapter + 8086 3528 Integrated RAID RMSP3LD060 + 8086 3529 Integrated RAID RMSP3LD060 + 8086 9441 RAID Controller RSP3WD080E 001b MegaRAID Tri-Mode SAS3504 1d49 0605 ThinkSystem RAID 930-4i 2GB Flash Flex Adapter 001c MegaRAID Tri-Mode SAS3404 @@ -325,6 +337,7 @@ 1033 8336 SAS1068 0056 SAS1064ET PCI-Express Fusion-MPT SAS 1014 03bb ServeRAID BR10il SAS/SATA Controller v2 + 8086 34dc AXX4SASMOD RAID Controller 0057 M1064E MegaRAID SAS 8086 346c Embedded Software RAID Technology II (ESTRII) 0058 SAS1068E PCI-Express Fusion-MPT SAS @@ -367,7 +380,16 @@ 1028 1f38 PERC H710 Mini (for monolithics) 15d9 0690 LSI MegaRAID ROMB 8086 3510 RMS25PB080 RAID Controller + 8086 3511 RMS25PB040 RAID Controller + 8086 3512 RMT3PB080 RAID Controller 8086 3513 RMS25CB080 RAID Controller + 8086 3514 RMS25CB040 RAID Controller + 8086 351c RMS25PB080N RAID Controller + 8086 351d RMS25CB080N RAID Controller + 8086 9265 RS25DB080 RAID Controller + 8086 9268 RS25AB080 RAID Controller + 8086 9285 RS25NB008 RAID Controller + 8086 9288 RS25SB008 RAID Controller 005c SAS1064A PCI-X Fusion-MPT SAS 005d MegaRAID SAS-3 3108 [Invader] 1000 9361 MegaRAID SAS 9361-8i @@ -387,6 +409,12 @@ 17aa 1052 ThinkServer RAID 720i 17aa 1053 ThinkServer RAID 720ix 1d49 0600 ThinkSystem RAID 730-8i 1GB Cache PCIe 12Gb Adapter + 8086 351e RMS3CC080 RAID Controller + 8086 351f RMS3CC040 RAID Controller + 8086 9360 RS3DC080 RAID Controller + 8086 9362 RS3DC040 RAID Controller + 8086 9380 RS3SC008 RAID Controller + 8086 9381 RS3MC044 RAID Controller 005e SAS1066 PCI-X Fusion-MPT SAS 005f MegaRAID SAS-3 3008 [Fury] 1028 1f44 PERC H330 Adapter @@ -429,6 +457,7 @@ 0062 SAS1078 PCI-Express Fusion-MPT SAS 1000 0062 SAS1078 PCI-Express Fusion-MPT SAS 0064 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor] + 1000 30c0 SAS 9201-16i 0065 SAS2116 PCI-Express Fusion-MPT SAS-2 [Meteor] 006e SAS2308 PCI-Express Fusion-MPT SAS-2 0070 SAS2004 PCI-Express Fusion-MPT SAS-2 [Spitfire] @@ -441,6 +470,7 @@ 1028 1f20 PERC H200 Embedded 1028 1f22 Internal Tape Adapter 8086 350f RMS2LL040 RAID Controller + 8086 3700 SSD 910 Series 0073 MegaRAID SAS 2008 [Falcon] 1000 9240 MegaRAID SAS 9240-8i 1000 9241 MegaRAID SAS 9240-4i @@ -496,12 +526,18 @@ 1043 8480 PIKE-2108 16PD 1734 1176 RAID Ctrl SAS 6G 5/6 512MB (D2616) 1734 1177 RAID Ctrl SAS 6G 0/1 (D2607) - 8086 9256 MegaRAID SAS 9260DE-8i + 8086 350b RMS2MH080 RAID Controller + 8086 9256 MegaRAID SAS 9260DE-8i RS2BL080DE 8086 9260 RAID Controller RS2BL040 8086 9261 RAID Controller RS2BL080 - 8086 9264 Warm Beach (Caster Lite) + 8086 9264 RAID Controller RT3WB080 Warm Beach (Caster Lite) 8086 9267 RAID Controller RS2VB040 8086 9268 RAID Controller RS2VB080 + 8086 9275 RAID Controller RS2PI008DE + 8086 9276 RAID Controller RS2WG160 + 8086 9280 RAID Controller RS2PI008 + 8086 9282 RAID Controller RS2MB044 + 8086 9290 RAID Controller RS2SG244 007c MegaRAID SAS 1078DE 1014 0395 ServeRAID-AR10is SAS/SATA Controller 007e SSS6200 PCI-Express Flash SSD @@ -532,6 +568,14 @@ 1000 3040 9207-8e SAS2.1 HBA 1000 3050 SAS9217-8i 1590 0044 H220i + 8086 3000 RS25GB008 RAID Controller + 8086 3060 RS25FB044 RAID Controller + 8086 3516 RMS25JB080 RAID Controller + 8086 3517 RMS25JB040 RAID Controller + 8086 3518 RMS25KB080 RAID Controller + 8086 3519 RMS25KB040 RAID Controller + 8086 351a RMS25LB040 RAID Controller + 8086 351b RMS25LB080 RAID Controller 008f 53c875J 1092 8000 FirePort 40 SCSI Controller 1092 8760 FirePort 40 Dual SCSI Host Adapter @@ -542,7 +586,9 @@ 0096 SAS3004 PCI-Express Fusion-MPT SAS-3 0097 SAS3008 PCI-Express Fusion-MPT SAS-3 1000 3090 SAS9311-8i + 1000 30a0 SAS9300-8e 1000 30e0 SAS9300-8i + 1000 3130 SAS 9300-16i 1028 1f45 HBA330 Adapter 1028 1f46 12Gbps HBA 1028 1f53 HBA330 Mini @@ -550,13 +596,17 @@ 1028 1fd3 HBA330 MMZ 1bd4 0011 Inspur 12Gb 8i-3008 IT SAS HBA 00ab SAS3516 Fusion-MPT Tri-Mode RAID On Chip (ROC) + 8086 3530 Integrated RAID Module RMSP3JD160J 00ac SAS3416 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) 1d49 0201 ThinkSystem 430-16i SAS/SATA 12Gb HBA 1d49 0203 ThinkSystem 430-16e SAS/SATA 12Gb HBA + 8086 3000 RAID Controller RSP3QD160J + 8086 3020 RAID Controller RSP3GD016J 00ae SAS3508 Fusion-MPT Tri-Mode RAID On Chip (ROC) 00af SAS3408 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) 1d49 0200 ThinkSystem 430-8i SAS/SATA 12Gb HBA 1d49 0202 ThinkSystem 430-8e SAS/SATA 12Gb HBA + 1d49 0204 ThinkSystem 430-8i SAS/SATA 12Gb Dense HBA 00be SAS3504 Fusion-MPT Tri-Mode RAID On Chip (ROC) 00bf SAS3404 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) 00c0 SAS3324 PCI-Express Fusion-MPT SAS-3 @@ -577,6 +627,9 @@ 00d0 SAS3716 Fusion-MPT Tri-Mode RAID Controller Chip (ROC) 00d1 SAS3616 Fusion-MPT Tri-Mode I/O Controller Chip (IOC) 00d3 MegaRAID Tri-Mode SAS3716W + 02b0 Virtual Endpoint on PCIe Switch + 1d49 0001 ThinkSystem 1610-4P NVMe Switch Adapter + 1d49 0002 ThinkSystem 810-4P NVMe Switch Adapter 0407 MegaRAID 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller @@ -699,6 +752,8 @@ 131b Kaveri [Radeon R4 Graphics] 131c Kaveri [Radeon R7 Graphics] 131d Kaveri [Radeon R6 Graphics] + 15dd Vega [Radeon Vega 8 Mobile] + 15ff Vega [Radeon Vega 28 Mobile] 1714 BeaverCreek HDMI Audio [Radeon HD 6500D and 6400G-6600G series] 103c 168b ProBook 4535s 3150 RV380/M24 [Mobility Radeon X600] @@ -730,7 +785,7 @@ 18bc 0101 GC-R9600PRO (Primary) 4151 RV350 [Radeon 9600 Series] 1043 c004 A9600SE - 174b 7c37 Radeon 9600 SE + 174b 7c37 Radeon 9600SE 128M DDR V/D/VO 4152 RV360 [Radeon 9600/X1050 Series] 1002 0002 Radeon 9600XT 1002 4772 All-in-Wonder 9600 XT @@ -760,7 +815,7 @@ 18bc 0100 GC-R9600PRO (Secondary) 4171 RV350 [Radeon 9600] (Secondary) 1043 c005 A9600SE (Secondary) - 174b 7c36 Radeon 9600 SE (secondary) + 174b 7c36 Radeon 9600SE 128M DDR V/D/VO (secondary) 4172 RV350 [Radeon 9600/X1050 Series] (Secondary) 1002 0003 Radeon 9600XT (Secondary) 1002 4773 All-in-Wonder 9600 XT (Secondary) @@ -867,6 +922,8 @@ 1043 836c M4A785TD Motherboard 1043 8410 M4A89GTD PRO/USB3 Motherboard 1043 841b M5A88-V EVO + 1043 8445 M5A78L LE + 105b 0e13 N15235/A74MX mainboard / AMD SB700 1179 ff50 Satellite P305D-S8995E 1458 a022 GA-MA770-DS3rev2.0 Motherboard 17f2 5000 KI690-AM2 Motherboard @@ -877,6 +934,7 @@ 103c 280a DC5750 Microtower 1043 82ef M3A78-EH Motherboard 1043 8389 M4A785TD Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 1179 ff50 Satellite P305D-S8995E 1458 4385 GA-MA770-DS3rev2.0 Motherboard 1462 7368 K9AG Neo2 @@ -928,14 +986,17 @@ 4390 SB7x0/SB8x0/SB9x0 SATA Controller [IDE mode] 1043 82ef M3A78-EH Motherboard 1043 8389 M4A785TD Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 1458 b002 GA-MA770-DS3rev2.0 Motherboard 1849 4390 Motherboard (one of many) 4391 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] 103c 1611 Pavilion DM1Z-3000 1043 82ef M3A78-EH Motherboard 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 174b 1001 PURE Fusion Mini 4392 SB7x0/SB8x0/SB9x0 SATA Controller [Non-RAID5 mode] + 105b 0e13 N15235/A74MX mainboard / AMD SB700 4393 SB7x0/SB8x0/SB9x0 SATA Controller [RAID5 mode] 4394 SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] 4395 SB8x0/SB9x0 SATA Controller [Storage mode] @@ -944,6 +1005,7 @@ 103c 1611 Pavilion DM1Z-3000 1043 82ef M3A78-EH Motherboard 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 15d9 a811 H8DGU 174b 1001 PURE Fusion Mini 4397 SB7x0/SB8x0/SB9x0 USB OHCI0 Controller @@ -951,25 +1013,30 @@ 103c 1611 Pavilion DM1Z-3000 1043 82ef M3A78-EH Motherboard 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 15d9 a811 H8DGU 174b 1001 PURE Fusion Mini 4398 SB7x0 USB OHCI1 Controller 1019 2120 A785GM-M 1043 82ef M3A78-EH Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 15d9 a811 H8DGU 4399 SB7x0/SB8x0/SB9x0 USB OHCI2 Controller 1019 2120 A785GM-M 1043 82ef M3A78-EH Motherboard 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 174b 1001 PURE Fusion Mini 439c SB7x0/SB8x0/SB9x0 IDE Controller 1019 2120 A785GM-M 1043 82ef M3A78-EH Motherboard + 105b 0e13 N15235/A74MX mainboard / AMD SB700 439d SB7x0/SB8x0/SB9x0 LPC host controller 1019 2120 A785GM-M 103c 1611 Pavilion DM1Z-3000 1043 82ef M3A78-EH Motherboard 1043 8443 M5A88-V EVO + 105b 0e13 N15235/A74MX mainboard / AMD SB700 174b 1001 PURE Fusion Mini 43a0 SB700/SB800/SB900 PCI to PCI bridge (PCIE port 0) 43a1 SB700/SB800/SB900 PCI to PCI bridge (PCIE port 1) @@ -1537,10 +1604,12 @@ 103c 8006 FirePro M4170 17aa 3643 Radeon R7 A360 6605 Opal PRO [Radeon R7 M260] + 103c 2259 FirePro M4150 6606 Mars XTX [Radeon HD 8790M] 1028 0684 FirePro W4170M 6607 Mars LE [Radeon HD 8530M / R5 M240] 6608 Oland GL [FirePro W2100] + 13cc 3d28 MXRT-2600 6610 Oland XT [Radeon HD 8670 / R7 250/350] 1019 0030 Radeon HD 8670 1028 2120 Radeon R7 250 @@ -1565,6 +1634,7 @@ 6623 Mars 6631 Oland 6640 Saturn XT [FirePro M6100] + 106b 014b Tropo XT [Radeon R9 M380 Mac Edition] 6641 Saturn PRO [Radeon HD 8930M] 6646 Bonaire XT [Radeon R9 M280X] 6647 Bonaire PRO [Radeon R9 M270X] @@ -1572,6 +1642,7 @@ 1002 0b0c FirePro W4300 103c 0b0c Bonaire [FirePro W4300] 103c 230c FirePro W5100 + 13cc 3d2a MXRT-5600 6650 Bonaire 6651 Bonaire 6658 Bonaire XTX [Radeon R7 260X/360] @@ -1600,12 +1671,13 @@ 1462 2938 Radeon R9 360 OEM 1462 3271 Radeon R9 360 OEM 1682 7360 Radeon R7 360 - 6660 Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430] + 6660 Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 / M430 / R7 M520] 1028 05ea Radeon HD 8670M 1028 06bf Radeon R5 M335 103c 1970 Radeon HD 8670M 103c 80be Radeon R5 M330 103c 8136 Radeon R5 M330 + 103c 8329 Radeon R7 M520 17aa 3804 Radeon R5 M330 17aa 3809 Radeon R5 M330 17aa 381a Radeon R5 M430 @@ -1810,6 +1882,7 @@ 6743 Whistler [Radeon E6760] 6749 Turks GL [FirePro V4900] 674a Turks GL [FirePro V3900] + 13cc 3d22 MXRT-2500 6750 Onega [Radeon HD 6650A/7650A] 1462 2670 Radeon HD 6670A 17aa 3079 Radeon HD 7650A @@ -2127,6 +2200,7 @@ # GV-R928XOC-3GD 1458 3001 Tahiti XTL [Radeon R9 280X OC] 1462 2774 MSI R7970 TF 3GD5/OC BE + 1682 3001 Tahiti XTL [Radeon R9 280X] 1682 3211 Double D HD 7970 Black Edition # FX-797A-TNBC 1682 3213 HD 7970 Black Edition @@ -2135,13 +2209,12 @@ # Radeon HD 7970 X2 1787 2317 Radeon HD 7990 1787 3000 Tahiti XT2 [Radeon HD 7970 GHz Edition] - 6799 New Zealand [Radeon HD 7900 Series] 679a Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280] 1002 0b01 Radeon HD 8950 OEM 1002 3000 Tahiti PRO2 [Radeon HD 7950 Boost] 1462 3000 Radeon HD 8950 OEM 174b a003 Radeon R9 280 - 679b Malta [Radeon HD 7990] + 679b Malta [Radeon HD 7990/8990 OEM] 1002 0b28 Radeon HD 8990 OEM 1002 0b2a Radeon HD 7990 1462 8036 Radeon HD 8990 OEM @@ -2201,36 +2274,60 @@ 174b e324 Sapphire Nitro R9 390 67b9 Vesuvius [Radeon R9 295X2] 67be Hawaii LE - 67c0 Ellesmere [Polaris10] + 67c0 Ellesmere [Radeon Pro WX 7100] + 67c2 Ellesmere [Radeon Pro V7300X / V7350x2] 67c4 Ellesmere [Radeon Pro WX 7100] + 1002 0336 Radeon Pro Duo + 1002 1336 Radeon Pro Duo 67c7 Ellesmere [Radeon Pro WX 5100] 67ca Ellesmere [Polaris10] 67cc Ellesmere [Polaris10] 67cf Ellesmere [Polaris10] - 67df Ellesmere [Radeon RX 470/480] + 67d0 Ellesmere [Radeon Pro V7300X / V7350x2] + 67df Ellesmere [Radeon RX 470/480/570/580] 1002 0b37 Radeon RX 480 1043 04a8 Radeon RX 480 1043 04b0 Radeon RX 470 1043 04fb Radeon RX 480 1043 04fd Radeon RX 480 8GB + 1458 22f0 Radeon RX 570 1462 3411 Radeon RX 470 1462 3413 Radeon RX 480 148c 2372 Radeon RX 480 148c 2373 Radeon RX 470 1682 9470 Radeon RX 470 1682 9480 Radeon RX 480 + 1682 9588 Radeon RX 580 XTR 174b e347 Radeon RX 470/480 174b e349 Radeon RX 470 1787 a470 Radeon RX 470 1787 a480 Radeon RX 480 - 67e0 Baffin [Polaris11] + 1da2 e353 Sapphire Radeon RX 580 Pulse 8GB + 1da2 e366 Nitro+ Radeon RX 580 4GB + 67e0 Baffin [Radeon Pro WX 4170] + 103c 8270 Radeon Pro WX 4170 + 103c 8272 Radeon Pro WX 4170 67e1 Baffin [Polaris11] 67e3 Baffin [Radeon Pro WX 4100] - 67e8 Baffin [Polaris11] + 67e8 Baffin [Radeon Pro WX 4130/4150] + 1028 075d Radeon Pro WX 4150 + 1028 07b0 Radeon Pro WX 4130/4150 + 1028 07b1 Radeon Pro WX 4130 + 1028 175d Radeon Pro WX 4150 + 1028 17b0 Radeon Pro WX 4130/4150 + 1028 17b1 Radeon Pro WX 4130 + 103c 8275 Radeon Pro WX 4150 + 103c 8277 Radeon Pro WX 4150 67e9 Baffin [Polaris11] - 67eb Baffin [Polaris11] - 67ef Baffin [Radeon RX 460] - 67ff Baffin [Polaris11] + 67eb Baffin [Radeon Pro V5300X] + 67ef Baffin [Radeon RX 460/560D / Pro 450/455/460/560] + 106b 0160 Radeon Pro 460 + 106b 0166 Radeon Pro 455 + 106b 0167 Radeon Pro 450 + 106b 0179 Radeon Pro 560 + 1642 1727 Polaris 21 XL [Radeon RX 560D] + 1682 956d Polaris 21 XL [Radeon RX 560D] + 67ff Baffin [Radeon RX 560] 6800 Wimbledon XT [Radeon HD 7970M] 1002 0124 Radeon HD 7970M 8086 2110 Radeon HD 7970M @@ -2246,6 +2343,8 @@ 1002 0310 FirePro S7000 1002 0420 Radeon Sky 500 6809 Pitcairn LE GL [FirePro W5000] + 13cc 3d23 MXRT-5500 + 13cc 3d24 MXRT-5550 6810 Curacao XT / Trinidad XT [Radeon R7 370 / R9 270X/370X] 148c 0908 Radeon R9 370 OEM 1682 7370 Radeon R7 370 @@ -2257,6 +2356,7 @@ 1462 3050 R9 270 Gaming OC 148c 2016 Trinidad PRO [Radeon R9 370 OEM] 1682 2015 Trinidad PRO [Radeon R7 370] + 174b 2015 NITRO Radeon R7 370 174b 2016 Trinidad PRO [Radeon R9 370 OEM] 1787 2016 Trinidad PRO [Radeon R9 370 OEM] 6816 Pitcairn @@ -2265,6 +2365,7 @@ 1002 0b05 Radeon HD 8870 OEM 174b 8b04 Radeon HD 8860 6819 Pitcairn PRO [Radeon HD 7850 / R7 265 / R9 270 1024SP] + 1043 042c Radeon HD 7850 1682 7269 Radeon R9 270 1024SP 1682 9278 Radeon R9 270 1024SP 174b a008 Radeon R9 270 1024SP @@ -2292,7 +2393,8 @@ 6828 Cape Verde PRO [FirePro W600] 6829 Cape Verde 682a Venus PRO - 682b Venus LE [Radeon HD 8830M] + 682b Venus LE / Tropo PRO-L [Radeon HD 8830M / R7 M465X] + 0128 079c Radeon R7 465X 682c Cape Verde GL [FirePro W4100] 682d Chelsea XT GL [FirePro M4000] 682f Chelsea LP [Radeon HD 7730M] @@ -2426,10 +2528,19 @@ 144d c0c7 Radeon HD 7550M 6842 Thames LE [Radeon HD 7000M Series] 6843 Thames [Radeon HD 7670M] - 687f Vega [Radeon RX Vega] + 6860 Vega 10 [Radeon Instinct MI25] + 6861 Vega 10 XT [Radeon PRO WX 9100] + 6862 Vega 10 XT [Radeon PRO SSG] + 6863 Vega 10 XTX [Radeon Vega Frontier Edition] + 6864 Vega + 6867 Vega + 6868 Vega + 686c Vega 10 [Radeon Instinct MI25 MxGPU] + 687f Vega 10 XT [Radeon RX Vega 64] 6888 Cypress XT [FirePro V8800] 6889 Cypress PRO [FirePro V7800] 1002 0301 FirePro V7800P + 13cc 3d1f MXRT-7400 688a Cypress XT [FirePro V9800] 1002 030c FirePro V9800P 688c Cypress XT GL [FireStream 9370] @@ -2477,6 +2588,8 @@ 103c 159b Radeon HD 6850M 144d c0ad Radeon HD 6850M 68a9 Juniper XT [FirePro V5800] + 13cc 3d1e MXRT-5400 + 13cc 3d20 MXRT-5450 68b8 Juniper XT [Radeon HD 5770] 106b 00cf MacPro5,1 [Mac Pro 2.8GHz DDR3] 68b9 Juniper LE [Radeon HD 5670 640SP Edition] @@ -2638,6 +2751,7 @@ 1462 2246 Radeon HD 6550A 68c8 Redwood XT GL [FirePro V4800] 68c9 Redwood PRO GL [FirePro V3800] + 13cc 3d1d MXRT-2400 68d8 Redwood XT [Radeon HD 5670/5690/5730] 1028 68e0 Radeon HD 5670 174b 5690 Radeon HD 5690 @@ -2934,29 +3048,43 @@ 148c 9380 Radeon R9 380 # Make naming scheme consistent 174b e308 Radeon R9 380 Nitro 4G D5 + 694c Vega [Radeon RX Vega M] 6980 Polaris12 6981 Polaris12 - 6985 Polaris12 + 6985 Lexa XT [Radeon PRO WX 3100] 6986 Polaris12 - 6987 Polaris12 + 6987 Lexa [Radeon E9171 MCM] + 6995 Lexa XT [Radeon PRO WX 2100] 699f Lexa PRO [Radeon RX 550] + 148c 2380 Lexa XL [Radeon RX 550] + 1da2 e367 Lexa PRO [Radeon RX 550] 700f RS100 AGP Bridge 7010 RS200/RS250 AGP Bridge 7100 R520 [Radeon X1800 XT] 7101 R520/M58 [Mobility Radeon X1800 XT] 7102 R520/M58 [Mobility Radeon X1800] 7104 R520 GL [FireGL V7200] + 13cc 3d0a MXRT-5100 7109 R520 [Radeon X1800 XL] 1002 0322 All-in-Wonder X1800XL 1002 0d02 Radeon X1800 CrossFire Edition 710a R520 [Radeon X1800 GTO] 1002 0b12 Radeon X1800 GTO² 710b R520 [Radeon X1800 GTO] + 710e R520 GL [FireGL V7300] + 13cc 3d0c MXRT-5150 + 710f R520 GL [FireGL V7350] + 13cc 3d0e MXRT-7100 7120 R520 [Radeon X1800] (Secondary) 7124 R520 GL [FireGL V7200] (Secondary) + 13cc 3d0b MXRT-5100 (Secondary) 7129 R520 [Radeon X1800] (Secondary) 1002 0323 All-In-Wonder X1800 XL (Secondary) 1002 0d03 Radeon X1800 CrossFire Edition (Secondary) + 712e R520 GL [FireGL V7300] (Secondary) + 13cc 3d0d MXRT-5150 (Secondary) + 712f R520 GL [FireGL V7350] (Secondary) + 13cc 3d0f MXRT-7100 (Secondary) 7140 RV515 [Radeon X1300/X1550/X1600 Series] 7142 RV515 PRO [Radeon X1300/X1550 Series] 1002 0322 All-in-Wonder 2006 PCI-E Edition @@ -2996,12 +3124,16 @@ 7193 RV516 [Radeon X1550 Series] 7196 RV516/M62-S [Mobility Radeon X1350] 719b RV516 GL [FireMV 2250] + 13cc 3d12 MXRT-1150 + 13cc 3d14 MXRT-2150 719f RV516 [Radeon X1550 Series] 71a0 RV516 [Radeon X1300/X1550 Series] (Secondary) 71a1 RV516 [Radeon X1600/X1650 Series] (Secondary) 71a3 RV516 [Radeon X1300/X1550 Series] (Secondary) 71a7 RV516 [Radeon X1300/X1550 Series] (Secondary) 71bb RV516 GL [FireMV 2250] (Secondary) + 13cc 3d13 MXRT-1150 (Secondary) + 13cc 3d15 MXRT-2150 (Secondary) 71c0 RV530 [Radeon X1600 XT/X1650 GTO] 1002 e160 Radeon X1650 GTO 174b e160 Radeon X1650 GTO @@ -3020,6 +3152,7 @@ 1787 3000 PowerColor X1650 PRO AGP 71ce RV530 [Radeon X1300 XT/X1600 PRO] 71d2 RV530 GL [FireGL V3400] + 13cc 3d08 MXRT-2100 71d4 RV530/M66 GL [Mobility FireGL V5250] 71d5 RV530/M66-P [Mobility Radeon X1700] 71d6 RV530/M66-XT [Mobility Radeon X1700] @@ -3033,6 +3166,7 @@ 71e7 RV535 [Radeon X1650 PRO] (Secondary) 1787 3001 Radeon X1650 PRO AGP 71f2 RV530 GL [FireGL V3400] (Secondary) + 13cc 3d09 MXRT-2100 (Secondary) 7210 RV550/M71 [Mobility Radeon HD 2300] 7211 RV550/M71 [Mobility Radeon X2300 HD] 7240 R580+ [Radeon X1950 XTX] @@ -3073,8 +3207,9 @@ 7910 RS690 Host Bridge 1179 ff50 Satellite P305D-S8995E 17f2 5000 KI690-AM2 Motherboard - 7911 RS690 Host Bridge - 7912 RS690 PCI to PCI Bridge (Internal gfx) + 7911 RS690/RS740 Host Bridge + 1002 7910 RS690/RS740 Host Bridge + 7912 RS690/RS740 PCI to PCI Bridge (Internal gfx) 7913 RS690 PCI to PCI Bridge (PCI Express Graphics Port 0) 7915 RS690 PCI to PCI Bridge (PCI Express Port 1) 7916 RS690 PCI to PCI Bridge (PCI Express Port 2) @@ -3099,6 +3234,7 @@ 7941 RS600 [Radeon Xpress 1250] 7942 RS600M [Radeon Xpress 1250] 796e RS740 [Radeon 2100] + 105b 0e13 N15235/A74MX mainboard 9400 R600 [Radeon HD 2900 PRO/XT] 1002 2552 Radeon HD 2900 XT 1002 3000 Radeon HD 2900 PRO @@ -3107,6 +3243,7 @@ 9403 R600 [Radeon HD 2900 PRO] 9405 R600 [Radeon HD 2900 GT] 940a R600 GL [FireGL V8650] + 13cc 3d16 MXRT-7200 940b R600 GL [FireGL V8600] 940f R600 GL [FireGL V7600] 9440 RV770 [Radeon HD 4870] @@ -3144,6 +3281,7 @@ 174b 0028 Radeon HD 4650 AGP DDR2 9498 RV730 PRO [Radeon HD 4650] 949c RV730 GL [FirePro V7750] + 13cc 3d1b MXRT-7300 949e RV730 GL [FirePro V5700] 949f RV730 GL [FirePro V3750] 94a0 RV740/M97 [Mobility Radeon HD 4830] @@ -3230,6 +3368,7 @@ 958a RV630 [Radeon HD 2600 X2] 958b RV630/M76 [Mobility Radeon HD 2600 XT] 958c RV630 GL [FireGL V5600] + 13cc 3d18 MXRT-5200 958d RV630 GL [FireGL V3600] 9591 RV635/M86 [Mobility Radeon HD 3650] 1002 9591 Mobility Radeon HD 3650 @@ -3316,6 +3455,7 @@ 9840 Kabini HDMI/DP Audio 9850 Mullins [Radeon R3 Graphics] 9851 Mullins [Radeon R4/R5 Graphics] + 1179 f928 Beema [Radeon R5 Graphics] 9852 Mullins [Radeon R2 Graphics] 9853 Mullins [Radeon R2 Graphics] 9854 Mullins [Radeon R3E Graphics] @@ -3413,6 +3553,7 @@ aad8 Tonga HDMI Audio [Radeon R9 285/380] 174b aad8 Radeon R9 285/380 HDMI Audio aae8 Fiji HDMI/DP Audio [Radeon R9 Nano / FURY/FURY X] + aaf0 Ellesmere [Radeon RX 580] ac00 Theater 600 Pro ac02 TV Wonder HD 600 PCIe ac12 Theater HD T507 (DVB-T) TV tuner/capture device @@ -3800,6 +3941,7 @@ 1014 0338 PCI-X DDR Auxiliary Cache Adapter (575C) 0302 Winnipeg PCI-X Host Bridge 0308 CalIOC2 PCI-E Root Port + 0311 FC 5740/1954 4-Port 10/100/1000 Base-TX PCI-X Adapter for POWER 0314 ZISC 036 Neural accelerator card 032d Axon - Cell Companion Chip 1014 03a1 PCIe PowerXCell 8i Cell Accelerator Board @@ -3830,6 +3972,7 @@ 1014 04c7 PCIe3 x 8 Cache SAS RAID Internal Adapter 6GB(2CCA) 1014 04c8 PCIe3 x 8 Cache SAS RAID Internal Adapter 6GB(2CD2) 1014 04c9 PCIe3 x 8 Cache SAS RAID Internal Adapter 6GB(2CCD) + 03dc POWER8 Host Bridge (PHB3) 044b GenWQE Accelerator Adapter 04aa Flash Adapter 90 (PCIe2 0.9TB) 04da PCI-E IPR SAS+ Adapter (ASIC) @@ -3949,12 +4092,35 @@ 141f Family 15h (Models 30h-3fh) Processor Function 5 1422 Family 15h (Models 30h-3fh) Processor Root Complex 1423 Family 15h (Models 30h-3fh) I/O Memory Management Unit + 1424 Family 15h (Models 30h-3fh) Processor Root Port 1426 Family 15h (Models 30h-3fh) Processor Root Port + 142e Liverpool Processor Function 0 + 142f Liverpool Processor Function 1 + 1430 Liverpool Processor Function 2 + 1431 Liverpool Processor Function 3 + 1432 Liverpool Processor Function 4 1436 Liverpool Processor Root Complex 1437 Liverpool I/O Memory Management Unit 1438 Liverpool Processor Root Port 1439 Family 16h Processor Functions 5:1 + 1450 Family 17h (Models 00h-0fh) Root Complex + 1451 Family 17h (Models 00h-0fh) I/O Memory Management Unit + 1452 Family 17h (Models 00h-0fh) PCIe Dummy Host Bridge + 1453 Family 17h (Models 00h-0fh) PCIe GPP Bridge + 1454 Family 17h (Models 00h-0fh) Internal PCIe GPP Bridge 0 to Bus B + 1456 Family 17h (Models 00h-0fh) Platform Security Processor + 1457 Family 17h (Models 00h-0fh) HD Audio Controller 145b Zeppelin Non-Transparent Bridge + 145c Family 17h (Models 00h-0fh) USB 3.0 Host Controller + 145f USB 3.0 Host controller + 1460 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 0 + 1461 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 1 + 1462 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 2 + 1463 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 3 + 1464 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 4 + 1465 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 5 + 1466 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 6 + 1467 Family 17h (Models 00h-0fh) Data Fabric: Device 18h; Function 7 1510 Family 14h Processor Root Complex 174b 1001 PURE Fusion Mini 1512 Family 14h Processor Root Port @@ -3970,6 +4136,17 @@ 1535 Family 16h Processor Function 5 1536 Family 16h Processor Root Complex 1538 Family 16h Processor Function 0 + 1570 Family 15h (Models 60h-6fh) Processor Function 0 + 1571 Family 15h (Models 60h-6fh) Processor Function 1 + 1572 Family 15h (Models 60h-6fh) Processor Function 2 + 1573 Family 15h (Models 60h-6fh) Processor Function 3 + 1574 Family 15h (Models 60h-6fh) Processor Function 4 + 1575 Family 15h (Models 60h-6fh) Processor Function 5 + 1576 Family 15h (Models 60h-6fh) Processor Root Complex + 1577 Family 15h (Models 60h-6fh) I/O Memory Management Unit + 157a Family 15h (Models 60h-6fh) Audio Controller + 157b Family 15h (Models 60h-6fh) Host Bridge + 157c Family 15h (Models 60h-6fh) Processor Root Port 1600 Family 15h Processor Function 0 1601 Family 15h Processor Function 1 1602 Family 15h Processor Function 2 @@ -4039,6 +4216,12 @@ 43a1 Hudson PCI to PCI bridge (PCIE port 1) 43a2 Hudson PCI to PCI bridge (PCIE port 2) 43a3 Hudson PCI to PCI bridge (PCIE port 3) + 43b1 X399 Series Chipset PCIe Bridge + 43b4 300 Series Chipset PCIe Port + 43b6 X399 Series Chipset SATA Controller + 43b7 300 Series Chipset SATA Controller + 43ba X399 Series Chipset USB 3.1 xHCI Controller + 43bb 300 Series Chipset USB 3.1 xHCI Controller 7006 AMD-751 [Irongate] System Controller 7007 AMD-751 [Irongate] AGP Bridge 700a AMD-IGR4 AGP Host to PCI Bridge @@ -4493,6 +4676,9 @@ 0533 MGA G200EH 103c 3381 iLO4 0534 G200eR2 + 0536 Integrated Matrox G200eW3 Graphics Controller + 0538 G200eH + 1590 00e4 iLO5 VGA 0540 M91XX 102b 2080 M9140 LP PCIe x16 102b 20c0 Xenia @@ -4531,7 +4717,7 @@ 102b 0f84 Millennium G550 Dual Head DDR 32Mb 102b 1e41 Millennium G550 102b 2300 Millennium G550 LP PCIE - 2537 Millenium P650/P750 + 2537 Millennium P650/P750 102b 1820 Millennium P750 64MB 102b 1830 Millennium P650 64MB 102b 1850 RAD2mp @@ -4539,7 +4725,7 @@ 102b 1880 Sono S10 102b 1c10 QID 128MB 102b 2811 Millennium P650 Low-profile PCI 64MB - 102b 2821 Millenium P650 Low-profile PCI + 102b 2821 Millennium P650 Low-profile PCI 102b 2841 RAD PCI 102b 2851 Spectrum PCI 102b 2871 EpicA TC2 @@ -4553,7 +4739,7 @@ 102b 3051 RG-400SL 102b 3061 Extio F1420 102b 3081 Extio F1240 - 2538 Millenium P650 PCIe + 2538 Millennium P650 PCIe 102b 0847 RAD PCIe 102b 08c7 Millennium P650 PCIe 128MB 102b 0907 Millennium P650 PCIe 64MB @@ -4561,23 +4747,23 @@ 102b 0987 ATC PCIe 4MP 102b 1047 Millennium P650 LP PCIe 128MB 102b 1087 Millennium P650 LP PCIe 64MB - 102b 1801 Millenium P650 PCIe x1 + 102b 1801 Millennium P650 PCIe x1 102b 2538 Parhelia APVe 102b 3007 QID Low-profile PCIe 102b 3087 Aurora VX3mp 102b 30c7 QID LP PCIe 2539 Millennium P690 - 102b 0040 Millenium P690 PCIe x16 + 102b 0040 Millennium P690 PCIe x16 102b 0042 ONYX 102b 0043 SPECTRA - 102b 0080 Millenium P690 Plus LP PCIe x16 - 102b 0081 Millenium P690 LP PCIe x16 + 102b 0080 Millennium P690 Plus LP PCIe x16 + 102b 0081 Millennium P690 LP PCIe x16 102b 0082 RAD LPX PCIe x16 - 102b 00c0 Millenium P690 Plus LP PCI - 102b 00c2 Millenium P690 LP PCI + 102b 00c0 Millennium P690 Plus LP PCI + 102b 00c2 Millennium P690 LP PCI 102b 00c3 RAD LPX PCI - 102b 0101 Millenium P690 PCI - 102b 0140 Millenium P690 LP PCIe x1 + 102b 0101 Millennium P690 PCI + 102b 0140 Millennium P690 LP PCIe x1 102b 0180 Display Wall IP Decode 128 MB 4164 Morphis QxT frame grabber 43b4 Morphis Qxt encoding engine @@ -5005,6 +5191,8 @@ 12ee PCI-X 2.0 Local Bus Adapter 1302 RMP-3 Shared Memory Driver 1303 RMP-3 (Remote Management Processor) + 22f6 iLO5 Virtual USB Controller + 1590 00e4 iLO5 Standard Virtual USB Controller 2910 E2910A PCIBus Exerciser 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer 3206 Adaptec Embedded Serial ATA HostRAID @@ -5090,11 +5278,9 @@ 3308 Integrated Lights-Out Standard MS Watchdog Timer 103c 330e iLO3 103c 3381 iLO4 - 402f PCIe Root Port 4030 zx2 System Bus Adapter 4031 zx2 I/O Controller 4037 PCIe Local Bus Adapter - 403b PCIe Root Port 103e Solliday Engineering 103f Synopsys/Logic Modeling Group 1040 Accelgraphics Inc. @@ -5107,11 +5293,11 @@ 3020 Samurai_IDE 1043 ASUSTeK Computer Inc. 0464 Radeon R9 270x GPU + 0521 RX580 [RX 580 Dual O8G] 0675 ISDNLink P-IN100-ST-D 0675 1704 ISDN Adapter (PCI Bus, D, C) 0675 1707 ISDN Adapter (PCI Bus, DV, W) 10cf 105e ISDN Adapter (PCI Bus, DV, W) - 13a0 Transformer Book T101HA-GR030R # Should be 1022:9602 9602 AMD RS780/RS880 PCI to PCI bridge (int gfx) 1043 83a2 M4A785TD Motherboard @@ -5177,7 +5363,7 @@ c824 82C824 c825 82C825 [Firebridge 2] c832 82C832 - c861 82C861 + c861 82C861 OHCI USB Host c881 82C881 [FireLink] 1394 OHCI Link Controller c895 82C895 c935 EV1935 ECTIVA MachOne PCIAudio @@ -5325,10 +5511,11 @@ 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Latitude D800) 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller 1028 018d Inspiron 700m/710m - 8031 PCIxx21/x515 Cardbus Controller + 8031 PCIxx21/PCIxx11/PCIx515 PC Card Controller 1025 0064 Extensa 3000 series laptop 1025 0080 Aspire 5024WLMi 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 103c 308b MX6125 8032 OHCI Compliant IEEE 1394 Host Controller @@ -5337,19 +5524,22 @@ 103c 0934 Compaq nw8240/nx8220 103c 099c NX6110/NC6120 103c 308b MX6125 - 8033 PCIxx21 Integrated FlashMedia Controller + 8033 PCIxx21/PCIxx11 Flash Media Controller 1025 0064 Extensa 3000 series laptop 1025 0080 Aspire 5024WLMi 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 103c 308b MX6125 - 8034 PCI6411/6421/6611/6621/7411/7421/7611/7621 Secure Digital Controller + 8034 PCIxx21/PCIxx11 SD Host Controller 1025 0080 Aspire 5024WLMi 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 103c 308b MX6125 - 8035 PCI6411/6421/6611/6621/7411/7421/7611/7621 Smart Card Controller + 8035 PCIxx21/PCIxx11 Smart Card Controller 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 8036 PCI6515 Cardbus Controller 8038 PCI6515 SmartCard Controller @@ -5363,7 +5553,7 @@ 103c 30a1 NC2400 103c 30a3 Compaq nw8440 104d 902d VAIO VGN-NR120E - 803b 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD) + 803b PCIxx12 Flash Media Controller 103c 309f nx9420 103c 30a3 Compaq nw8440 104d 8212 VAIO VGN-N21E @@ -5392,6 +5582,7 @@ 1546 803c FWB-PCIE1X11B 8240 XIO2001 PCI Express-to-PCI Bridge 8241 TUSB73x0 SuperSpeed USB 3.0 xHCI Host Controller + 1014 04b2 S824 (8286-42A) 8400 ACX 100 22Mbps Wireless Interface 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus] 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter @@ -5535,6 +5726,22 @@ 90a3 Aeolia Memory (DDR3/SPM) 90a4 Aeolia USB 3.0 xHCI Host Controller 90bc SxS Pro+ memory card + 90c8 Belize ACPI + 90c9 Belize Ethernet Controller + 90ca Belize SATA AHCI Controller + 90cb Belize SD/MMC Host Controller + 90cc Belize PCI Express Glue and Miscellaneous Devices + 90cd Belize DMA Controller + 90ce Belize Memory (DDR3/SPM) + 90cf Belize USB 3.0 xHCI Host Controller + 90d7 Baikal ACPI + 90d8 Baikal Ethernet Controller + 90d9 Baikal SATA AHCI Controller + 90da Baikal SD/MMC Host Controller + 90db Baikal PCI Express Glue and Miscellaneous Devices + 90dc Baikal DMA Controller + 90dd Baikal Memory (DDR3/SPM) + 90de Baikal USB 3.0 xHCI Host Controller 104e Oak Technology, Inc 0017 OTI-64017 0107 OTI-107 [Spitfire] @@ -5941,7 +6148,10 @@ 0074 U4 HT Bridge # should be 14e4:1645 1645 Broadcom NetXtreme BCM5701 Gigabit Ethernet - 2001 PCI Express SSD + 2001 S1X NVMe Controller + 2002 S3ELab NVMe Controller + 2003 S3X NVMe Controller + 2005 ANS2 NVMe Controller 106c Hynix Semiconductor 8139 8139c 100BaseTX Ethernet Controller 8801 Dual Pentium ISA/PCI Motherboard @@ -6005,14 +6215,16 @@ 1077 e4f4 FastLinQ QL45411H 40GbE Adapter 1644 FastLinQ QL45000 Series 100GbE Controller 1077 e4f8 FastLinQ QL45611H 100GbE Adapter + 1654 FastLinQ QL45000 Series 50GbE Controller + 1590 0223 Synergy 6810C 25/50Gb Ethernet Adapter 1656 FastLinQ QL45000 Series 25GbE Controller 1077 02a7 QL45212-DE 25GbE Adapter 1077 e4f6 FastLinQ QL45211H 25GbE Adapter 1077 e4f7 FastLinQ QL45212H 25GbE Adapter - 165c FastLinQ QL45000 Series 40GbE Controller (FCoE) + 165c FastLinQ QL45000 Series 10/25/40/50GbE Controller (FCoE) 1077 e4f1 FastLinQ QL45462H 40GbE FCoE Adapter 1077 e4f2 FastLinQ QL45461H 40GbE FCoE Adapter - 165e FastLinQ QL45000 Series 40GbE Controller (iSCSI) + 165e FastLinQ QL45000 Series 10/25/40/50GbE Controller (iSCSI) 1077 e4f1 FastLinQ QL45462H 40GbE iSCSI Adapter 1077 e4f2 FastLinQ QL45461H 40GbE iSCSI Adapter 1664 FastLinQ QL45000 Series Gigabit Ethernet Controller (SR-IOV VF) @@ -6061,11 +6273,17 @@ 103c 12dd 4Gb Fibre Channel [AB429A] 2432 ISP2432-based 4Gb Fibre Channel to PCI Express HBA 103c 7040 FC1142SR 4Gb 1-port PCIe Fibre Channel Host Bus Adapter [HPAE311A] + 1077 0137 QLE2460 4 GB PCI-X Host-Bus-Adapter 2532 ISP2532-based 8Gb Fibre Channel to PCI Express HBA + 1014 041e FC EN0Y/EN12 PCIe2 LP 8 Gb 4-port Fibre Channel Adapter for POWER 103c 3262 StorageWorks 81Q 103c 3263 StorageWorks 82Q + 1077 015c QLE2560 PCI Express to 8Gb FC Single Channel + 1077 015d QLE2562 PCI Express to 8Gb FC Dual Channel + 1077 015e QLE2564 PCI Express to 8Gb FC Quad Channel 1077 0167 QME2572 Dual Port FC8 HBA Mezzanine 1590 00fc StoreFabric 84Q 8Gb Quad Port Fibre Channel Host Bus Adapter + 2971 ISP2684 3022 ISP4022-based Ethernet NIC 3032 ISP4032-based Ethernet IPv6 NIC 4010 ISP4010-based iSCSI TOE HBA @@ -6078,6 +6296,7 @@ 7322 IBA7322 QDR InfiniBand HCA 8000 10GbE Converged Network Adapter (TCP/IP Networking) 8001 10GbE Converged Network Adapter (FCoE) + 1014 03af FC 5708/5270 10 Gb FCoE PCIe Dual Port Adapter for POWER 8020 cLOM8214 1/10GbE Controller 1028 1f64 QMD8262-k 10G DP bNDC KR 103c 3346 CN1000Q Dual Port Converged Network Adapter @@ -6101,19 +6320,56 @@ 8031 8300 Series 10GbE Converged Network Adapter (FCoE) 8032 8300 Series 10GbE Converged Network Adapter (iSCSI) 8070 FastLinQ QL41000 Series 10/25/40/50GbE Controller + 1077 0001 10GE 2P QL41162HxRJ-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x1GE+2x10GE QL41264HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter 1077 0011 FastLinQ QL41212H 25GbE Adapter 1077 0012 FastLinQ QL41112H 10GbE Adapter + 1590 021d 10/25GbE 2P QL41222HLCU-HP Adapter + 1590 021e 10/25GbE 2P QL41162HMRJ-HP Adapter + 1590 021f 10/25GbE 2P QL41262HMCU-HP Adapter + 1590 0220 10/25GbE 2P QL41122HLRJ-HP Adapter 8080 FastLinQ QL41000 Series 10/25/40/50GbE Controller (FCoE) + 1077 0001 10GE 2P QL41162HxRJ-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x1GE+2x10GE QL41264HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000c QLogic 2x25GE QL41262HMCU CNA 1077 000d FastLinQ QL41262H 25GbE FCoE Adapter 1077 000e FastLinQ QL41162H 10GbE FCoE Adapter 8084 FastLinQ QL41000 Series 10/25/40/50GbE Controller (iSCSI) + 1077 0001 10GE 2P QL41162HxRJ-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x25GE QL41262HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000c QLogic 2x25GE QL41262HMCU CNA 1077 000d FastLinQ QL41262H 25GbE iSCSI Adapter 1077 000e FastLinQ QL41162H 10GbE iSCSI Adapter 8090 FastLinQ QL41000 Series Gigabit Ethernet Controller (SR-IOV VF) + 1077 0001 25GE 2P QL41262HxCU-DE Adapter + 1077 0002 10GE 2P QL41112HxCU-DE Adapter + 1077 0005 QLogic 4x10GE QL41164HMRJ CNA + 1077 0006 QLogic 4x10GE QL41164HMCU CNA + 1077 0007 QLogic 2x1GE+2x10GE QL41264HMCU CNA + 1077 0009 QLogic 2x1GE+2x10GE QL41162HMRJ CNA + 1077 000b 25GE 2P QL41262HxCU-DE Adapter + 1077 000c QLogic 2x25GE QL41262HMCU CNA 1077 000d FastLinQ QL41262H 25GbE FCoE Adapter (SR-IOV VF) 1077 000e FastLinQ QL41162H 10GbE iSCSI Adapter (SR-IOV VF) 1077 0011 FastLinQ QL41212H 25GbE Adapter (SR-IOV VF) 1077 0012 FastLinQ QL41112H 10GbE Adapter (SR-IOV VF) + 1590 021e 10/25GbE 2P QL41162HMRJ-HP Adapter + 1590 021f 10/25GbE 2P QL41262HMCU-HP Adapter 8430 ISP8324 1/10GbE Converged Network Controller (NIC VF) 8431 8300 Series 10GbE Converged Network Adapter (FCoE VF) 8432 ISP2432M-based 10GbE Converged Network Adapter (CNA) @@ -7570,6 +7826,7 @@ 1885 0701 Tsunami FPGA PMC with Altera Stratix S30 9733 PEX 9733 33-lane, 9-port PCI Express Gen 3 (8.0 GT/s) Switch 1d49 0001 ThinkSystem 1610-4P NVMe Switch Adapter + 1d49 0002 ThinkSystem 810-4P NVMe Switch Adapter 9749 PEX 9749 49-lane, 13-port PCI Express Gen 3 (8.0 GT/s) Switch a100 Blackmagic Design DeckLink bb04 B&B 3PCIOSD1A Isolated PCI Serial @@ -9090,6 +9347,7 @@ 0424 G86 [GeForce 8400 GS] 0425 G86M [GeForce 8600M GS] 1025 0121 Aspire 5920G + 1043 1514 F3SV 0426 G86M [GeForce 8400M GT] 0427 G86M [GeForce 8400M GS] 103c 30cc Pavilion dv6700 @@ -9154,19 +9412,19 @@ 0533 C67 [GeForce 7000M / nForce 610M] 053a C68 [GeForce 7050 PV / nForce 630a] 053b C68 [GeForce 7050 PV / nForce 630a] - 1043 8308 M2N68-AM Motherbord + 1043 8308 M2N68-AM Motherboard 053e C68 [GeForce 7025 / nForce 630a] 0541 MCP67 Memory Controller 0542 MCP67 SMBus - 1043 8308 M2N68-AM Motherbord + 1043 8308 M2N68-AM Motherboard 0543 MCP67 Co-processor 0547 MCP67 Memory Controller - 1043 8308 M2N68-AM Motherbord + 1043 8308 M2N68-AM Motherboard 1849 0547 ALiveNF7G-HDready 0548 MCP67 ISA Bridge 1043 8308 M2N68-AM Motherboard 054c MCP67 Ethernet - 1043 8308 M2N68-AM Motherbord + 1043 8308 M2N68-AM Motherboard 1849 054c ALiveNF7G-HDready, MCP67 Gigabit Ethernet 054d MCP67 Ethernet 054e MCP67 Ethernet @@ -9261,6 +9519,7 @@ 1682 2385 GeForce 9600 GSO 768mb 0611 G92 [GeForce 8800 GT] 107d 2ab0 Winfast PX8800 GT PCI-E + 1462 1170 NX8800GT series model V117 2xDVI+TV 19da 1040 ZT-88TES2P-FSP 0612 G92 [GeForce 9800 GTX / 9800 GTX+] 0613 G92 [GeForce 9800 GTX+] @@ -9856,7 +10115,7 @@ 0dc0 GF106 [GeForce GT 440] 0dc4 GF106 [GeForce GTS 450] 0dc5 GF106 [GeForce GTS 450 OEM] - 0dc6 GF106 [GeForce GTS 450] + 0dc6 GF106 [GeForce GTS 450 OEM] 0dcd GF106M [GeForce GT 555M] 0dce GF106M [GeForce GT 555M] 0dd1 GF106M [GeForce GTX 460M] @@ -9876,7 +10135,7 @@ 0de5 GF108 [GeForce GT 530] 0de7 GF108 [GeForce GT 610] 0de8 GF108M [GeForce GT 620M] - 0de9 GF108M [GeForce GT 630M] + 0de9 GF108M [GeForce GT 620M/630M/635M/640M LE] 1025 0692 GeForce GT 620M 1025 0725 GeForce GT 620M 1025 0728 GeForce GT 620M @@ -9941,6 +10200,8 @@ 0f02 GF108 [GeForce GT 730] 0f06 GF108 [GeForce GT 730] 0fb0 GM200 High Definition Audio + 0fb8 GP108 High Definition Audio Controller + 0fb9 GP107GL High Definition Audio Controller 0fbb GM204 High Definition Audio Controller 0fc0 GK107 [GeForce GT 640 OEM] 0fc1 GK107 [GeForce GT 640] @@ -10043,8 +10304,10 @@ 102a GK110BGL [Tesla K40t] 102d GK210GL [Tesla K80] 102e GK110BGL [Tesla K40d] + 102f GK110BGL [Tesla Stella Solo] 103a GK110GL [Quadro K6000] 103c GK110GL [Quadro K5200] + 103f GK110BGL [Tesla Stella SXM] 1040 GF119 [GeForce GT 520] 1043 83a0 ENGT520 SILENT 1042 GF119 [GeForce 510] @@ -10095,7 +10358,7 @@ 1086 GF110 [GeForce GTX 570 Rev. 2] 1087 GF110 [GeForce GTX 560 Ti 448 Cores] 1088 GF110 [GeForce GTX 590] - 1089 GF110 [GeForce GTX 580] + 1089 GF110 [GeForce GTX 580 Rev. 2] 108b GF110 [GeForce GTX 580] 108e GF110GL [Tesla C2090] 1091 GF110GL [Tesla M2090] @@ -10219,12 +10482,31 @@ 1028 065e GeForce 820M 1028 0662 GeForce 820M 1028 068d GeForce 820M + 1028 06ad GeForce 820M + 1028 06ae GeForce 820M + 1028 06af GeForce 820M + 1028 06b0 GeForce 820M + 1028 06c0 GeForce 820M 1028 06c1 GeForce 820M 103c 18ef GeForce GT 630M 103c 18f9 GeForce GT 630M 103c 18fb GeForce GT 630M 103c 18fd GeForce GT 630M 103c 18ff GeForce GT 630M + 103c 218a GeForce 820M + 103c 21bb GeForce 820M + 103c 21bc GeForce 820M + 103c 220e GeForce 820M + 103c 2210 GeForce 820M + 103c 2212 GeForce 820M + 103c 2214 GeForce 820M + 103c 2218 GeForce 820M + 103c 225b GeForce 820M + 103c 225d GeForce 820M + 103c 226d GeForce 820M + 103c 226f GeForce 820M + 103c 22d2 GeForce 820M + 103c 22d9 GeForce 820M 103c 2335 GeForce 820M 103c 2337 GeForce 820M 103c 2aef GeForce GT 720A @@ -10262,6 +10544,7 @@ 1043 228a GeForce 820M 1043 232a GeForce 820M 1043 233a GeForce 820M + 1043 235a GeForce 820M 1043 236a GeForce 820M 1043 238a GeForce 820M 1043 8595 GeForce GT 720M @@ -10277,6 +10560,8 @@ 1043 8643 GeForce 820M 1043 864c GeForce 820M 1043 8652 GeForce 820M + 1043 8660 GeForce 820M + 1043 8661 GeForce 820M 105b 0dac GeForce GT 720M 105b 0dad GeForce GT 720M 105b 0ef3 GeForce GT 720M @@ -10351,8 +10636,10 @@ 17aa 309c GeForce GT 720A 17aa 30b4 GeForce 820A 17aa 30b7 GeForce 720A + 17aa 30e4 GeForce 820A 17aa 361b GeForce 820A 17aa 361c GeForce 820A + 17aa 361d GeForce 820A 17aa 3656 GeForce GT 620M 17aa 365a GeForce 705M 17aa 365e GeForce 800M @@ -10474,6 +10761,7 @@ 11a3 GK104M [GeForce GTX 680MX] 106b 010d iMac 13,2 11a7 GK104M [GeForce GTX 675MX] + 11af GK104GLM [GRID IceCube] # GRID K2 Quadro USM 11b0 GK104GL [GRID K240Q\K260Q vGPU] 10de 101a GRID K240Q @@ -10562,10 +10850,10 @@ 1282 GK208 [GeForce GT 640 Rev. 2] 1284 GK208 [GeForce GT 630 Rev. 2] 1286 GK208 [GeForce GT 720] - 1287 GK208 [GeForce GT 730] - 1288 GK208 [GeForce GT 720] + 1287 GK208B [GeForce GT 730] + 1288 GK208B [GeForce GT 720] 1289 GK208 [GeForce GT 710] - 128b GK208 [GeForce GT 710B] + 128b GK208B [GeForce GT 710] 1290 GK208M [GeForce GT 730M] 103c 2afa GeForce GT 730A 103c 2b04 GeForce GT 730A @@ -10589,11 +10877,12 @@ 17aa 367c GeForce 710A 1296 GK208M [GeForce 825M] 1298 GK208M [GeForce GT 720M] - 1299 GK208M [GeForce 920M] + 1299 GK208BM [GeForce 920M] 17aa 30bb GeForce 920A + 17aa 30df GeForce 920A 17aa 36a7 GeForce 920A 17aa 36af GeForce 920M - 129a GK208M [GeForce 910M] + 129a GK208BM [GeForce 910M] 12a0 GK208 12b9 GK208GLM [Quadro K610M] 12ba GK208GLM [Quadro K510M] @@ -10610,10 +10899,12 @@ 1349 GM108M [GeForce 930M] 134b GM108M [GeForce 940MX] 134d GM108M [GeForce 940MX] + 17aa 2248 ThinkPad T570 134e GM108M [GeForce 930MX] 134f GM108M [GeForce 920MX] 137a GM108GLM [Quadro K620M / Quadro M500M] 17aa 505a Quadro M500M + 137b GM108GLM [Quadro M520 Mobile] 137d GM108M [GeForce 940A] 1380 GM107 [GeForce GTX 750 Ti] 1381 GM107 [GeForce GTX 750] @@ -10650,6 +10941,7 @@ 13bd GM107GL [Tesla M10] 10de 110a GRID M40 10de 1160 Tesla M10 + 10de 11d2 GRID M10-8Q 13c0 GM204 [GeForce GTX 980] 1043 8504 GTX980-4GD5 13c1 GM204 @@ -10658,11 +10950,17 @@ 13d7 GM204M [GeForce GTX 980M] 13d8 GM204M [GeForce GTX 970M] 13d9 GM204M [GeForce GTX 965M] - 13da GM204M [GeForce GTX 980] + 13da GM204M [GeForce GTX 980 Mobile] + 13e7 GM204GL [GeForce GTX 980 Engineering Sample] 13f0 GM204GL [Quadro M5000] 13f1 GM204GL [Quadro M4000] 13f2 GM204GL [Tesla M60] + 10de 114d GRID M60-1Q + 10de 114e GRID M60-2Q + 10de 1150 GRID M60-8Q + 10de 11b0 GRID M60-4A 13f3 GM204GL [Tesla M6] + 10de 1184 GRID M6-8Q 13f8 GM204GLM [Quadro M5000M / M5000 SE] 13f9 GM204GLM [Quadro M4000M] 13fa GM204GLM [Quadro M3000M] @@ -10670,7 +10968,7 @@ 13fb GM204GLM [Quadro M5500] 1401 GM206 [GeForce GTX 960] 1402 GM206 [GeForce GTX 950] - 1406 GM206 [GeForce GTX 960] + 1406 GM206 [GeForce GTX 960 OEM] 1407 GM206 [GeForce GTX 750 v2] 1427 GM206M [GeForce GTX 965M] 1430 GM206GL [Quadro M2000] @@ -10680,15 +10978,18 @@ 15f1 GP100GL 15f7 GP100GL [Tesla P100 PCIe 12GB] 15f8 GP100GL [Tesla P100 PCIe 16GB] - 15f9 GP100GL [Tesla P100 SMX2 16GB] + 15f9 GP100GL [Tesla P100 SXM2 16GB] 1617 GM204M [GeForce GTX 980M] 1618 GM204M [GeForce GTX 970M] 1619 GM204M [GeForce GTX 965M] - 161a GM204M [GeForce GTX 980] + 161a GM204M [GeForce GTX 980 Mobile] 1667 GM204M [GeForce GTX 965M] 1725 GP100 172e GP100 172f GP100 + 174d GM108M [GeForce MX130] + 174e GM108M [GeForce MX110] + 1789 GM107GL [GRID M3-3020] 17c2 GM200 [GeForce GTX TITAN X] 17c8 GM200 [GeForce GTX 980 Ti] 17f0 GM200GL [Quadro M6000] @@ -10696,6 +10997,7 @@ 17fd GM200GL [Tesla M40] 1b00 GP102 [TITAN X] 1b01 GP102 + 1b02 GP102 [TITAN Xp] 1b06 GP102 [GeForce GTX 1080 Ti] 1b30 GP102GL [Quadro P6000] 1b38 GP102GL [Tesla P40] @@ -10703,28 +11005,47 @@ 1b78 GP102GL 1b80 GP104 [GeForce GTX 1080] 1b81 GP104 [GeForce GTX 1070] - 1b82 GP104 + 1b82 GP104 [GeForce GTX 1070 Ti] 1b83 GP104 1b84 GP104 [GeForce GTX 1060 3GB] + 1b87 GP104 [P104-100] 1ba0 GP104M [GeForce GTX 1080 Mobile] 1ba1 GP104M [GeForce GTX 1070 Mobile] + 1458 1651 GeForce GTX 1070 Max-Q + 1462 11e8 GeForce GTX 1070 Max-Q + 1462 11e9 GeForce GTX 1070 Max-Q + 1558 9501 GeForce GTX 1070 Max-Q + 1bad GP104 [GeForce GTX 1070 Engineering Sample] 1bb0 GP104GL [Quadro P5000] 1bb1 GP104GL [Quadro P4000] 1bb3 GP104GL [Tesla P4] - 1bb4 GP104GL + 1bb4 GP104GL [Tesla P6] + 1bb5 GP104GLM [Quadro P5200 Mobile] 1bb6 GP104GLM [Quadro P5000 Mobile] 1bb7 GP104GLM [Quadro P4000 Mobile] + 1462 11e9 Quadro P4000 Max-Q 1bb8 GP104GLM [Quadro P3000 Mobile] + 1bc7 GP104 [P104-101] 1be0 GP104M [GeForce GTX 1080 Mobile] + 1028 07c0 GeForce GTX 1080 Max-Q + 1458 355b GeForce GTX 1080 Max-Q 1be1 GP104M [GeForce GTX 1070 Mobile] 1c00 GP106 1c01 GP106 1c02 GP106 [GeForce GTX 1060 3GB] 1c03 GP106 [GeForce GTX 1060 6GB] + 1c04 GP106 [GeForce GTX 1060 5GB] + 1c06 GP106 [GeForce GTX 1060 6GB Rev. 2] + 1c07 GP106 [P106-100] + 1c09 GP106 [P106-090] 1c20 GP106M [GeForce GTX 1060 Mobile] + 17aa 39b9 GeForce GTX 1060 Max-Q 3GB + 1c21 GP106M [GeForce GTX 1050 Ti Mobile] + 1c22 GP106M [GeForce GTX 1050 Mobile] 1c30 GP106GL [Quadro P2000] 1c35 GP106 - 1c60 GP106M [GeForce GTX 1060 Mobile] + 1c60 GP106M [GeForce GTX 1060 Mobile 6GB] + 103c 8390 GeForce GTX 1060 Max-Q 6GB 1c61 GP106M [GeForce GTX 1050 Ti Mobile] 1c62 GP106M [GeForce GTX 1050 Mobile] 1c70 GP106GL @@ -10737,11 +11058,16 @@ 1ca7 GP107GL 1ca8 GP107GL 1caa GP107GL - 1cb1 GP107GL [Quardo P1000] - 1cb2 GP107GL [Quardo P600] - 1cb3 GP107GL [Quardo P400] - 1d01 GP108 - 1d81 GV100 + 1cb1 GP107GL [Quadro P1000] + 1cb2 GP107GL [Quadro P600] + 1cb3 GP107GL [Quadro P400] + 1cb6 GP107GL [Quadro P620] + 1d01 GP108 [GeForce GT 1030] + 1d10 GP108M [GeForce MX150] + 1d33 GP108GL [Quadro P500] + 1d81 GV100 [TITAN V] + 1db1 GV100 [Tesla V100 SXM2] + 1db4 GV100 [Tesla V100 PCIe] 10df Emulex Corporation 0720 OneConnect NIC (Skyhawk) 103c 1934 FlexFabric 20Gb 2-port 650M Adapter @@ -10749,6 +11075,7 @@ 103c 21d4 StoreFabric CN1200E 10Gb Converged Network Adapter 103c 220a FlexFabric 10Gb 2-port 556FLR-SFP+ Adapter 103c 803f Ethernet 10Gb 2-port 557SFP+ Adapter + 103c 8144 FlexFabric 10GB 2-port 556FLR-T Adapter 17aa 1056 ThinkServer OCm14102-UX-L AnyFabric 17aa 1057 ThinkServer OCm14104-UX-L AnyFabric 17aa 1059 ThinkServer OCm14104-UT-L AnyFabric @@ -10764,7 +11091,9 @@ e100 Proteus-X: LightPulse IOV Fibre Channel Host Adapter e131 LightPulse 8Gb/s PCIe Shared I/O Fibre Channel Adapter e180 Proteus-X: LightPulse IOV Fibre Channel Host Adapter - e200 Lancer-X: LightPulse Fibre Channel Host Adapter + e200 LightPulse LPe16002 + 1014 03f1 PCIe2 16 Gb 2-port Fibre Channel Adapter (FC EL5B; CCIN 577F) + 10df e282 Flex System FC5054 4-port 16Gb FC Adapter e208 LightPulse 16Gb Fibre Channel Host Adapter (Lancer-VF) e220 OneConnect NIC (Lancer) 17aa 1054 ThinkServer LPm16002B-M6-L AnyFabric @@ -10776,6 +11105,9 @@ 10df e310 Lancer Gen6: LPe31000 Fibre Channel Host Adapter 10df e311 Lancer Gen6: LPe31000 Fibre Channel Host Adapter 10df e312 Lancer Gen6: LPe31000 Fibre Channel Host Adapter + 10df e322 Lancer Gen6: LPe31000 Fibre Channel Host Adapter + 10df e323 Lancer Gen6: LPe31000 Fibre Channel Host Adapter + 10df e325 Lancer Gen6: LPe31000 Fibre Channel Host Adapter f011 Saturn: LightPulse Fibre Channel Host Adapter f015 Saturn: LightPulse Fibre Channel Host Adapter f085 LP850 Fibre Channel Host Adapter @@ -10790,10 +11122,14 @@ f0e5 Zephyr LightPulse Fibre Channel Host Adapter f0f5 Neptune LightPulse Fibre Channel Host Adapter f100 Saturn-X: LightPulse Fibre Channel Host Adapter + 1014 038a 8Gb PCI Express Dual Port FC Adapter for POWER 103c 3282 8Gb Dual-port PCI-e FC HBA f111 Saturn-X LightPulse Fibre Channel Host Adapter f112 Saturn-X LightPulse Fibre Channel Host Adapter f180 LPSe12002 EmulexSecure Fibre Channel Adapter + f400 LPe36000 Fibre Channel Host Adapter [Prism] + 10df f401 LPe35000 Fibre Channel Host Adapter [Prism] + 10df f402 LPe35000 Fibre Channel Host Adapter [Prism] f700 LP7000 Fibre Channel Host Adapter f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) f800 LP8000 Fibre Channel Host Adapter @@ -10812,6 +11148,8 @@ fc40 Saturn-X: LightPulse Fibre Channel Host Adapter fc50 Proteus-X: LightPulse IOV Fibre Channel Host Adapter fd00 Helios-X LightPulse Fibre Channel Host Adapter +# Also IBM FC 5759 / FC 1910 for POWER + 10df fd02 LightPulse LP11002 Dual-port 4Gigabit PCI Fibre Channel Adapter fd11 Helios-X LightPulse Fibre Channel Host Adapter fd12 Helios-X LightPulse Fibre Channel Host Adapter fe00 Zephyr-X LightPulse Fibre Channel Host Adapter @@ -10907,12 +11245,14 @@ 1025 0813 Aspire R7-571 103c 194e ProBook 455 G1 Notebook 103c 1985 Pavilion 17-e163sg Notebook PC + 17aa 3832 Yoga 520 522a RTS522A PCI Express Card Reader 5249 RTS5249 PCI Express Card Reader 103c 1909 ZBook 15 524a RTS524A PCI Express Card Reader 5250 RTS5250 PCI Express Card Reader 525a RTS525A PCI Express Card Reader + 17aa 224f ThinkPad X1 Carbon 5th Gen 5286 RTS5286 PCI Express Card Reader 5287 RTL8411B PCI Express Card Reader 5288 RTS5288 PCI Express Card Reader @@ -10928,13 +11268,14 @@ 8129 RTL-8129 10ec 8129 RT8129 Fast Ethernet Adapter 11ec 8129 RTL8111/8168 PCIe Gigabit Ethernet (misconfigured) - 8136 RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller - 103c 1985 Pavilion 17-e163sg Notebook PC + 8136 RTL810xE PCI Express Fast Ethernet controller + 103c 1985 RTL8106E on Pavilion 17-e163sg Notebook PC 103c 2a8c Compaq 500B Microtower 103c 2ab1 Pavilion p6774 103c 30cc Pavilion dv6700 1179 ff64 RTL8102E PCI-E Fast Ethernet NIC 17c0 1053 RTL8101e Medion WIM 2210 Notebook PC [MD96850] + 8137 RTL8104E PCIe Fast Ethernet Controller 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter 8139 RTL-8100/8101L/8139 PCI Fast Ethernet Adapter @@ -10989,6 +11330,7 @@ 8e2e 7100 KF-230TX/2 a0a0 0007 ALN-325C 8167 RTL-8110SC/8169SC Gigabit Ethernet + 105b 0e10 RTL-8110SC-GR on a N15235/A74MX mainboard 1458 e000 GA-MA69G-S3H Motherboard 1462 235c P965 Neo MS-7235 mainboard 1462 236c 945P Neo3-F motherboard @@ -11012,12 +11354,14 @@ 144d c652 RTL8168 on a NP300E5C series laptop 1458 e000 Onboard Ethernet 1462 238c Onboard RTL8111b on MSI P965 Platinum Mainboard + 1462 345c RTL8111B on MS-7345 Motherboard 1462 368c K9AG Neo2 1462 4180 Wind PC MS-7418 1462 7522 X58 Pro-E 1775 11cc CC11/CL11 1849 8168 Motherboard (one of many) 7470 3468 TG-3468 Gigabit PCI Express Network Adapter + 8086 2055 NUC Kit DN2820FYKH 8086 d615 Desktop Board D510MO/D525MW 8169 RTL8169 PCI Gigabit Ethernet Controller 1025 0079 Aspire 5024WLMi @@ -11065,6 +11409,7 @@ 8821 RTL8821AE 802.11ac PCIe Wireless Network Adapter b723 RTL8723BE PCIe Wireless Network Adapter 10ec 8739 Dell Wireless 1801 + c821 RTL8821CE 802.11ac PCIe Wireless Network Adapter 10ed Ascii Corporation 7310 V7310 10ee Xilinx Corporation @@ -12367,6 +12712,8 @@ 1131 4f61 Activy DVB-S Budget Rev GR 1131 5f61 Activy DVB-T Budget 114b 2003 DVRaptor Video Edit/Capture Card + 1159 0040 MuTech M-Vision 500 (MV-500 rev. E) + 1159 0050 MuTech M-Vision 500 (MV-500 rev. F) 11bd 0006 DV500 Overlay 11bd 000a DV500 Overlay 11bd 000f DV500 Overlay @@ -12823,7 +13170,7 @@ 3011 Tokenet/vg 1001/10m anylan 9050 Lanfleet/Truevalue 9051 Lanfleet/Truevalue -1159 Mutech Corp +1159 MuTech Corporation 0001 MV-1000 0002 MV-1500 115a Harlequin Ltd @@ -12991,6 +13338,7 @@ 1179 Toshiba America Info Systems 0102 Extended IDE Controller 0103 EX-IDE Type-B + 010f NVMe Controller 0404 DVD Decoder card 0406 Tecra Video Capture device 0407 DVD Decoder card (Version 2) @@ -13053,7 +13401,7 @@ 144d c00c P30/P35 notebook 14ef 0220 PCD-RP-220S 17aa 201c ThinkPad X60/X60s - 17aa 20c4 ThinkPad T61 + 17aa 20c4 ThinkPad T61/R61 17aa 20c6 ThinkPad R61 0477 RL5c477 0478 RL5c478 @@ -13119,6 +13467,7 @@ 103c 30c1 Compaq 6910p 103c 30cc Pavilion dv6700 103c 30cf Pavilion dv9668eg Laptop + 17aa 20c5 ThinkPad R61 17aa 20c7 ThinkPad R61 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394 0843 R5C843 MMC Host Controller @@ -13149,9 +13498,11 @@ 1028 040a Latitude E6410 1028 040b Latitude E6510 e823 PCIe SDXC/MMC Host Controller + 17aa 21cf ThinkPad T520 e832 R5C832 PCIe IEEE 1394 Controller 1028 040a Latitude E6410 1028 040b Latitude E6510 + 17aa 21cf ThinkPad T520 e852 PCIe xD-Picture Card Controller 1181 Telmatics International 1183 Fujikura Ltd @@ -13478,8 +13829,9 @@ 6081 MV88SX6081 8-port SATA II PCI-X Controller 6101 88SE6101/6102 single-port PATA133 interface 1043 82e0 P5K PRO Motherboard - 6111 88SE6111 1-port PATA133(IDE) and 1-port SATA II Controllers - 6121 88SE6121 SATA II / PATA Controller + 6121 88SE6111/6121 SATA II / PATA Controller +# 6111: 1 SATA port; 6121: 2 SATA ports + 11ab 6121 88SE6111/6121 1/2 port SATA II + 1 port PATA Controller 6141 88SE614x SATA II PCI-E controller 6145 88SE6145 SATA II PCI-E controller 6180 88F6180 [Kirkwood] ARM SoC @@ -13825,41 +14177,70 @@ 11fc Silicon Magic 11fd High Street Consultants 11fe Comtrol Corporation - 0001 RocketPort 32 port w/external I/F - 0002 RocketPort 8 port w/external I/F - 0003 RocketPort 16 port w/external I/F - 0004 RocketPort 4 port w/quad cable - 0005 RocketPort 8 port w/octa cable - 0006 RocketPort 8 port w/RJ11 connectors - 0007 RocketPort 4 port w/RJ11 connectors - 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector - 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector - 000a RocketPort Plus 4 port - 000b RocketPort Plus 8 port - 000c RocketModem 6 port + 0001 RocketPort PCI 32-port w/external I/F + 0002 RocketPort PCI 8-port w/external I/F + 0003 RocketPort PCI 16-port w/external I/F + 0004 RocketPort PCI 4-port w/Quad Cable + 0005 RocketPort PCI 8-port w/Octa Cable + 0006 RocketPort PCI 8-port w/RJ11 connectors + 0007 RocketPort PCI 4-port w/RJ45 connectors + 0008 RocketPort PCI 8-port w/DB78 SNI connector (Siemens) + 0009 RocketPort PCI 16-port w/DB78 SNI connector (Siemens) + 000a RocketPort PCI Plus 4-port w/Quad Cable + 000b RocketPort PCI Plus 8-port w/Octa Cable + 000c RocketModem II 6-port 000d RocketModem 4-port - 000e RocketPort Plus 2 port RS232 - 000f RocketPort Plus 2 port RS422 - 0040 RocketPort Infinity Octa, 8port, RJ45 - 0041 RocketPort Infinity 32port, External Interface - 0042 RocketPort Infinity 8port, External Interface - 0043 RocketPort Infinity 16port, External Interface - 0044 RocketPort Infinity Quad, 4port, DB - 0045 RocketPort Infinity Octa, 8port, DB - 0047 RocketPort Infinity 4port, RJ45 - 004f RocketPort Infinity 2port, SMPTE - 0052 RocketPort Infinity Octa, 8port, SMPTE - 0801 RocketPort UPCI 32 port w/external I/F - 0802 RocketPort UPCI 8 port w/external I/F - 0803 RocketPort UPCI 16 port w/external I/F - 0805 RocketPort UPCI 8 port w/octa cable - 080c RocketModem III 8 port - 080d RocketModem III 4 port - 0810 RocketPort UPCI Plus 4 port RS232 - 0811 RocketPort UPCI Plus 8 port RS232 - 0812 RocketPort UPCI Plus 8 port RS422 + 000e RocketPort PCI Plus 2-port RS-232 w/DB9 connectors + 000f RocketPort PCI Plus 2-port SMPTE w/DB9 connectors + 0040 RocketPort INFINITY 8-port w/Octa Cable RJ45 + 0041 RocketPort INFINITY 32-port w/external I/F + 0042 RocketPort INFINITY 8-port w/external I/F + 0043 RocketPort INFINITY 16-port w/external I/F + 0044 RocketPort INFINITY 4-port w/Quad Cable DB + 0045 RocketPort INFINITY 8-port w/Octa Cable DB + 0046 RocketPort INFINITY 4-port w/external I/F + 0047 RocketPort INFINITY 4J (4-port) w/RJ45 connectors + 0048 RocketPort INFINITY 4J (4-port) w/RJ45 connectors + 004a RocketPort INFINITY Plus 4-port + 004b RocketPort INFINITY Plus 8-port + 004c RocketModem INFINITY III 8-port + 004d RocketModem INFINITY III 4-port + 004e RocketPort INFINITY Plus 2-port + 004f RocketPort INFINITY 2-port SMPTE w/DB9 connectors + 0050 RocketPort INFINITY Plus 4-port RJ45 + 0051 RocketPort INFINITY Plus 8-port RJ11 + 0052 RocketPort INFINITY 8-port SMPTE w/DB9 Connectors + 0060 RocketPort EXPRESS 8-port w/Octa Cable + 0061 RocketPort EXPRESS 32-port w/external I/F + 0062 RocketPort EXPRESS 8-Port w/external I/F + 0063 RocketPort EXPRESS 16-port w/external I/F + 0064 RocketPort EXPRESS 4-port w/Quad Cable + 0065 RocketPort EXPRESS 8-port w/Octa Cable + 0066 RocketPort EXPRESS 4-port w/external I/F + 0067 RocketPort EXPRESS 4J (4-port) w/RJ45 connectors + 0068 RocketPort EXPRESS 8J (8-port) w/RJ11 connectors + 006f RocketPort EXPRESS SMPTE 2-port + 0072 RocketPort EXPRESS SMPTE 8-port w/external I/F + 0801 RocketPort uPCI 32-port w/external I/F + 0802 RocketPort uPCI 8-port w/external I/F + 0803 RocketPort uPCI 16-port w/external I/F + 0805 RocketPort uPCI 8-port w/Octa Cable + 080b RocketPort Plus uPCI 8-port w/Octa Cable + 080c RocketModem III 8-port + 080d RocketModem III 4-port + 080e RocketPort uPCI 2-port RS232 w/DB9 connectors + 080f RocketPort uPCI SMPTE 2-port + 0810 RocketPort Plus uPCI 4J (4-port) w/RJ45 connectors + 0811 RocketPort Plus uPCI 8J (8-port) w/RJ11 connectors + 0812 RocketPort Plus uPCI 422 8-port + 0813 RocketModem IV uPCI 8-port + 0814 RocketModem IV uPCI 4-port 0903 RocketPort Compact PCI 16 port w/external I/F - 8015 RocketPort 4-port UART 16954 +# 16954 UART + 8015 RocketPort 550 4-port + 8805 RocketPort uPCI 4-port w/Quad Cable + 880b RocketPort Plus uPCI 4-port w/Quad Cable + 8812 RocketPort Plus uPCI 4-port RS422 w/Quad Cable 11ff Scion Corporation 0003 AG-5 1200 CSS Corporation @@ -14760,7 +15141,8 @@ 12d6 Analogic Corp 12d7 Biotronic SRL 12d8 Pericom Semiconductor - 01a7 PI7C21P100 PCI to PCI Bridge + 01a7 7C21P100 2-port PCI-X to PCI-X Bridge + 2608 PI7C9X2G608GP PCIe2 6-Port/8-Lane Packet Switch 400a PI7C9X442SL PCI Express Bridge Port 400e PI7C9X442SL USB OHCI Controller 400f PI7C9X442SL USB EHCI Controller @@ -15068,6 +15450,8 @@ 5160 RealSSD P420h 5161 RealSSD P420m 5163 RealSSD P425m + 5180 9100 PRO NVMe SSD + 5181 9100 MAX NVMe SSD 1345 Arescom Inc 1347 Odetics 1349 Sumitomo Electric Industries, Ltd. @@ -15113,7 +15497,7 @@ 0040 QSC-200/300 0050 ESC-100D 0060 ESC-100M - 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230) + 00f0 MPAC-100 Synchronous Serial Card (Zilog 85230) 0170 QSCLP-100 0180 DSCLP-100 0190 SSCLP-100 @@ -15148,7 +15532,7 @@ 0206 GPS180PEX GPS Receiver (PCI Express) 0207 GLN180PEX GPS/GLONASS receiver (PCI Express) 0208 GPS180AMC GPS Receiver (PCI Express / MicroTCA / AdvancedMC) - 0209 GRC181PEX GPS/GLONASS/BEIDOU receiver (PCI Express) + 0209 GNS181PEX GPS/Galileo/GLONASS/BEIDOU receiver (PCI Express) 0301 TCR510PCI IRIG Timecode Reader 0302 TCR167PCI IRIG Timecode Reader 0303 TCR511PCI IRIG Timecode Reader @@ -15275,9 +15659,9 @@ 1392 Medialight Inc 1393 Moxa Technologies Co Ltd 0001 UC7000 Serial - 1020 CP102 (2-port RS-232 PCI) - 1021 CP102UL (2-port RS-232 Universal PCI) - 1022 CP102U (2-port RS-232 Universal PCI) + 1020 CP-102 (2-port RS-232 PCI) + 1021 CP-102UL (2-port RS-232 Universal PCI) + 1022 CP-102U (2-port RS-232 Universal PCI) 1023 CP-102UF 1024 CP-102E (2-port RS-232 Smart PCI Express Serial Board) 1025 CP-102EL (2-port RS-232 Smart PCI Express Serial Board) @@ -15304,7 +15688,7 @@ 1380 CP138U (8-port RS-232/422/485 Smart Universal PCI) 1680 Smartio C168H/PCI 1681 CP-168U V2 Smart Serial Board (8-port RS-232) - 1682 CP168EL (8-port RS-232 Smart PCI Express) + 1682 CP-168EL (8-port RS-232 Smart PCI Express) 1683 CP-168EL-A (8-port RS-232 PCI Express Serial Board) 2040 Intellio CP-204J 2180 Intellio C218 Turbo PCI @@ -15419,6 +15803,7 @@ 0252 XR17V252 Dual UART PCI controller 0254 XR17V254 Quad UART PCI controller 0258 XR17V258 Octal UART PCI controller + 0352 XR17V3521 Dual PCIe UART 13a9 Siemens Medical Systems, Ultrasound Group 13aa Broadband Networks Inc 13ab Arcom Control Systems Ltd @@ -15582,6 +15967,7 @@ 1043 838e Virtuoso 66 (Xonar DS) 1043 8428 Virtuoso 100 (Xonar Xense) 1043 8467 CMI8786 (Xonar DG) + 1043 8521 CMI8786 (Xonar DGX) 1043 85f4 Virtuoso 100 (Xonar Essence STX II) 13f6 8782 PCI 2.0 HD Audio 13f6 ffff CMI8787-HG2PCI @@ -16017,6 +16403,7 @@ 4887 T440T-4087 Unified Wire Ethernet Controller [VF] 4888 T440-4088 Unified Wire Ethernet Controller [VF] 5001 T520-CR Unified Wire Ethernet Controller + 193d 1001 510F-B 5002 T522-CR Unified Wire Ethernet Controller 5003 T540-CR Unified Wire Ethernet Controller 5004 T520-BCH Unified Wire Ethernet Controller @@ -16067,6 +16454,18 @@ 509e T520-509E Unified Wire Ethernet Controller 509f T540-509F Unified Wire Ethernet Controller 50a0 T540-50A0 Unified Wire Ethernet Controller + 50a1 T540-50A1 Unified Wire Ethernet Controller + 50a2 T580-50A2 Unified Wire Ethernet Controller + 50a3 T580-50A3 Unified Wire Ethernet Controller + 50a4 T540-50A4 Unified Wire Ethernet Controller + 50a5 T522-50A5 Unified Wire Ethernet Controller + 50a6 T522-50A6 Unified Wire Ethernet Controller + 50a7 T580-50A7 Unified Wire Ethernet Controller + 50a8 T580-50A8 Unified Wire Ethernet Controller + 50a9 T580-50A9 Unified Wire Ethernet Controller + 50aa T580-50AA Unified Wire Ethernet Controller + 50ab T520-50AB Unified Wire Ethernet Controller + 50ac T540-50AC Unified Wire Ethernet Controller 5401 T520-CR Unified Wire Ethernet Controller 5402 T522-CR Unified Wire Ethernet Controller 5403 T540-CR Unified Wire Ethernet Controller @@ -16118,6 +16517,18 @@ 549e T520-509E Unified Wire Ethernet Controller 549f T540-509F Unified Wire Ethernet Controller 54a0 T540-50A0 Unified Wire Ethernet Controller + 54a1 T540-50A1 Unified Wire Ethernet Controller + 54a2 T580-50A2 Unified Wire Ethernet Controller + 54a3 T580-50A3 Unified Wire Ethernet Controller + 54a4 T540-50A4 Unified Wire Ethernet Controller + 54a5 T522-50A5 Unified Wire Ethernet Controller + 54a6 T522-50A6 Unified Wire Ethernet Controller + 54a7 T580-50A7 Unified Wire Ethernet Controller + 54a8 T580-50A8 Unified Wire Ethernet Controller + 54a9 T580-50A9 Unified Wire Ethernet Controller + 54aa T580-50AA Unified Wire Ethernet Controller + 54ab T520-50AB Unified Wire Ethernet Controller + 54ac T540-50AC Unified Wire Ethernet Controller 5501 T520-CR Unified Wire Storage Controller 5502 T522-CR Unified Wire Storage Controller 5503 T540-CR Unified Wire Storage Controller @@ -16169,6 +16580,18 @@ 559e T520-509E Unified Wire Storage Controller 559f T540-509F Unified Wire Storage Controller 55a0 T540-50A0 Unified Wire Storage Controller + 55a1 T540-50A1 Unified Wire Storage Controller + 55a2 T580-50A2 Unified Wire Storage Controller + 55a3 T580-50A3 Unified Wire Storage Controller + 55a4 T540-50A4 Unified Wire Storage Controller + 55a5 T522-50A5 Unified Wire Storage Controller + 55a6 T522-50A6 Unified Wire Storage Controller + 55a7 T580-50A7 Unified Wire Storage Controller + 55a8 T580-50A8 Unified Wire Storage Controller + 55a9 T580-50A9 Unified Wire Storage Controller + 55aa T580-50AA Unified Wire Storage Controller + 55ab T520-50AB Unified Wire Storage Controller + 55ac T540-50AC Unified Wire Storage Controller 5601 T520-CR Unified Wire Storage Controller 5602 T522-CR Unified Wire Storage Controller 5603 T540-CR Unified Wire Storage Controller @@ -16220,6 +16643,18 @@ 569e T520-509E Unified Wire Storage Controller 569f T540-509F Unified Wire Storage Controller 56a0 T540-50A0 Unified Wire Storage Controller + 56a1 T540-50A1 Unified Wire Storage Controller + 56a2 T580-50A2 Unified Wire Storage Controller + 56a3 T580-50A3 Unified Wire Storage Controller + 56a4 T540-50A4 Unified Wire Storage Controller + 56a5 T522-50A5 Unified Wire Storage Controller + 56a6 T522-50A6 Unified Wire Storage Controller + 56a7 T580-50A7 Unified Wire Storage Controller + 56a8 T580-50A8 Unified Wire Storage Controller + 56a9 T580-50A9 Unified Wire Storage Controller + 56aa T580-50AA Unified Wire Storage Controller + 56ab T520-50AB Unified Wire Storage Controller + 56ac T540-50AC Unified Wire Storage Controller 5701 T520-CR Unified Wire Ethernet Controller 5702 T522-CR Unified Wire Ethernet Controller 5703 T540-CR Unified Wire Ethernet Controller @@ -16310,6 +16745,18 @@ 589e T520-509E Unified Wire Ethernet Controller [VF] 589f T540-509F Unified Wire Ethernet Controller [VF] 58a0 T540-50A0 Unified Wire Ethernet Controller [VF] + 58a1 T540-50A1 Unified Wire Ethernet Controller [VF] + 58a2 T580-50A2 Unified Wire Ethernet Controller [VF] + 58a3 T580-50A3 Unified Wire Ethernet Controller [VF] + 58a4 T540-50A4 Unified Wire Ethernet Controller [VF] + 58a5 T522-50A5 Unified Wire Ethernet Controller [VF] + 58a6 T522-50A6 Unified Wire Ethernet Controller [VF] + 58a7 T580-50A7 Unified Wire Ethernet Controller [VF] + 58a8 T580-50A8 Unified Wire Ethernet Controller [VF] + 58a9 T580-50A9 Unified Wire Ethernet Controller [VF] + 58aa T580-50AA Unified Wire Ethernet Controller [VF] + 58ab T520-50AB Unified Wire Ethernet Controller [VF] + 58ac T540-50AC Unified Wire Ethernet Controller [VF] 6001 T6225-CR Unified Wire Ethernet Controller 6002 T6225-SO-CR Unified Wire Ethernet Controller 6003 T6425-CR Unified Wire Ethernet Controller @@ -16325,6 +16772,12 @@ 6015 T6201-BT Unified Wire Ethernet Controller 6080 T6225-6080 Unified Wire Ethernet Controller 6081 T62100-6081 Unified Wire Ethernet Controller + 6082 T6225-6082 Unified Wire Ethernet Controller + 6083 T62100-6083 Unified Wire Ethernet Controller + 6084 T64100-6084 Unified Wire Ethernet Controller + 6085 T6240-6085 Unified Wire Ethernet Controller + 6086 T6225-6086 Unified Wire Ethernet Controller + 6087 T6225-6087 Unified Wire Ethernet Controller 6401 T6225-CR Unified Wire Ethernet Controller 6402 T6225-SO-CR Unified Wire Ethernet Controller 6403 T6425-CR Unified Wire Ethernet Controller @@ -16340,6 +16793,12 @@ 6415 T6201-BT Unified Wire Ethernet Controller 6480 T6225-6080 Unified Wire Ethernet Controller 6481 T62100-6081 Unified Wire Ethernet Controller + 6482 T6225-6082 Unified Wire Ethernet Controller + 6483 T62100-6083 Unified Wire Ethernet Controller + 6484 T64100-6084 Unified Wire Ethernet Controller + 6485 T6240-6085 Unified Wire Ethernet Controller + 6486 T6225-6086 Unified Wire Ethernet Controller + 6487 T6225-6087 Unified Wire Ethernet Controller 6501 T6225-CR Unified Wire Storage Controller 6502 T6225-SO-CR Unified Wire Storage Controller 6503 T6425-CR Unified Wire Storage Controller @@ -16355,6 +16814,12 @@ 6515 T6201-BT Unified Wire Storage Controller 6580 T6225-6080 Unified Wire Storage Controller 6581 T62100-6081 Unified Wire Storage Controller + 6582 T6225-6082 Unified Wire Storage Controller + 6583 T62100-6083 Unified Wire Storage Controller + 6584 T64100-6084 Unified Wire Storage Controller + 6585 T6240-6085 Unified Wire Storage Controller + 6586 T6225-6086 Unified Wire Storage Controller + 6587 T6225-6087 Unified Wire Storage Controller 6601 T6225-CR Unified Wire Storage Controller 6602 T6225-SO-CR Unified Wire Storage Controller 6603 T6425-CR Unified Wire Storage Controller @@ -16370,6 +16835,12 @@ 6615 T6201-BT Unified Wire Storage Controller 6680 T6225-6080 Unified Wire Storage Controller 6681 T62100-6081 Unified Wire Storage Controller + 6682 T6225-6082 Unified Wire Storage Controller + 6683 T62100-6083 Unified Wire Storage Controller + 6684 T64100-6084 Unified Wire Storage Controller + 6685 T6240-6085 Unified Wire Storage Controller + 6686 T6225-6086 Unified Wire Storage Controller + 6687 T6225-6087 Unified Wire Storage Controller 6801 T6225-CR Unified Wire Ethernet Controller [VF] 6802 T6225-SO-CR Unified Wire Ethernet Controller [VF] 6803 T6425-CR Unified Wire Ethernet Controller [VF] @@ -16385,6 +16856,12 @@ 6815 T6201-BT Unified Wire Ethernet Controller [VF] 6880 T6225-6080 Unified Wire Ethernet Controller [VF] 6881 T62100-6081 Unified Wire Ethernet Controller [VF] + 6882 T6225-6082 Unified Wire Ethernet Controller [VF] + 6883 T62100-6083 Unified Wire Ethernet Controller [VF] + 6884 T64100-6084 Unified Wire Ethernet Controller [VF] + 6885 T6240-6085 Unified Wire Ethernet Controller [VF] + 6886 T6225-6086 Unified Wire Ethernet Controller [VF] + 6887 T6225-6087 Unified Wire Ethernet Controller [VF] a000 PE10K Unified Wire Ethernet Controller 1426 Storage Technology Corp. 1427 Better On-Line Solutions @@ -16477,6 +16954,7 @@ a822 NVMe SSD Controller 172Xa 1014 0621 PCIe3 1.6TB NVMe Flash Adapter II x8 1014 0622 PCIe3 3.2TB NVMe Flash Adapter II x8 + 1014 0629 PCIe3 6.4TB NVMe Flash Adapter II x8 1028 1fd9 Express Flash PM1725a 800GB SFF 1028 1fda Express Flash PM1725a 1.6TB SFF 1028 1fdb Express Flash PM1725a 3.2TB SFF @@ -16510,6 +16988,7 @@ e836 M115S Hybrid Analog/DVB PAL/SECAM/NTSC Tuner f436 AVerTV Hybrid+FM 1462 Micro-Star International Co., Ltd. [MSI] + aaf0 Radeon RX 580 Gaming X 8G 1463 Fast Corporation 1464 Interactive Circuits & Systems Ltd 1465 GN NETTEST Telecom DIV. @@ -16648,6 +17127,7 @@ 14be L3 Communications 14bf SPIDER Communications Inc. 14c0 COMPAL Electronics Inc + 1201 X550 10Gb 2P RJ45 OCP Mezz # now owned by CSP, Inc. 14c1 MYRICOM Inc. 0008 Myri-10G Dual-Protocol NIC @@ -16756,7 +17236,12 @@ 107b 5048 E4500 Onboard 1259 2705 AT-2711FX 1601 NetXtreme BCM5752M Gigabit Ethernet PCI Express + 1604 BCM5745X NetXtreme-E Ethernet Partition + 1605 BCM5745X NetXtreme-E RDMA Partition + 1606 BCM5745X NetXtreme-E RDMA Virtual Function + 1609 BCM5745X NetXtreme-E Ethernet Virtual Function 1612 BCM70012 Video Decoder [Crystal HD] + 1614 BCM57454 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb Ethernet 1615 BCM70015 Video Decoder [Crystal HD] 1639 NetXtreme II BCM5709 Gigabit Ethernet 1028 0235 PowerEdge R710 BCM5709 Gigabit Ethernet @@ -16890,9 +17375,11 @@ 1655 NetXtreme BCM5717 Gigabit Ethernet PCIe 1656 NetXtreme BCM5718 Gigabit Ethernet PCIe 1657 NetXtreme BCM5719 Gigabit Ethernet PCIe + 1014 0420 FC 5260/5899 4-port 1 GbE Adapter for Power 103c 169d Ethernet 1Gb 4-port 331FLR Adapter 103c 22be Ethernet 1Gb 4-port 331i Adapter 103c 3383 Ethernet 1Gb 4-port 331T Adapter + 14e4 1904 4-port 1Gb Ethernet Adapter 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express 1014 02c6 eServer xSeries server mainboard 1028 01e6 PowerEdge 860 @@ -16964,6 +17451,7 @@ 1014 0577 ThinkPad X41 / Z60t 103c 0934 nx8220 103c 0940 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC 17aa 2081 ThinkPad R60e 167e NetXtreme BCM5751F Fast Ethernet PCI Express 167f NetLink BCM5787F Fast Ethernet PCI Express @@ -16985,6 +17473,7 @@ 1028 1f68 BCM57800 1-Gigabit Ethernet 168d NetXtreme II BCM57840 10/20 Gigabit Ethernet 168e NetXtreme II BCM57810 10 Gigabit Ethernet + 1014 0492 PCIe2 2-port 10 GbE BaseT RJ45 Adapter (FC EN0W; CCIN 2CC4) 103c 1798 Flex-10 10Gb 2-port 530FLB Adapter [Meru] 103c 17a5 Flex-10 10Gb 2-port 530M Adapter 103c 18d3 Ethernet 10Gb 2-port 530T Adapter @@ -16995,6 +17484,8 @@ 103c 193a FlexFabric 10Gb 2-port 533FLR-T Adapter 103c 3382 Ethernet 10Gb 2-port 530FLR-SFP+ Adapter 103c 339d Ethernet 10Gb 2-port 530SFP+ Adapter + 193d 1003 530F-B + 193d 1006 530F-L 1690 NetXtreme BCM57760 Gigabit Ethernet PCIe 1691 NetLink BCM57788 Gigabit Ethernet PCIe 1028 04aa XPS 8300 @@ -17003,6 +17494,7 @@ 1693 NetLink BCM5787M Gigabit Ethernet PCI Express 1025 0121 Aspire 5920G 103c 30c0 6710b + 17aa 20d5 ThinkPad R61 1694 NetLink BCM57790 Gigabit Ethernet PCIe 1696 NetXtreme BCM5782 Gigabit Ethernet 103c 12bc d530 CMT (DG746A) @@ -17019,6 +17511,7 @@ 169d NetLink BCM5789 Gigabit Ethernet PCI Express 16a0 NetLink BCM5785 Fast Ethernet 16a1 BCM57840 NetXtreme II 10 Gigabit Ethernet + 1043 866e PEB-10G/57840-2T 10GBase-T Network Adapter 16a2 BCM57840 NetXtreme II 10/20-Gigabit Ethernet 103c 1916 FlexFabric 20Gb 2-port 630FLB Adapter 103c 1917 FlexFabric 20Gb 2-port 630M Adapter @@ -17143,7 +17636,8 @@ 14e4 1404 BCM957414M4142 OCP 2x25G Type1 wRoCE 1590 020e Ethernet 25Gb 2-port 631SFP28 Adapter 1590 0211 Ethernet 25Gb 2-port 631FLR-SFP28 Adapter - 16d8 BCM57416 NetXtreme-E 10GBase-T RDMA Ethernet Controller + 16d8 BCM57416 NetXtreme-E Dual-Media 10G RDMA Ethernet Controller + 1028 1feb NetXtreme-E 10Gb SFP+ Adapter 1590 020c Ethernet 10Gb 2-port 535T Adapter 1590 0212 Ethernet 10Gb 2-port 535FLR-T Adapter 16d9 BCM57417 NetXtreme-E 10GBASE-T RDMA Ethernet Controller @@ -17164,6 +17658,7 @@ 16ed BCM57414 NetXtreme-E RDMA Partition 16ee BCM57416 NetXtreme-E Ethernet Partition 16ef BCM57416 NetXtreme-E RDMA Partition + 16f1 BCM57452 NetXtreme-E 10Gb/25Gb/40Gb/50Gb Ethernet 16f3 NetXtreme BCM5727 Gigabit Ethernet PCIe 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express @@ -17351,6 +17846,7 @@ 106b 0093 AirPort Extreme 106b 00d1 AirPort Extreme 106b 00e9 AirPort Extreme + 14e4 04d8 Pegatron UPWL6024 4357 BCM43225 802.11b/g/n 105b e021 T77H103.00 Wireless Half-size Mini PCIe Card 4358 BCM43227 802.11b/g/n @@ -17439,6 +17935,13 @@ aa52 BCM43602 802.11ac Wireless LAN SoC b302 BCM56302 StrataXGS 24x1GE 2x10GE Switch Controller b334 BCM56334 StrataXGS 24x1GE 4x10GE Switch Controller + b370 BCM56370 Switch ASIC + b371 BCM56371 Switch ASIC + b372 BCM56372 Switch ASIC + b375 BCM56375 Switch ASIC + b376 BCM56376 Switch ASIC + b377 BCM56377 Switch ASIC + b379 Broadcom BCM56379 Switch ASIC b800 BCM56800 StrataXGS 10GE Switch Controller b842 BCM56842 Trident 10GE Switch Controller # Trident2 @@ -17910,7 +18413,8 @@ 0001 SOC-it 101 System Controller 1540 PROVIDEO MULTIMEDIA Co Ltd 1541 MACHONE Communications -1542 Concurrent Computer Corporation +# nee VIVID Technology Inc. +1542 Concurrent Real-Time 9260 RCIM-II Real-Time Clock & Interrupt Module 9271 RCIM-III Real-Time Clock & Interrupt Module (PCIe) 9272 Pulse Width Modulator Card @@ -17942,6 +18446,8 @@ 1556 PLDA 1100 PCI Express Core Reference Design 110f PCI Express Core Reference Design Virtual Function + 1110 XpressRich Reference Design + 1113 XpressSwitch 1557 MEDIASTAR Co Ltd 1558 CLEVO/KAPOK Computer 1559 SI LOGIC Ltd @@ -18097,6 +18603,7 @@ 020b MT27710 Family [ConnectX-4 Lx Flash Recovery] 020d MT28800 Family [ConnectX-5 Flash Recovery] 020f MT28908A0 Family [ConnectX-6 Flash Recovery] + 0210 MT28908A0 Family [ConnectX-6 Secure Flash Recovery] 0211 MT416842 Family [BlueField SoC Flash Recovery] # reserved for RM#105916 024e MT53100 [Spectrum-2, Flash recovery mode] @@ -18104,9 +18611,11 @@ 024f MT53100 [Spectrum-2, Flash recovery mode] 0262 MT27710 [ConnectX-4 Lx Programmable] EN 0263 MT27710 [ConnectX-4 Lx Programmable Virtual Function] EN + 0264 Innova-2 Flex Burn image 0281 NPS-600 Flash Recovery 1002 MT25400 Family [ConnectX-2 Virtual Function] 1003 MT27500 Family [ConnectX-3] + 1014 04b5 PCIe3 40GbE RoCE Converged Host Bus Adapter for Power 103c 1777 InfiniBand FDR/EN 10/40Gb Dual Port 544FLR-QSFP Adapter (Rev Cx) 103c 17c9 Infiniband QDR/Ethernet 10Gb 2-port 544i Adapter 103c 18ce InfiniBand QDR/EN 10Gb Dual Port 544M Adapter @@ -18114,6 +18623,7 @@ 103c 18d6 InfiniBand FDR/EN 10/40Gb Dual Port 544QSFP Adapter 15b3 0025 ConnectX-3 IB QDR Dual Port Mezzanine Card 15b3 0026 ConnectX-3 IB FDR Dual Port Mezzanine Card + 15b3 0028 ConnectX-3 VPI Dual QSFP+ Port QDR Infiniband 40Gb/s or 10Gb Ethernet 15b3 0059 ConnectX-3 VPI IB FDR/40 GbE Single Port QSFP+ Mezzanine Card 15b3 0065 ConnectX-3 VPI IB FDR/40 GbE Dual Port QSFP+ Adapter 15b3 0066 ConnectX-3 IB FDR10 Dual Port Mezzanine Card @@ -18136,9 +18646,11 @@ 117c 0091 FastFrame NQ42 117c 0092 FastFrame NQ11 117c 0093 FastFrame NQ12 + 15b3 0006 Mellanox Technologies ConnectX-3 Pro Stand-up dual-port 40GbE MCX314A-BCCT 15b3 0078 ConnectX-3 Pro 10 GbE Dual Port KR Mezzanine Card 15b3 0079 ConnectX-3 Pro 40 GbE Dual Port QSFP+ Adapter 15b3 0080 ConnectX-3 Pro 10 GbE Dual Port SFP+ Adapter + 193d 1002 520F-B 1009 MT27530 Family 100a MT27531 Family 100b MT27540 Family @@ -18150,16 +18662,23 @@ 1011 MT27600 [Connect-IB] 1012 MT27600 Family [Connect-IB Virtual Function] 1013 MT27700 Family [ConnectX-4] + 1014 04f7 PCIe3 2-port 100 GbE (NIC and RoCE) QSFP28 Adapter for Power + 15b3 0003 Mellanox Technologies ConnectX-4 Stand-up single-port 40GbE MCX413A-BCAT + 15b3 0005 Mellanox Technologies ConnectX-4 Stand-up single-port 40GbE MCX415A-BCAT 15b3 0006 MCX416A-BCAT, ConnectX-4 EN, 40/56GbE 2P, PCIe3.0 x16 + 15b3 0008 ConnectX-4 Stand-up dual-port 100GbE MCX416A-CCAT 15b3 0033 ConnectX-4 VPI IB EDR/100 GbE Single Port QSFP28 Adapter 15b3 0034 ConnectX-4 VPI IB EDR/100 GbE Dual Port QSFP28 Adapter 15b3 0050 ConnectX-4 100 GbE Dual Port QSFP28 Adapter 1014 MT27700 Family [ConnectX-4 Virtual Function] 1015 MT27710 Family [ConnectX-4 Lx] + 15b3 0004 ConnectX-4 Lx Stand-up dual-port 10GbE MCX4121A-XCAT + 15b3 0005 Mellanox Technologies ConnectX-4 Lx Stand-up single-port 40GbE MCX4131A-BCAT 15b3 0016 ConnectX-4 Lx 25 GbE Dual Port SFP28 Adapter 15b3 0020 MCX4411A-ACQN, ConnectX-4 Lx EN OCP, 1x25Gb 15b3 0021 MCX4421A-ACQN ConnectX-4 Lx EN OCP,2x25G 15b3 0025 ConnectX-4 Lx 25 GbE Dual Port SFP28 rNDC + 193d 100a 620F-B 1016 MT27710 Family [ConnectX-4 Lx Virtual Function] 1017 MT27800 Family [ConnectX-5] 1018 MT27800 Family [ConnectX-5 Virtual Function] @@ -18190,6 +18709,8 @@ 6372 MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe 2.0 2.5GT/s] 6732 MT26418 [ConnectX VPI PCIe 2.0 5GT/s - IB DDR / 10GigE] 673c MT26428 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE] + 1014 0415 PCIe2 2-port 4X InfiniBand QDR Adapter for Power + 1014 0487 GX++ 1-port 4X IB QDR Adapter for Power 795 103c 1782 4X QDR InfiniBand Mezzanine HCA for c-Class BladeSystem 15b3 0021 HP InfiniBand 4X QDR CX-2 PCI-e G2 Dual Port HCA 6746 MT26438 [ConnectX VPI PCIe 2.0 5GT/s - IB QDR / 10GigE Virtualization+] @@ -18198,6 +18719,8 @@ 6750 MT26448 [ConnectX EN 10GigE, PCIe 2.0 5GT/s] 1014 0461 2-Port 10 GbE RoCE SR LP PCIe2 (rev b0) 15b3 0018 HP 10 GbE PCI-e G2 Dual-Port NIC (rev C1) +# FC EC26 + 15b3 6572 IBM Flex System EN4132 2-port 10Gb RoCE Adapter 675a MT25408 [ConnectX EN 10GigE 10GBaseT, PCIe Gen2 5GT/s] 6764 MT26468 [ConnectX EN 10GigE, PCIe 2.0 5GT/s Virtualization+] 103c 3313 NC542m Dual Port Flex-10 10GbE BLc Adapter @@ -18209,6 +18732,7 @@ 7121 NPS-600 configuration and management interface 7122 NPS-600 network interface PF 7123 NPS-600 network interface VF + 8200 Innova-2 Flex Shell Logic a2d0 MT416842 BlueField SoC Crypto enabled a2d1 MT416842 BlueField SoC Crypto disabled a2d2 MT416842 BlueField integrated ConnectX-5 network controller @@ -18244,6 +18768,8 @@ 0014 RamSan Flash SSD 0015 ZBox 15b7 Sandisk Corp + 2001 Skyhawk Series NVME SSD + 5001 WD Black NVMe SSD 15b8 ADDI-DATA GmbH 1001 APCI1516 SP controller (16 digi outputs) 1003 APCI1032 SP controller (32 digi inputs w/ opto coupler) @@ -18392,6 +18918,11 @@ 1006 Format synchronizer, model 10500 1007 Format synchronizer, model 21000 2002 Fast Universal Data Output + 3100 IO31000 Frame Synchronizer and I/O + 3200 IO32000 Frame Synchronizer and I/O + 4002 High Rate Demodulator + 5001 High Rate FEC + 6001 High Rate Demodulator and FEC 1631 Packard Bell B.V. 1638 Standard Microsystems Corp [SMC] 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000 @@ -18698,6 +19229,7 @@ 0777 4005 SR71-15 802.11an Mini PCI Adapter 1186 3a7a DWA-552 802.11n Xtreme N Desktop Adapter (rev A2) 1186 3a7d DWA-552 802.11n Xtreme N Desktop Adapter (rev A3) + 168c 0029 AR922X Wireless Network Adapter 168c 2096 Compex WLM200NX / Wistron DNMA-92 002a AR928X Wireless Network Adapter (PCI-Express) 0777 4f05 SR71-X 802.11abgn Wireless ExpressCard Adapter [AR9280] @@ -18882,15 +19414,26 @@ 7012 AP440-2: 32-Channel Isolated Digital Input Module 7013 AP440-3: 32-Channel Isolated Digital Input Module 7014 AP445: 32-Channel Isolated Digital Output Module + 7015 AP471 48-Channel TTL Level Digital Input/Output Module 7016 AP470 48-Channel TTL Level Digital Input/Output Module 7017 AP323 16-bit, 20 or 40 Channel Analog Input Module 7018 AP408: 32-Channel Digital I/O Module + 7019 AP341 14-bit, 16-Channel Simultaneous Conversion Analog Input Module 701a AP220-16 12-Bit, 16-Channel Analog Output Module 701b AP231-16 16-Bit, 16-Channel Analog Output Module + 701c AP225 12-Bit, 16-Channel Analog Output Module with Waveform Memory + 701d AP235 16-Bit, 16-Channel Analog Output Module with Waveform Memory 7021 APA7-201 Reconfigurable Artix-7 FPGA module 48 TTL channels 7022 APA7-202 Reconfigurable Artix-7 FPGA module 24 RS485 channels 7023 APA7-203 Reconfigurable Artix-7 FPGA module 24 TTL & 12 RS485 channels 7024 APA7-204 Reconfigurable Artix-7 FPGA module 24 LVDS channels + 7027 AP418 16-Channel High Voltage Digital Input/Output Module + 7029 AP342 14-bit, 12-Channel Isolated Simultaneous Conversion Analog Input Module + 702a AP226 12-Bit, 8-Channel Isolated Analog Output Module + 702b AP236 16-Bit, 8-Channel Isolated Analog Output Module + 7031 AP441-1: 32-Channel Isolated Digital Input Module + 7032 AP441-2: 32-Channel Isolated Digital Input Module + 7033 AP441-3: 32-Channel Isolated Digital Input Module 7042 AP482 Counter Timer Module with TTL Level Input/Output 7043 AP483 Counter Timer Module with TTL Level and RS422 Input/Output 7044 AP484 Counter Timer Module with RS422 Input/Output @@ -18963,6 +19506,7 @@ 0101 PCD-7004 Digital Bi-Directional Ports PCI Card 0102 PCD-7104 Digital Input & Output PCI Card 0303 PCD-7006C Digital Input & Output PCI Card +1761 Pickering Interfaces Ltd 1771 InnoVISION Multimedia Ltd. # nee SBS Technologies 1775 GE Intelligent Platforms @@ -18994,6 +19538,10 @@ 177d 0005 CN2360 [LiquidIO II] 2-port 10GbE Intelligent adapter 177d 0006 CN2360 [LiquidIO II] 2-port 25GbE Intelligent adapter 177d 0007 CN2350 [LiquidIO II] 2-port 25GbE Intelligent adapter + 177d 0008 CN2350 [LiquidIO II] 2-port 10GbE SFP+ Intelligent adapter + 177d 0009 CN2360 [LiquidIO II] 2-port 10GbE SFP+ Intelligent adapter + 177d 000a CN2350 [LiquidIO II] 2-port 10GBASE-T Intelligent adapter + 177d 000b CN2360 [LiquidIO II] 2-port 10GBASE-T Intelligent adapter 9703 CN23XX [LiquidIO II] NVMe Controller 9712 CN23XX [LiquidIO II] SRIOV Virtual Function 177d 0003 CN2350 [LiquidIO II] 2-port 10GbE SRIOV Virtual Function @@ -19182,6 +19730,7 @@ 17d3 1880 ARC-1880 8/12/16/24 Port PCIe 2.0 to SAS/SATA 6Gb RAID Controller 17d3 1882 ARC-1882 8/12/16/24 Port PCIe 3.0 to SAS/SATA 6Gb RAID Controller 17d3 1883 ARC-1883 8/12/16/24 Port PCIe 3.0 to SAS/SATA 12Gb RAID Controller + 1884 ARC-1884 series PCIe 3.0 to SAS/SATA 12/6Gb RAID Controller # nee Neterion Inc., previously S2io Inc. 17d5 Exar Corp. 5731 Xframe 10-Gigabit Ethernet PCI-X @@ -19254,15 +19803,19 @@ 1a07 KintexUS PCIe Darklite Design [DNPCIe_40G_KU_LL] 1a08 KintexUS PCIe Darklite Design [DNPCIe_40G_KU_LL_QSFP] 1a09 Arria10 PCIe Darklite Design [DNPCIe_80G_A10_LL] + 1a0a VirtexUS PCIe Darklite Design [DNVUF2_HPC_PCIe] 17e4 Sectra AB 0001 KK671 Cardbus encryption board 0002 KK672 Cardbus encryption board -17e6 Entropic Communications Inc. +# nee Entropic Communications Inc. +17e6 MaxLinear 0010 EN2010 [c.Link] MoCA Network Controller (Coax, PCI interface) 0011 EN2010 [c.Link] MoCA Network Controller (Coax, MPEG interface) 0021 EN2210 [c.Link] MoCA Network Controller (Coax) 0025 EN2510 [c.Link] MoCA Network Controller (Coax, PCIe interface) 0027 EN2710 [c.Link] MoCA 2.0 Network Controller (Coax, PCIe interface) + 3700 MoCA 2.0 Network Controller (Coax, PCIe interface) + 3710 MoCA 2.5 Network Controller (Coax, PCIe interface) 17ee Connect Components Ltd 17f2 Albatron Corp. 17f3 RDC Semiconductor, Inc. @@ -19290,6 +19843,7 @@ 1803 ProdaSafe GmbH 1805 Euresys S.A. 1809 Lumanate, Inc. +180c IEI Integration Corp 1813 Ambient Technologies Inc 4000 HaM controllerless modem 16be 0001 V9x HAM Data Fax Modem @@ -19727,20 +20281,25 @@ 1924 800e SFN7x42Q-R2 Flareon Ultra 7000 Series 10/40G Adapter 1924 800f SFN7xx4F-R1 Flareon Ultra 7000 Series 10G Adapter 0a03 SFC9220 10/40G Ethernet Controller - 1924 8011 SFN8022-R1 Flareon 8000 Series 10G Adapter - 1924 8012 SFN8522-R1 Flareon Ultra 8000 Series 10G Adapter - 1924 8013 SFN8042-R1 Flareon 8000 Series 10/40G Adapter - 1924 8014 SFN8542-R1 Flareon Ultra 8000 Series 10/40G Adapter - 1924 8016 SFN8022-R2 Flareon 8000 Series 10G Adapter - 1924 8017 SFN8522-R2 Flareon Ultra 8000 Series 10G Adapter - 1924 8018 SFN8042-R2 Flareon 8000 Series 10/40G Adapter - 1924 8019 SFN8542-R2 Flareon Ultra 8000 Series 10/40G Adapter - 1924 801a SFN8722-R1 Flareon Ultra 8000 Series OCP 10G Adapter + 1924 8011 SFN8022-R1 8000 Series 10G Adapter + 1924 8012 SFN8522-R1 8000 Series 10G Adapter + 1924 8013 SFN8042-R1 8000 Series 10/40G Adapter + 1924 8014 SFN8542-R1 8000 Series 10/40G Adapter + 1924 8016 SFN8022-R2 8000 Series 10G Adapter + 1924 8017 SFN8522-R2 8000 Series 10G Adapter + 1924 8018 SFN8042-R2 8000 Series 10/40G Adapter + 1924 8019 SFN8542-R2 8000 Series 10/40G Adapter + 1924 801a SFN8722-R1 8000 Series OCP 10G Adapter + 1924 801b SFN8522-R3 8000 Series 10G Adapter + 0b03 SFC9250 10/25/40/50/100G Ethernet Controller + 1924 801d x2522-R1 2000 Series 10/25G Adapter + 1924 801e x2542-R1 2000 Series 40/100G Adapter 1803 SFC9020 10G Ethernet Controller (Virtual Function) 1813 SFL9021 10GBASE-T Ethernet Controller (Virtual Function) 1903 SFC9120 10G Ethernet Controller (Virtual Function) 1923 SFC9140 10/40G Ethernet Controller (Virtual Function) 1a03 SFC9220 10/40G Ethernet Controller (Virtual Function) + 1b03 SFC9250 10/25/40/50/100G Ethernet Controller (Virtual Function) 6703 SFC4000 rev A iSCSI/Onload [Solarstorm] 10b8 0102 SMC10GPCIe-10BT (A2) [TigerCard] 10b8 0103 SMC10GPCIe-10BT (A3) [TigerCard] @@ -19761,6 +20320,7 @@ 000c Qualcomm MSM6275 UMTS chip 1932 DiBcom 193c MAXIM Integrated Products +193d Hangzhou H3C Technologies Co., Ltd. 193f AHA Products Group 0001 AHA36x-PCIX 0360 AHA360-PCIe @@ -19921,6 +20481,7 @@ # E2200, E2201, E2205 e091 Killer E220x Gigabit Ethernet Controller e0a1 Killer E2400 Gigabit Ethernet Controller + e0b1 Killer E2500 Gigabit Ethernet Controller 196a Sensory Networks Inc. 0101 NodalCore C-1000 Content Classification Accelerator 0102 NodalCore C-2000 Content Classification Accelerator @@ -19989,20 +20550,29 @@ 0212 BladeEngine2 10Gb Gen2 PCIe iSCSI Adapter 0221 BladeEngine3 10Gb Gen2 PCIe Network Adapter 0222 BladeEngine3 10Gb Gen2 PCIe iSCSI Adapter - 0700 OneConnect 10Gb NIC + 0700 OneConnect OCe10100/OCe10102 Series 10 GbE 103c 1747 NC550SFP DualPort 10GbE Server Adapter 103c 1749 NC550SFP Dual Port Server Adapter 103c 174a NC551m Dual Port FlexFabric 10Gb Adapter 103c 174b StorageWorks NC550 DualPort Converged Network Adapter 103c 3314 NC551i Dual Port FlexFabric 10Gb Adapter 0702 OneConnect 10Gb iSCSI Initiator - 0704 OneConnect 10Gb FCoE Initiator + 0704 OneConnect OCe10100/OCe10102 Series 10 GbE CNA + 10df e602 OneConnect OCe10100 10Gb CNA + 10df e630 OneConnect OCe10102-FM-E / OCe10102-FX-E for EMC VNX Symmetrix 0710 OneConnect 10Gb NIC (be3) +# FC 5287 / FC 5284; CCIN 5287 + 1014 03d0 PCIe2 2-port 10GbE SR Adapter for POWER +# FC 5288 / FC 5286; CCIN 5288 + 1014 03d1 PCIe2 2-port 10GbE SFP+ Copper Adapter for POWER + 1014 0409 Integrated Multifunction Card with Dual 10GbE SR Optical + Dual 1GbE for Power 750/760 + 1014 040a Integrated Multifunction Card with Dual 10GbE SR Copper + Dual 1GbE for Power 750/760 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter 103c 3340 NC552SFP 2-port 10Gb Server Adapter 103c 3341 NC552m 10Gb 2-port FlexFabric Converged Network Adapter 103c 3345 NC553m 10Gb 2-port FlexFabric Converged Network Adapter 103c 337b NC554FLB 10Gb 2-port FlexFabric Converged Network Adapter + 10df e733 Flex System EN4054 4-port 10Gb Ethernet Mezzanine Adapter 0712 OneConnect 10Gb iSCSI Initiator (be3) 0714 OneConnect 10Gb FCoE Initiator (be3) 103c 3315 NC553i 10Gb 2-port FlexFabric Converged Network Adapter @@ -20195,7 +20765,7 @@ 3003 ioMemory Mezzanine 1aee Caustic Graphics Inc. # nee Qumranet, Inc. -1af4 Red Hat, Inc +1af4 Red Hat, Inc. 1000 Virtio network device 1001 Virtio block device 1002 Virtio memory balloon @@ -20257,7 +20827,12 @@ 1af4 1100 QEMU Virtual Machine 0006 PCI Rocker Ethernet switch device 0007 PCI SD Card Host Controller Interface + 0008 QEMU PCIe Host bridge + 0009 QEMU PCI Expander bridge 000a PCI-PCI bridge (multiseat) + 000b QEMU PCIe Expander bridge + 000c QEMU PCIe Root port + 000d QEMU XHCI Host Controller 0100 QXL paravirtual graphic card 1af4 1100 QEMU Virtual Machine 1b37 Signal Processing Devices Sweden AB @@ -20273,6 +20848,7 @@ 001e ADQ208 001f DSU 0020 ADQ14 + 0023 ADQ7 2014 TX320 2019 S6000 # now owned by HGST (a Western Digital subsidiary) @@ -20307,6 +20883,9 @@ 91a4 88SE912x IDE Controller 9220 88SE9220 PCIe 2.0 x2 2-port SATA 6 Gb/s RAID Controller 9230 88SE9230 PCIe SATA 6Gb/s Controller + 1028 1fd6 BOSS-S1 Adapter + 1028 1fdf BOSS-S1 Modular + 1028 1fe2 BOSS-S1 Adapter 1d49 0300 ThinkSystem M.2 with Mirroring Enablement Kit 9235 88SE9235 PCIe 2.0 x2 4-port SATA 6 Gb/s Controller 9445 88SE9445 PCIe 2.0 x4 4-Port SAS/SATA 6 Gbps RAID Controller @@ -20387,6 +20966,8 @@ 1bbf Maxeler Technologies Ltd. 0003 MAX3 0004 MAX4 +1bcf NEC Corporation + 001c Vector Engine 1.0 1bd0 Astronics Corporation 1001 Mx5 PMC/XMC Databus Interface Card 1002 PM1553-5 (PC/104+ MIL-STD-1553 Interface Card) @@ -20446,6 +21027,9 @@ 0003 Ultrastar SN100 Series NVMe SSD 1014 04f5 PCIe3 1.6TB NVMe Flash Adapter 1014 04f6 PCIe3 3.2TB NVMe Flash Adapter + 0023 Ultrastar SN200 Series NVMe SSD +1c5c SK hynix + 1283 PC300 NVMe Solid State Drive 1c5f Beijing Memblaze Technology Co. Ltd. 0540 PBlaze4 NVMe SSD # http://www.nicevt.ru/ (in Russian) @@ -20465,6 +21049,8 @@ 1cc7 Radian Memory Systems Inc. 0200 RMS-200 0250 RMS-250 +1ccf Zoom Corporation + 0001 TAC-2 Thunderbolt Audio Converter 1cd2 SesKion GmbH 0301 Simulyzer-RT CompactPCI Serial DIO-1 card 0302 Simulyzer-RT CompactPCI Serial PSI5-ECU-1 card @@ -20481,8 +21067,71 @@ 0004 ExaNIC X10-GM 0005 ExaNIC X40 0006 ExaNIC X10-HPT + 0007 ExaNIC X40 + 0008 ExaNIC V5P 1cf7 Subspace Dynamics 1d00 Pure Storage +1d0f Amazon.com, Inc. + cd01 NVMe SSD Controller + ec20 Elastic Network Adapter (ENA) +1d17 Zhaoxin + 070f ZX-100 PCI Express Root Port + 0710 ZX-100/ZX-200 PCI Express Root Port + 0711 ZX-100/ZX-200 PCI Express Root Port + 0712 ZX-100/ZX-200 PCI Express Root Port + 0713 ZX-100/ZX-200 PCI Express Root Port + 0714 ZX-100/ZX-200 PCI Express Root Port + 0715 ZX-100/ZX-200 PCI Express Root Port + 0716 ZX-D PCI Express Root Port + 0717 ZX-D PCI Express Root Port + 0718 ZX-D PCI Express Root Port + 0719 ZX-D PCI Express Root Port + 071a ZX-D PCI Express Root Port + 071b ZX-D PCI Express Root Port + 071c ZX-D PCI Express Root Port + 071d ZX-D PCI Express Root Port + 071e ZX-D PCI Express Root Port + 071f ZX-200 Upstream Port of PCI Express Switch + 0720 ZX-200 PCIE RC6 controller + 0721 ZX-200 Downstream Port of PCI Express Switch + 0722 ZX-200 PCIE P2C bridge + 1000 ZX-D Standard Host Bridge + 1001 ZX-D Miscellaneous Bus + 3001 ZX-100 Standard Host Bridge + 300a ZX-100 Miscellaneous Bus + 3038 ZX-100/ZX-200 Standard Universal PCI to USB Host Controller + 3104 ZX-100/ZX-200 Standard Enhanced PCI to USB Host Controller + 31b0 ZX-100/ZX-D Standard Host Bridge + 31b1 ZX-100/ZX-D Standard Host Bridge + 31b2 ZX-100/ZX-D DRAM Controller + 31b3 ZX-100/ZX-D Power Management Controller + 31b4 ZX-100/ZX-D I/O APIC + 31b5 ZX-100/ZX-D Scratch Device + 31b7 ZX-100/ZX-D Standard Host Bridge + 31b8 ZX-100/ZX-D PCI to PCI Bridge + 3288 ZX-100/ZX-D High Definition Audio Controller + 345b ZX-100/ZX-D Miscellaneous Bus + 3a02 ZX-100 C-320 GPU + 3a03 ZX-D C-860 GPU + 9002 ZX-100/ZX-200 EIDE Controller + 9003 ZX-100 EIDE Controller + 9045 ZX-100/ZX-D RAID Accelerator + 9046 ZX-D RAID Accelerator + 9083 ZX-100/ZX-200 StorX AHCI Controller + 9084 ZX-100 StorX AHCI Controller + 9100 ZX-200 Cross bus + 9101 ZX-200 Traffic Controller + 9141 ZX-100 High Definition Audio Controller + 9142 ZX-D High Definition Audio Controller + 9180 ZX-200 Networking Gigabit Ethernet Adapter + 9202 ZX-100 USB eXtensible Host Controller + 9203 ZX-200 USB eXtensible Host Controller + 9286 ZX-D eMMC Host Controller + 9300 ZX-D eSPI Host Controller + 95d0 ZX-100 Universal SD Host Controller + f410 ZX-100/ZX-D PCI Com Port +1d18 RME + 0001 Fireface UFX+ 1d1d CNEX Labs 1f1f QEMU NVM Express LightNVM Controller 2807 8800 series NVMe SSD @@ -20497,11 +21146,20 @@ 1d44 DPT a400 PM2x24/PM3224 1d49 Lenovo +1d4c Diamanti, Inc. 1d5c Fantasia Trading LLC 1d61 Technobox, Inc. 1d62 Nebbiolo Technologies 1d65 Imagine Communications Corp. 04de Taurus/McKinley +1d6a Aquantia Corp. + 07b1 AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 08b1 AQC108 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 11b1 AQC111 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 12b1 AQC112 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + 87b1 AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + d107 AQC107 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] + d108 AQC108 NBase-T/IEEE 802.3bz Ethernet Controller [AQtion] 1d6c Atomic Rules LLC 1001 A5PL-E1 1002 A5PL-E7 @@ -20522,15 +21180,62 @@ 4200 A5PL-E1-10GETI [10 GbE Ethernet Traffic Instrument] 1d78 DERA 1d7c Aerotech, Inc. -1d87 Rockchip Inc. RK3399 PCI Express Root Port +1d87 Fuzhou Rockchip Electronics Co., Ltd 1d8f Enyx +1d94 Chengdu Higon IC Design Co.Ltd + 1450 Root Complex + 1451 I/O Memory Management Unit + 1452 PCIe Dummy Host Bridge + 1453 PCIE GPP Bridge + 1454 Internal PCIe GPP Bridge 0 to Bus B + 1455 PCIe Dummy Function + 1456 PSPCCP Command DMA Processor + 1458 10 Gb Ethernet Controller Port 0/Port1 + 1459 10 Gb Ethernet Controller Port 2/Port3 + 145a PCIe Dummy Function + 145b PCIE Non-Transparent Bridge + 145c USB3 XHCI + 145d Switch upstream in PCIe + 145e Switch downstream in PCIe + 145f USB 3.0 Host controller + 1460 Data Fabric: Device 18h; Function 0 + 1461 Data Fabric: Device 18h; Function 1 + 1462 Data Fabric: Device 18h; Function 2 + 1463 Data Fabric: Device 18h; Function 3 + 1464 Data Fabric: Device 18h; Function 4 + 1465 Data Fabric: Device 18h; Function 5 + 1466 Data Fabric: Device 18h; Function 6 + 1467 Data Fabric: Device 18h; Function 7 + 1468 NTBCCP + 7901 FCH SATA Controller [AHCI mode] + 7904 FCH SATA Controller [AHCI mode] + 7906 FCH SD Flash Controller + 790b FCH SMBus Controller + 790e FCH LPC Bridge 1d95 Graphcore Ltd 1da1 Teko Telecom S.r.l. +1da2 Sapphire Technology Limited 1de1 Tekram Technology Co.,Ltd. 0391 TRM-S1040 [DC-315 / DC-395 series] 2020 DC-390 690c 690c dc29 DC290 +1de5 Eideticom, Inc + 1000 IO Memory Controller + 2000 NoLoad Hardware Development Kit +1def Ampere Computing, LLC + e005 Skylark PCI Express Root Port 0 [X-Gene 3] + e006 Skylark PCI Express Root Port 1 [X-Gene 3] + e007 Skylark PCI Express Root Port 2 [X-Gene 3] + e008 Skylark PCI Express Root Port 3 [X-Gene 3] + e009 Skylark PCI Express Root Port 4 [X-Gene 3] + e00a Skylark PCI Express Root Port 5 [X-Gene 3] + e00b Skylark PCI Express Root Port 6 [X-Gene 3] + e00c Skylark PCI Express Root Port 7 [X-Gene 3] +1df7 opencpi.org + 0001 ml605 + 0002 alst4 + 0003 alst4x # nee Tumsan Oy 1fc0 Ascom (Finland) Oy 0300 E2200 Dual E1/Rawpipe Card @@ -20565,6 +21270,7 @@ 0000 3014 10-Giga TOE Dual Port CX4 Low Profile SmartNIC 4010 TN4010 Clean SROM 4020 TN9030 10GbE CX4 Ethernet Adapter + 180c 2040 Mustang-200 10GbE Ethernet Adapter 4022 TN9310 10GbE SFP+ Ethernet Adapter 1043 8709 XG-C100F 10GbE SFP+ Ethernet Adapter 1186 4d00 DXE-810S 10GbE SFP+ Ethernet Adapter @@ -20578,7 +21284,9 @@ 1fc9 3015 Ethernet Adapter 4026 TN9610 10GbE SFP+ Ethernet Adapter 4027 TN9710P 10GBase-T/NBASE-T Ethernet Adapter + 1154 0368 LGY-PCIE-MG 1432 8104 10 Gigabit Ethernet PCI Express Adapter + 1546 4027 IOI9710P 10Gbase-T/NBASE-T Ethernet Adapter 1fc9 3015 Ethernet Adapter 4527 TN9710Q 5GBase-T/NBASE-T Ethernet Adapter 1fcc StreamLabs @@ -21175,6 +21883,8 @@ 6178 DVB-S2 4 Tuner PCIe Card 544d 6904 TBS6904 DVB-S2 Quad Tuner PCIe Card 544d 6905 TBS6905 DVB-S2 Quad Tuner PCIe Card + 6205 0001 TBS6205 DVB-T2/T/C Quad TV Tuner PCIe Card + 6209 0001 TBS6209 DVB-T2/C2/T/C/ISDB-T OctaTV Tuner 5452 SCANLAB AG 3443 RTC4 5455 Technische University Berlin @@ -21185,6 +21895,7 @@ 0001 I-30xx Scanner Interface 5555 Genroco, Inc 0003 TURBOstor HFP-832 [HiPPI NIC] + 3b00 Epiphan DVI2PCIe video capture card 5646 Vector Fabrics BV 5654 VoiceTronix Pty Ltd 5678 Dawicontrol Computersysteme GmbH @@ -21205,6 +21916,8 @@ c147 Virtualized Graphics Device 5854 GoTView 5ace Beholder International Ltd. +6205 TBS Technologies (wrong ID) +6209 TBS Technologies (wrong ID) 631c SmartInfra Ltd 1652 PXI-1652 Signal Generator 2504 PXI-2504 Signal Interrogator @@ -21238,6 +21951,8 @@ 3000 HD-3000 5500 HD5500 HDTV 7284 HT OMEGA Inc. +7357 IOxOS Technologies SA + 7910 7910 [Althea] 7401 EndRun Technologies e100 PTP3100 PCIe PTP Slave Clock 7470 TP-LINK Technologies Co., Ltd. @@ -21300,7 +22015,7 @@ 8086 1315 Centrino Wireless-N 1000 BGN 8086 1316 Centrino Wireless-N 1000 BG 0085 Centrino Advanced-N 6205 [Taylor Peak] - 8086 1311 Centrino Advanced-N 6205 AGN + 8086 1311 Centrino Advanced-N 6205 (802.11a/b/g/n) 8086 1316 Centrino Advanced-N 6205 ABG 0087 Centrino Advanced-N + WiMAX 6250 [Kilmer Peak] 8086 1301 Centrino Advanced-N + WiMAX 6250 2x2 AGN @@ -21346,6 +22061,7 @@ 1028 04da Vostro 3750 106b 00dc MacBookPro8,2 [Core i7, 15", 2011] 144d c652 NP300E5C series laptop + 17aa 21cf ThinkPad T520 0105 Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port 106b 00dc MacBookPro8,2 [Core i7, 15", 2011] 0106 2nd Generation Core Processor Family Integrated Graphics Controller @@ -21363,8 +22079,10 @@ 0122 2nd Generation Core Processor Family Integrated Graphics Controller 0126 2nd Generation Core Processor Family Integrated Graphics Controller 1028 04cc Vostro 3350 + 17aa 21cf ThinkPad T520 0150 Xeon E3-1200 v2/3rd Gen Core processor DRAM Controller 1043 84ca P8 series motherboard + 1458 d000 Ivy Bridge GT1 [HD Graphics] 15d9 0624 X9SCM-F Motherboard 1849 0150 Motherboard 0151 Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port @@ -21576,6 +22294,7 @@ 0897 Centrino Wireless-N 130 8086 5015 Centrino Wireless-N 130 BGN 8086 5017 Centrino Wireless-N 130 BG + 08a7 Quark SoC X1000 SDIO / eMMC Controller 08ae Centrino Wireless-N 100 8086 1005 Centrino Wireless-N 100 BGN 8086 1007 Centrino Wireless-N 100 BG @@ -21774,6 +22493,12 @@ 8086 8370 Dual Band Wireless AC 3160 # PowerVR SGX 545 08cf Atom Processor Z2760 Integrated Graphics Controller + 0934 Quark SoC X1000 I2C Controller and GPIO Controller + 0935 Quark SoC X1000 SPI Controller + 0936 Quark SoC X1000 HS-UART + 0937 Quark SoC X1000 10/100 Ethernet MAC + 0939 Quark SoC X1000 USB EHCI Host Controller / USB 2.0 Device + 093a Quark SoC X1000 USB OHCI Host Controller 0953 PCIe Data Center SSD 8086 3702 DC P3700 SSD 8086 3703 DC P3700 SSD [2.5" SFF] @@ -21783,6 +22508,7 @@ 8086 370a DC P3600 SSD [2.5" SFF] 8086 370d SSD 750 Series [Add-in Card] 8086 370e SSD 750 Series [2.5" SFF] + 0958 Quark SoC X1000 Host Bridge 095a Wireless 7265 # Stone Peak 2 AC 8086 1010 Dual Band Wireless-AC 7265 @@ -21869,9 +22595,11 @@ 8086 5310 Dual Band Wireless-AC 7265 # Stone Peak 2 AGN 8086 9200 Dual Band Wireless-AC 7265 + 095e Quark SoC X1000 Legacy Bridge 0960 80960RP (i960RP) Microprocessor/Bridge 0962 80960RM (i960RM) Bridge 0964 80960RP (i960RP) Microprocessor/Bridge + 0a03 Haswell-ULT Thermal Subsystem 0a04 Haswell-ULT DRAM Controller 17aa 2214 ThinkPad X240 0a06 Haswell-ULT Integrated Graphics Controller @@ -21884,6 +22612,17 @@ 0a2a Haswell-ULT Integrated Graphics Controller 0a2e Haswell-ULT Integrated Graphics Controller 0a53 DC P3520 SSD + 0a54 Express Flash NVMe P4500 + 1028 1fe1 Express Flash NVMe 1TB 2.5" U.2 (P4500) + 1028 1fe2 Express Flash NVMe 2TB 2.5" U.2 (P4500) + 1028 1fe3 Express Flash NVMe 4TB 2.5" U.2 (P4500) + 1028 1fe4 Express Flash NVMe 4TB HHHL AIC (P4500) + 0a55 Express Flash NVMe P4600 + 1028 1fe5 Express Flash NVMe 1.6TB 2.5" U.2 (P4600) + 1028 1fe6 Express Flash NVMe 2TB 2.5" U.2 (P4600) + 1028 1fe7 Express Flash NVMe 3.2TB 2.5" U.2 (P4600) + 1028 1fe8 Express Flash NVMe 2.0TB HHHL AIC (P4600) + 1028 1fe9 Express Flash NVMe 4.0TB HHHL AIC (P4600) 0be0 Atom Processor D2xxx/N2xxx Integrated Graphics Controller 0be1 Atom Processor D2xxx/N2xxx Integrated Graphics Controller 105b 0d7c D270S/D250S Motherboard @@ -22483,6 +23222,7 @@ 10ba 80003ES2LAN Gigabit Ethernet Controller (Copper) 10bb 80003ES2LAN Gigabit Ethernet Controller (Serdes) 10bc 82571EB Gigabit Ethernet Controller (Copper) + 1014 0368 4-Port 10/100/1000 Base-TX PCI Express Adapter for POWER 103c 704b NC364T PCI Express Quad Port Gigabit Server Adapter 108e 11bc x4 PCI-Express Quad Gigabit Ethernet UTP Low Profile Adapter 8086 10bc PRO/1000 PT Quad Port LP Server Adapter @@ -22612,6 +23352,7 @@ 17aa 402b 82599ES 10Gb 2-port Server Adapter X520-DA2 17aa 402f FPGA Card XC7VX690T-3FFG1157E 18d4 0c09 82599ES 10Gb 2-port SFP+ OCP Mezz Card MOP81-I-10GS2 + 193d 1004 560F-B 1bd4 001b 10G SFP+ DP ER102Fi4 Rack Adapter 1bd4 002f 10G SFP+ DP EP102Fi4A Adapter 1bd4 0032 10G SFP+ DP EP102Fi4 Adapter @@ -22656,6 +23397,8 @@ 11a1 Merrifield Power Management Unit 11a2 Merrifield Serial IO DMA Controller 11a5 Merrifield Serial IO PWM Controller + 11c3 Quark SoC X1000 PCIe Root Port 0 + 11c4 Quark SoC X1000 PCIe Root Port 1 1200 IXP1200 Network Processor 172a 0000 AEP SSL Accelerator 1209 8255xER/82551IT Fast Ethernet Controller @@ -22860,8 +23603,9 @@ 4c53 1090 Cx9/Vx9 mainboard 1462 82870P2 P64H2 Hot Plug Controller 1501 82567V-3 Gigabit Network Connection - 1502 82579LM Gigabit Network Connection + 1502 82579LM Gigabit Network Connection (Lewisville) 1028 04a3 Precision M4600 + 17aa 21ce ThinkPad T520 8086 357a Server Board S1200BTS 1503 82579V Gigabit Network Connection 1043 849c P8P67 Deluxe Motherboard @@ -22927,6 +23671,8 @@ 17aa 1074 ThinkServer I350-T4 AnyFabric 17aa 4005 I350 Gigabit Network Connection 18d4 0c07 I350 1Gb 2-port RJ45 OCP Mezz Card MOP41-I-1GT2 + 193d 1005 360T-B + 193d 1007 360T-L 1bd4 001d 1G base-T QP EP014Ti1 Adapter 1bd4 0035 1G base-T QP EP014Ti1 Adapter 8086 0001 Ethernet Server Adapter I350-T4 @@ -22970,6 +23716,7 @@ 108e 7b14 Sun Dual Port 10 GbE PCIe 2.0 ExpressModule, Base-T 108e 7b15 Sun Dual Port 10 GbE PCIe 2.0 Low Profile Adapter, Base-T 1137 00bf Ethernet Converged Network Adapter X540-T2 + 1170 0052 Ethernet Controller 10-Gigabit X540-AT2 17aa 1073 ThinkServer X540-T2 AnyFabric 17aa 4006 Ethernet Controller 10-Gigabit X540-AT2 1bd4 001a 10G base-T DP ER102Ti3 Rack Adapter @@ -22985,6 +23732,7 @@ 1529 82599 10 Gigabit Dual Port Network Connection with FCoE 152a 82599 10 Gigabit Dual Port Backplane Connection with FCoE 152e 82599 Virtual Function + 152f I350 Virtual Function 1530 X540 Virtual Function 1533 I210 Gigabit Network Connection 103c 0003 Ethernet I210-T1 GbE NIC @@ -23015,7 +23763,7 @@ 8086 011a Ethernet Converged Network Adapter X520-4 8086 011b Ethernet Converged Network Adapter X520-4 8086 011c Ethernet Converged Network Adapter X520-4 - 154c XL710/X710 Virtual Function + 154c Ethernet Virtual Function 700 Series 154d Ethernet 10G 2P X520 Adapter 8086 7b11 10GbE 2P X520 Adapter 1557 82599 10 Gigabit Network Connection @@ -23038,11 +23786,16 @@ 1563 Ethernet Controller 10G X550T 1028 1fa8 Ethernet 10G 4P X550/I350 rNDC 1028 1fa9 Ethernet 10G 4P X550 rNDC + 14c0 1201 X550 10Gb 2P RJ45 OCP Mezz 1590 00d1 Ethernet 10Gb 2-port 562T Adapter 1590 00d2 Ethernet 10Gb 2-port 562FLR-T Adapter 18d4 0c08 X550 10Gb 2-port RJ45 OCP Mezz Card MOP81-I-10GT2 + 193d 1008 560T-B + 193d 1009 560T-L 8086 0001 Ethernet Converged Network Adapter X550-T2 8086 001a Ethernet Converged Network Adapter X550-T2 + 8086 001b Ethernet Server Adapter X550-T2 for OCP + 8086 001d Ethernet 10G 2P X550-t Adapter 8086 0022 Ethernet Converged Network Adapter X550-T2 1564 X550 Virtual Function 1565 X550 Virtual Function @@ -23056,7 +23809,7 @@ 156d DSL5520 Thunderbolt 2 Bridge [Falcon Ridge 4C 2013] 156f Ethernet Connection I219-LM 1570 Ethernet Connection I219-V - 1571 XL710/X710 Virtual Function + 1571 Ethernet Virtual Function 700 Series 1572 Ethernet Controller X710 for 10GbE SFP+ 1028 0000 Ethernet 10G X710 rNDC 1028 1f99 Ethernet 10G 4P X710/I350 rNDC @@ -23073,6 +23826,7 @@ 17aa 0000 ThinkServer X710 AnyFabric for 10GbE SFP+ 17aa 4001 ThinkServer X710-4 AnyFabric for 10GbE SFP+ 17aa 4002 ThinkServer X710-2 AnyFabric for 10GbE SFP+ + 19e5 d11c Ethernet 2-port X710 10Gb SFP+ Adapter SP330 8086 0000 Ethernet Converged Network Adapter X710 8086 0001 Ethernet Converged Network Adapter X710-4 8086 0002 Ethernet Converged Network Adapter X710-4 @@ -23086,6 +23840,7 @@ 8086 000b Ethernet Server Adapter X710-DA2 for OCP 8086 000d Ethernet Controller X710 for 10GbE SFP+ 8086 000e Ethernet Server Adapter OCP X710-2 + 8086 000f Ethernet Server Adapter OCP X710-2 8086 0010 Ethernet Converged Network Adapter X710 8086 4005 Ethernet Controller X710 for 10GbE SFP+ 8086 4006 Ethernet Controller X710 for 10GbE SFP+ @@ -23146,6 +23901,7 @@ 8086 00a0 Ethernet Converged Network Adapter X710-T4 8086 1003 Ethernet Converged Network Adapter X710-T 158a Ethernet Controller XXV710 for 25GbE backplane + 8086 000a Ethernet 25G 2P XXV710 Mezz 158b Ethernet Controller XXV710 for 25GbE SFP28 8086 0000 Ethernet Network Adapter XXV710 8086 0001 Ethernet Network Adapter XXV710-2 @@ -23156,6 +23912,7 @@ 8086 0006 Ethernet Network Adapter OCP XXV710-2 8086 0007 Ethernet Network Adapter OCP XXV710-1 8086 0008 Ethernet Network Adapter OCP XXV710-1 + 8086 0009 Ethernet 25G 2P XXV710 Adapter 8086 4001 Ethernet Network Adapter XXV710-2 15a0 Ethernet Connection (2) I218-LM 15a1 Ethernet Connection (2) I218-V @@ -23185,22 +23942,49 @@ 15be Ethernet Connection (6) I219-V 15bf JHL6240 Thunderbolt 3 NHI (Low Power) [Alpine Ridge LP 2016] 15c0 JHL6240 Thunderbolt 3 Bridge (Low Power) [Alpine Ridge LP 2016] + 15c2 Ethernet Connection X553 Backplane + 15c3 Ethernet Connection X553 Backplane + 15c4 Ethernet Connection X553 10 GbE SFP+ 15c5 X553 Virtual Function - 15d0 Ethernet SDI Adapter FM10420-100GbE-QDA2 + 15c6 Ethernet Connection X553 1GbE + 15c7 Ethernet Connection X553 1GbE + 15c8 Ethernet Connection X553/X557-AT 10GBASE-T + 15ce Ethernet Connection X553 10 GbE SFP+ + 15d0 Ethernet SDI Adapter + 8086 0001 Ethernet SDI Adapter FM10420-100GbE-QDA2 + 8086 0002 Ethernet SDI Adapter FM10840-MTP2 15d1 Ethernet Controller 10G X550T 8086 0002 Ethernet Converged Network Adapter X550-T1 + 8086 001b Ethernet Server Adapter X550-T1 for OCP 8086 0021 Ethernet Converged Network Adapter X550-T1 8086 00a2 Ethernet Converged Network Adapter X550-T1 15d2 JHL6540 Thunderbolt 3 NHI (C step) [Alpine Ridge 4C 2016] 15d3 JHL6540 Thunderbolt 3 Bridge (C step) [Alpine Ridge 4C 2016] + 15d4 JHL6540 Thunderbolt 3 USB Controller (C step) [Alpine Ridge 4C 2016] 15d5 Ethernet SDI Adapter FM10420-25GbE-DA2 8086 0001 Intel(R) Ethernet SDI Adapter FM10420-25GbE-DA2 15d6 Ethernet Connection (5) I219-V 15d7 Ethernet Connection (4) I219-LM 15d8 Ethernet Connection (4) I219-V + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen 15d9 JHL6340 Thunderbolt 3 NHI (C step) [Alpine Ridge 2C 2016] 15da JHL6340 Thunderbolt 3 Bridge (C step) [Alpine Ridge 2C 2016] + 15df Ethernet Connection (8) I219-LM + 15e0 Ethernet Connection (8) I219-V + 15e1 Ethernet Connection (9) I219-LM + 15e2 Ethernet Connection (9) I219-V 15e3 Ethernet Connection (5) I219-LM + 15e4 Ethernet Connection X553 1GbE + 15e5 Ethernet Connection X553 1GbE + 15e7 JHL7540 Thunderbolt 3 Bridge [Titan Ridge 2C 2018] + 15e8 JHL7540 Thunderbolt 3 NHI [Titan Ridge 2C 2018] + 15e9 JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 2C 2018] + 15ea JHL7540 Thunderbolt 3 Bridge [Titan Ridge 4C 2018] + 15eb JHL7540 Thunderbolt 3 NHI [Titan Ridge 4C 2018] + 15ec JHL7540 Thunderbolt 3 USB Controller [Titan Ridge 4C 2018] + 15ef JHL7540 Thunderbolt 3 Bridge [Titan Ridge DD 2018] + 15f0 JHL7540 Thunderbolt 3 USB Controller [Titan Ridge DD 2018] 1600 Broadwell-U Host Bridge -OPI 1601 Broadwell-U PCI Express x16 Controller 1602 Broadwell-U Integrated Graphics @@ -23239,31 +24023,34 @@ 163b Broadwell-U Integrated Graphics 163d Broadwell-U Integrated Graphics 163e Broadwell-U Integrated Graphics - 1900 Skylake Host Bridge/DRAM Registers - 1901 Skylake PCIe Controller (x16) + 1889 Ethernet Adaptive Virtual Function + 1900 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1901 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16) 1902 HD Graphics 510 - 1903 Skylake Processor Thermal Subsystem - 1904 Skylake Host Bridge/DRAM Registers + 1903 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem + 1904 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers 1028 06f3 Latitude 3570 17aa 382a B51-80 Laptop - 1905 Skylake PCIe Controller (x8) + 1905 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x8) 1906 HD Graphics 510 17aa 382a B51-80 Laptop - 1908 Skylake Host Bridge/DRAM Registers - 1909 Skylake PCIe Controller (x4) - 190c Skylake Host Bridge/DRAM Registers - 190f Skylake Host Bridge/DRAM Registers - 1910 Skylake Host Bridge/DRAM Registers - 1911 Skylake Gaussian Mixture Model + 1908 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1909 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x4) + 190c Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 190f Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1910 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1911 Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th Gen Core Processor Gaussian Mixture Model + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen 1912 HD Graphics 530 - 1916 HD Graphics 520 + 1916 Skylake GT2 [HD Graphics 520] 1028 06f3 Latitude 3570 - 1918 Skylake Host Bridge/DRAM Registers - 1919 Skylake Imaging Unit + 1918 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers + 1919 Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Imaging Unit 191b HD Graphics 530 191d HD Graphics P530 191e HD Graphics 515 - 191f Skylake Host Bridge/DRAM Registers + 191f Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Host Bridge/DRAM Registers 1921 HD Graphics 520 1926 Iris Graphics 540 1927 Iris Graphics 550 @@ -23341,37 +24128,43 @@ 1b48 82597EX 10GbE Ethernet Controller 8086 a01f PRO/10GbE LR Server Adapter 8086 a11f PRO/10GbE LR Server Adapter - 1c00 6 Series/C200 Series Chipset Family 4 port SATA IDE Controller - 1c01 6 Series/C200 Series Chipset Family 4 port SATA IDE Controller - 1c02 6 Series/C200 Series Chipset Family SATA AHCI Controller + 1c00 6 Series/C200 Series Chipset Family Desktop SATA Controller (IDE mode, ports 0-3) + 1c01 6 Series/C200 Series Chipset Family Mobile SATA Controller (IDE mode, ports 0-3) + 1c02 6 Series/C200 Series Chipset Family 6 port Desktop SATA AHCI Controller 1028 04aa XPS 8300 1043 844d P8 series motherboard 8086 7270 Server Board S1200BTS - 1c03 6 Series/C200 Series Chipset Family 6 port SATA AHCI Controller + 1c03 6 Series/C200 Series Chipset Family 6 port Mobile SATA AHCI Controller 1028 04a3 Precision M4600 1028 04b2 Vostro 3350 1028 04da Vostro 3750 + 17aa 21cf ThinkPad T520 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] - 1c04 6 Series/C200 Series Chipset Family SATA RAID Controller + 1c04 6 Series/C200 Series Desktop SATA RAID Controller 103c 3118 Smart Array B110i SATA RAID Controller - 1c05 6 Series/C200 Series Chipset Family SATA RAID Controller - 1c08 6 Series/C200 Series Chipset Family 2 port SATA IDE Controller - 1c09 6 Series/C200 Series Chipset Family 2 port SATA IDE Controller + 1c05 6 Series/C200 Series Mobile SATA RAID Controller + 1c06 Z68 Express Chipset SATA RAID Controller + 1c08 6 Series/C200 Series Chipset Family Desktop SATA Controller (IDE mode, ports 4-5) + 1c09 6 Series/C200 Series Chipset Family Mobile SATA Controller (IDE mode, ports 4-5) 1c10 6 Series/C200 Series Chipset Family PCI Express Root Port 1 1028 04aa XPS 8300 1028 04da Vostro 3750 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 8086 7270 Server Board S1200BTS / Apple MacBook Pro 8,1/8,2 1c12 6 Series/C200 Series Chipset Family PCI Express Root Port 2 1028 04aa XPS 8300 + 17aa 21cf ThinkPad T520 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] 1c14 6 Series/C200 Series Chipset Family PCI Express Root Port 3 1028 04da Vostro 3750 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] 1c16 6 Series/C200 Series Chipset Family PCI Express Root Port 4 1028 04aa XPS 8300 + 17aa 21cf ThinkPad T520 1c18 6 Series/C200 Series Chipset Family PCI Express Root Port 5 1028 04da Vostro 3750 + 17aa 21cf ThinkPad T520 8086 7270 Server Board S1200BTS 1c1a 6 Series/C200 Series Chipset Family PCI Express Root Port 6 1028 04da Vostro 3750 @@ -23387,6 +24180,7 @@ 1028 04da Vostro 3750 1043 8418 P8P67 Deluxe Motherboard 1043 841b P8H67 Series Motherboard + 17aa 21cf ThinkPad T520 # Realtek ALC888 audio codec 8086 2008 DQ67SW board 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] @@ -23396,6 +24190,7 @@ 1028 04b2 Vostro 3350 1028 04da Vostro 3750 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 8086 7270 Server Board S1200BTS / Apple MacBook Pro 8,1/8,2 1c24 6 Series/C200 Series Chipset Family Thermal Management Controller 1c25 6 Series/C200 Series Chipset Family DMI to PCI Bridge @@ -23405,6 +24200,7 @@ 1028 04b2 Vostro 3350 1028 04da Vostro 3750 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 8086 7270 Server Board S1200BTS / Apple MacBook Pro 8,1/8,2 1c27 6 Series/C200 Series Chipset Family USB Universal Host Controller #1 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] @@ -23416,6 +24212,7 @@ 1028 04b2 Vostro 3350 1028 04da Vostro 3750 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 8086 7270 Server Board S1200BTS / Apple MacBook Pro 8,1/8,2 1c33 6 Series/C200 Series Chipset Family LAN Controller 1c35 6 Series/C200 Series Chipset Family VECI Controller @@ -23425,6 +24222,7 @@ 1028 04b2 Vostro 3350 1028 04da Vostro 3750 1043 844d P8 series motherboard + 17aa 21cf ThinkPad T520 8086 7270 Apple MacBookPro8,2 [Core i7, 15", 2011] 1c3b 6 Series/C200 Series Chipset Family MEI Controller #2 1c3c 6 Series/C200 Series Chipset Family IDE-r Controller @@ -23452,6 +24250,7 @@ 1c4e Q67 Express Chipset Family LPC Controller 1c4f QM67 Express Chipset Family LPC Controller 1028 04a3 Precision M4600 + 17aa 21cf ThinkPad T520 1c50 B65 Express Chipset Family LPC Controller 1c51 6 Series/C200 Series Chipset Family LPC Controller 1c52 C202 Chipset Family LPC Controller @@ -23612,6 +24411,7 @@ 144d c652 NP300E5C series laptop 1849 1e2d Motherboard 1e31 7 Series/C210 Series Chipset Family USB xHCI Host Controller + 103c 179b Elitebook 8470p 103c 17ab ProBook 6570b 1043 108d VivoBook X202EV 1043 1477 N56VZ @@ -23730,12 +24530,13 @@ 2018 Sky Lake-E M2PCI Registers 201a Sky Lake-E Non-Transparent Bridge Registers 201c Sky Lake-E Non-Transparent Bridge Registers + 2020 Sky Lake-E DMI3 Registers 2021 Sky Lake-E CBDMA Registers 2024 Sky Lake-E MM/Vt-d Configuration Registers - 2030 Sky Lake-E PCI Express Root Port 1A - 2031 Sky Lake-E PCI Express Root Port 1B - 2032 Sky Lake-E PCI Express Root Port 1C - 2033 Sky Lake-E PCI Express Root Port 1D + 2030 Sky Lake-E PCI Express Root Port A + 2031 Sky Lake-E PCI Express Root Port B + 2032 Sky Lake-E PCI Express Root Port C + 2033 Sky Lake-E PCI Express Root Port D 2035 Sky Lake-E RAS Configuration Registers 204c Sky Lake-E M3KTI Registers 204d Sky Lake-E M3KTI Registers @@ -23920,6 +24721,7 @@ 1028 040a Latitude E6410 1028 040b Latitude E6510 103c 0934 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 103c 309f Compaq nx9420 Notebook 103c 30a3 Compaq nw8440 @@ -24000,6 +24802,7 @@ 1043 8277 P5K PRO Motherboard 1043 844d P8 series motherboard 1458 5000 Motherboard + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7418 Wind PC MS-7418 15d9 060d C7SIM-Q Motherboard 15d9 9680 X7DBN Motherboard @@ -24375,7 +25178,7 @@ 8086 a000 D865PERL mainboard 8086 e000 D865PERL mainboard 8086 e001 Desktop Board D865GBF - 8086 e002 SoundMax Intergrated Digital Audio + 8086 e002 SoundMax Integrated Digital Audio 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller 103c 006a NX9500 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3 @@ -24471,8 +25274,11 @@ 1590 00e8 100Gb 1-port OP101 QSFP28 x16 PCIe Gen3 with Intel Omni-Path Adapter 1590 021c Apollo 100Gb 1-port Intel Omni-Path Architecture 860z Mezzanine FIO Adapter 15d9 0934 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, SIOM Module + 15d9 099b Omni-path HFI Mezz AOC, 1 Port, PCIe x16. 1cb8 0001 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600 QSFP28 1cb8 0002 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC6600 Fixed Port + 1cb8 0003 Omni-Path HFI Adapter 100 Series, 2 Port, 2 PCIe x16, Earth Simulation QSFP28 + 1cb8 0004 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16, TC4600E QSFP28 8086 2628 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x16 8086 2629 Omni-Path HFI Adapter 100 Series, 1 Port, PCIe x8 8086 262a Omni-Path HFI Adapter 100 Series, 2 Ports, Split PCIe x16 @@ -24481,12 +25287,15 @@ 24f3 Wireless 8260 # Snow Field Peak AC 8086 0010 Dual Band Wireless-AC 8260 + 8086 1010 Dual Band Wireless-AC 8260 24f4 Wireless 8260 # Snow Field Peak AC 8086 0030 Dual Band Wireless-AC 8260 + 24fb Dual Band Wireless-AC 3168NGW [Stone Peak] 24fd Wireless 8265 / 8275 # Windstorm Peak 8086 0010 Dual Band Wireless-AC 8265 + 8086 1130 Dual Band Wireless-AC 8265 2500 82820 820 (Camino) Chipset Host Bridge (MCH) 1028 0095 Precision Workstation 220 Chipset 1043 801c P3C-2000 system chipset @@ -24496,6 +25305,7 @@ 250f 82820 820 (Camino) Chipset AGP Bridge 2520 82805AA MTH Memory Translator Hub 2521 82804AA MRH-S Memory Repeater Hub for SDRAM + 2526 Wireless-AC 9260 2530 82850 850 (Tehama) Chipset Host Bridge (MCH) 1028 00c7 Dimension 8100 147b 0507 TH7II-RAID @@ -24582,6 +25392,7 @@ 1014 0575 ThinkPad X41 / Z60t 1028 0182 Latitude C610 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 104d 81b7 Vaio VGN-S3XP a304 81b7 Vaio VGN-S3XP @@ -24766,6 +25577,7 @@ 2641 82801FBM (ICH6M) LPC Interface Bridge 1014 0568 ThinkPad X41 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge 2651 82801FB/FW (ICH6/ICH6W) SATA Controller @@ -24786,6 +25598,7 @@ 1028 0177 Dimension 8400 1028 0179 Optiplex GX280 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 1043 80a6 P5GD1-VW Mainboard 1458 2558 GA-8I915ME-G Mainboard @@ -24799,6 +25612,7 @@ 1028 0177 Dimension 8400 1028 0179 Optiplex GX280 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 1043 80a6 P5GD1-VW Mainboard 1458 2659 GA-8I915ME-G Mainboard @@ -24812,6 +25626,7 @@ 1028 0177 Dimension 8400 1028 0179 Optiplex GX280 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 1043 80a6 P5GD1-VW Mainboard 1458 265a GA-8I915ME-G Mainboard @@ -24837,6 +25652,7 @@ 1028 0177 Dimension 8400 1028 0179 Optiplex GX280 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 1043 80a6 P5GD1-VW Mainboard 1458 5006 GA-8I915ME-G Mainboard @@ -24848,12 +25664,14 @@ e4bf 58b1 XB1 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 103c 0934 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 e4bf 0ccd CCD-CALYPSO e4bf 0cd3 CD3-JIVE e4bf 58b1 XB1 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2 103c 0934 Compaq nw8240 Mobile Workstation + 103c 0944 Compaq nc6220 Notebook PC e4bf 0ccd CCD-CALYPSO e4bf 0cd3 CD3-JIVE e4bf 58b1 XB1 @@ -24907,6 +25725,7 @@ 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller 1028 0177 Dimension 8400 103c 0934 Compaq nw8240/nx8220 + 103c 0944 Compaq nc6220 Notebook PC 103c 099c NX6110/NC6120 1043 80a6 P5GD1-VW Mainboard 1458 266f GA-8I915ME-G Mainboard @@ -24979,6 +25798,12 @@ 103c 31fe ProLiant DL140 G3 15d9 8680 X7DVL-E-O motherboard 15d9 9680 X7DBN Motherboard + 2700 Optane SSD 900P Series + 8086 3900 900P Series [Add-in Card] + 8086 3901 900P Series [2.5" SFF] + 2701 Optane DC P4800X Series SSD + 8086 3904 DC P4800X Series [Add-in Card] + 8086 3905 DC P4800X Series [2.5" SFF] 2770 82945G/GZ/P/PL Memory Controller Hub 1028 01ad OptiPlex GX620 103c 2a3b Pavilion A1512X @@ -25009,6 +25834,7 @@ 2792 Mobile 915GM/GMS/910GML Express Graphics Controller 1014 0582 ThinkPad X41 103c 099c NX6110/NC6120 + 103c 308a Compaq nc6220 Notebook PC 1043 1881 GMA 900 915GM Integrated Graphics e4bf 0ccd CCD-CALYPSO e4bf 0cd3 CD3-JIVE @@ -25358,6 +26184,7 @@ 103c 30d9 Presario C700 104d 9005 Vaio VGN-FZ260E 104d 902d VAIO VGN-NR120E + 17aa 20a5 ThinkPad R61 17c0 4083 Medion WIM 2210 Notebook PC [MD96850] 2820 82801H (ICH8 Family) 4 port SATA Controller [IDE mode] 1028 01da OptiPlex 745 @@ -25366,7 +26193,8 @@ 2822 SATA Controller [RAID mode] 1028 020d Inspiron 530 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 2823 C610/X99 series chipset sSATA Controller [RAID mode] 2824 82801HB (ICH8) 4 port SATA Controller [AHCI mode] 1043 81ec P5B @@ -25384,6 +26212,7 @@ 2828 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [IDE mode] 1028 01f3 Inspiron 1420 103c 30c0 Compaq 6710b + 17aa 20a8 ThinkPad R61 e4bf cc47 CCG-RUMBA 2829 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] 1025 0121 Aspire 5920G @@ -25540,7 +26369,7 @@ 284b 82801H (ICH8 Family) HD Audio Controller 1025 011f Realtek ALC268 audio codec 1025 0121 Aspire 5920G - 1025 0145 Realtek ALC889 (Aspire 8920G w. Dolby Theather) + 1025 0145 Realtek ALC889 (Aspire 8920G w. Dolby Theater) 1028 01da OptiPlex 745 1028 01f3 Inspiron 1420 1028 01f9 Latitude D630 @@ -25581,6 +26410,7 @@ 1028 020d Inspiron 530 103c 2a6f Asus IPIBL-LB Motherboard 1043 8277 P5K PRO Motherboard + 1462 7345 MS-7345 Motherboard 8086 5044 Desktop Board DP35DP 2917 ICH9M-E LPC Interface Controller e4bf cc4d CCM-BOOGIE @@ -25595,14 +26425,16 @@ 1028 0210 PowerEdge T300 onboard SATA Controller 1028 0211 Optiplex 755 1028 023c PowerEdge R200 onboard SATA Controller - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801IR [ICH9R] 2921 82801IB (ICH9) 2 port SATA Controller [IDE mode] 1028 0235 PowerEdge R710 SATA IDE Controller 1028 0236 PowerEdge R610 SATA IDE Controller 1028 0237 PowerEdge T610 SATA IDE Controller 1462 7360 G33/P35 Neo 2922 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801IR [ICH9R] 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP 2923 82801IB (ICH9) 4 port SATA Controller [AHCI mode] @@ -25614,7 +26446,8 @@ 1028 020f PowerEdge R300 onboard SATA Controller 1028 0210 PowerEdge T300 onboard SATA Controller 1028 0211 Optiplex 755 - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801IR [ICH9R] 1462 7360 G33/P35 Neo 2928 82801IBM/IEM (ICH9M/ICH9M-E) 2 port SATA Controller [IDE mode] 2929 82801IBM/IEM (ICH9M/ICH9M-E) 4 port SATA Controller [AHCI mode] @@ -25628,7 +26461,8 @@ 1028 0211 Optiplex 755 103c 2a6f Asus IPIBL-LB Motherboard 103c 3628 dv6-1190en - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP @@ -25648,7 +26482,8 @@ 1028 029c PowerEdge M710 USB UHCI Controller 1028 2011 Optiplex 755 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP @@ -25665,7 +26500,8 @@ 1028 0287 PowerEdge M610 onboard UHCI 1028 029c PowerEdge M710 USB UHCI Controller 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP @@ -25680,7 +26516,8 @@ 1028 0287 PowerEdge M610 onboard UHCI 1028 029c PowerEdge M710 USB UHCI Controller 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP @@ -25695,7 +26532,8 @@ 1028 029c PowerEdge M710 USB UHCI Controller 1028 2011 Optiplex 755 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 2937 Optiplex 755 @@ -25711,7 +26549,8 @@ 1028 0287 PowerEdge M610 onboard UHCI 1028 029c PowerEdge M710 USB UHCI Controller 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 2938 Optiplex 755 @@ -25722,7 +26561,8 @@ 1028 0210 PowerEdge T300 onboard UHCI 1028 0237 PowerEdge T610 USB UHCI Controller 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP @@ -25739,7 +26579,8 @@ 1028 0287 PowerEdge M610 onboard EHCI 1028 029c PowerEdge M710 USB EHCI Controller 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP @@ -25753,7 +26594,8 @@ 1028 0287 PowerEdge M610 onboard EHCI 1028 029c PowerEdge M710 USB EHCI Controller 103c 2a6f Asus IPIBL-LB Motherboard - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 293c Optiplex 755 @@ -25764,7 +26606,8 @@ 1028 0211 Optiplex 755 103c 2a6f Asus IPIBL-LB Motherboard 103c 3628 dv6-1190en - 1043 829f P5K PRO Motherboard + 1043 829f P5K PRO Motherboard: 82801IR [ICH9R] + 1462 735a MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 293e Optiplex 755 @@ -25774,8 +26617,8 @@ 1028 020d Inspiron 530 1028 0211 Optiplex 755 103c 2a6f Asus IPIBL-LB Motherboard -# same ID possibly also on other ASUS boards - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 8086 2940 Optiplex 755 2942 82801I (ICH9 Family) PCI Express Port 2 1028 020d Inspiron 530 @@ -25786,12 +26629,12 @@ 1028 020d Inspiron 530 2948 82801I (ICH9 Family) PCI Express Port 5 1028 020d Inspiron 530 -# same ID possibly also on other ASUS boards - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 294a 82801I (ICH9 Family) PCI Express Port 6 1028 020d Inspiron 530 -# same ID possibly also on other ASUS boards - 1043 8277 P5K PRO Motherboard + 1043 8277 P5K PRO Motherboard: 82801IR [ICH9R] + 1462 7345 MS-7345 Motherboard: Intel 82801I/IR [ICH9/ICH9R] 294c 82566DC-2 Gigabit Network Connection 17aa 302e 82566DM-2 Gigabit Network Connection 2970 82946GZ/PL/GL Memory Controller Hub @@ -25845,16 +26688,15 @@ 29c0 82G33/G31/P35/P31 Express DRAM Controller 1028 020d Inspiron 530 103c 2a6f Asus IPIBL-LB Motherboard -# same ID possibly also on other ASUS boards - 1043 8276 P5K PRO Motherboard + 1043 8276 P5K PRO Motherboard: Intel 82P35 Northbridge 1043 82b0 P5KPL-VM Motherboard + 1462 7345 MS-7345 Motherboard: Intel 82G33/P35 Northbridge 1462 7360 G33/P35 Neo 1af4 1100 QEMU Virtual Machine 8086 5044 Desktop Board DP35DP 29c1 82G33/G31/P35/P31 Express PCI Express Root Port 1028 020d Inspiron 530 -# same ID possibly also on other ASUS boards - 1043 8276 P5K PRO Motherboard + 1043 8276 P5K PRO Motherboard: Intel 82P35 Northbridge 29c2 82G33/G31 Express Integrated Graphics Controller 1028 020d Inspiron 530 1043 82b0 P5KPL-VM Motherboard @@ -25909,16 +26751,16 @@ 103c 30c0 Compaq 6710b 103c 30d9 Presario C700 104d 902d VAIO VGN-NR120E - 17aa 20b5 ThinkPad T61/R61 - 17c0 4082 Medion WIM 2210 Notebook PC [MD96850] + 17aa 20b5 GM965 [X3100] on ThinkPad T61/R61 + 17c0 4082 GM965 on Medion WIM 2210 Notebook PC [MD96850] e4bf cc47 CCG-RUMBA 2a03 Mobile GM965/GL960 Integrated Graphics Controller (secondary) 1028 01f3 Inspiron 1420 103c 30c0 Compaq 6710b 103c 30d9 Presario C700 104d 902d VAIO VGN-NR120E - 17aa 20b5 ThinkPad T61/R61 - 17c0 4082 Medion WIM 2210 Notebook PC [MD96850] + 17aa 20b5 GM965 [X3100] on ThinkPad T61/R61 + 17c0 4082 GM965 on Medion WIM 2210 Notebook PC [MD96850] e4bf cc47 CCG-RUMBA 2a04 Mobile PM965/GM965 MEI Controller 103c 30c1 Compaq 6910p @@ -26620,7 +27462,7 @@ 372b Xeon C5500/C3500 Core 372c Xeon C5500/C3500 Reserved 373f Xeon C5500/C3500 IOxAPIC - 37cd X722 Virtual Function + 37cd Ethernet Virtual Function 700 Series 37ce Ethernet Connection X722 for 10GbE backplane 1590 0215 Ethernet 10Gb 2-port 568i Adapter 17aa 4023 Intel Ethernet Connection X722 for 10GbE backplane @@ -26630,12 +27472,13 @@ 17aa 4021 Intel Ethernet Connection X722 for 10G SFP+ 17aa 4022 Ethernet Connection X722 for 10GbE SFP+ 37d1 Ethernet Connection X722 for 1GbE + 14cd 0010 88E1514 Ethernet OCP 2x1G RJ45 Phy Card [USI-1514-1GbaseT] 1590 0216 Ethernet 1Gb 2-port 368i Adapter 1590 0217 Ethernet 1Gb 2-port 368FLR-MMT Adapter 1590 0247 Ethernet 1Gb 4-port 369i Adapter - 17aa 4020 Intel Ethernet Connection X722 for 1GbE - 17aa 4021 Intel Ethernet Connection X722 for 1GbE - 17aa 4022 Intel Ethernet Connection X722 for 1GbE + 17aa 4020 Ethernet Connection X722 for 1GbE + 17aa 4021 Ethernet Connection X722 for 1GbE + 17aa 4022 Ethernet Connection X722 for 1GbE 37d2 Ethernet Connection X722 for 10GBASE-T 14cd 0030 Ethernet OCP 2x10G RJ45 Phy Card [USI-X557-10GbaseT] 1590 0218 Ethernet 10Gb 2-port 568FLR-MMT Adapter @@ -27041,7 +27884,7 @@ 4117 Atom Processor E6xx PCI Host Bridge #4 4220 PRO/Wireless 2200BG [Calexico2] Network Connection 103c 0934 Compaq nw8240/nx8220 - 103c 12f6 nc6120/nx8220/nw8240 + 103c 12f6 nc6120/nc6220/nw8240/nx8220 8086 2701 WM3B2200BG Mini-PCI Card 8086 2712 IBM ThinkPad R50e 8086 2721 Dell B130 laptop integrated WLAN @@ -27064,7 +27907,7 @@ 4224 PRO/Wireless 2915ABG [Calexico2] Network Connection 4227 PRO/Wireless 3945ABG [Golan] Network Connection 8086 1010 ThinkPad R60e - 8086 1011 ThinkPad T60/R60e/X60s + 8086 1011 ThinkPad T60/R60e/X60s/R61 8086 1014 PRO/Wireless 3945BG Network Connection 4229 PRO/Wireless 4965 AG or AGN [Kedron] Network Connection 8086 1100 Vaio VGN-SZ79SN_C @@ -27183,7 +28026,19 @@ 5845 QEMU NVM Express Controller 1af4 1100 QEMU Virtual Machine 5902 HD Graphics 610 + 5904 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 590f Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 5910 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers 5912 HD Graphics 630 + 5914 Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers + 5916 HD Graphics 620 + 17aa 2248 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen + 5917 UHD Graphics 620 + 591d HD Graphics P630 + 591f Intel Kaby Lake Host Bridge 5a84 Celeron N3350/Pentium N4200/Atom E3900 Series Integrated Graphics Controller 5a88 Celeron N3350/Pentium N4200/Atom E3900 Series Imaging Unit 5a98 Celeron N3350/Pentium N4200/Atom E3900 Series Audio Cluster @@ -27598,6 +28453,8 @@ 8c26 8 Series/C220 Series Chipset Family USB EHCI #1 103c 1909 ZBook 15 17aa 220e ThinkPad T440p + 17aa 2210 ThinkPad T540p + 2210 17aa ThinkPad T540p 8c2d 8 Series/C220 Series Chipset Family USB EHCI #2 103c 1909 ZBook 15 17aa 220e ThinkPad T440p @@ -27860,6 +28717,8 @@ 9d03 Sunrise Point-LP SATA Controller [AHCI mode] 1028 06f3 Latitude 3570 17aa 382a B51-80 Laptop + 9d10 Sunrise Point-LP PCI Express Root Port #1 + 9d12 Sunrise Point-LP PCI Express Root Port #3 9d14 Sunrise Point-LP PCI Express Root Port #5 17aa 382a B51-80 Laptop 9d15 Sunrise Point-LP PCI Express Root Port #6 @@ -27868,11 +28727,15 @@ 9d17 Sunrise Point-LP PCI Express Root Port #8 9d18 Sunrise Point-LP PCI Express Root Port #9 17aa 382a B51-80 Laptop + 9d19 Sunrise Point-LP PCI Express Root Port #10 9d21 Sunrise Point-LP PMC 1028 06f3 Latitude 3570 + 17aa 224f ThinkPad X1 Carbon 5th Gen 17aa 382a B51-80 Laptop 9d23 Sunrise Point-LP SMBus 1028 06f3 Latitude 3570 + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen 17aa 382a B51-80 Laptop 9d27 Sunrise Point-LP Serial IO UART Controller #0 9d28 Sunrise Point-LP Serial IO UART Controller #1 @@ -27881,17 +28744,27 @@ 9d2d Sunrise Point-LP Secure Digital IO Controller 9d2f Sunrise Point-LP USB 3.0 xHCI Controller 1028 06f3 Latitude 3570 + 17aa 2247 ThinkPad T570 17aa 382a B51-80 Laptop 9d31 Sunrise Point-LP Thermal subsystem 1028 06f3 Latitude 3570 + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen 17aa 382a B51-80 Laptop + 9d35 Sunrise Point-LP Integrated Sensor Hub 9d3a Sunrise Point-LP CSME HECI #1 1028 06f3 Latitude 3570 + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen 17aa 382a B51-80 Laptop 9d43 Sunrise Point-LP LPC Controller 17aa 382a B51-80 Laptop 9d48 Sunrise Point-LP LPC Controller 1028 06f3 Latitude 3570 + 9d56 Sunrise Point-LP LPC Controller + 9d58 Sunrise Point-LP LPC Controller + 17aa 2247 ThinkPad T570 + 17aa 224f ThinkPad X1 Carbon 5th Gen 9d60 Sunrise Point-LP Serial IO I2C Controller #0 1028 06f3 Latitude 3570 8086 9d60 100 Series PCH/Sunrise Point PCH I2C0 [Skylake/Kaby Lake LPSS I2C] @@ -27904,6 +28777,7 @@ 9d70 Sunrise Point-LP HD Audio 1028 06f3 Latitude 3570 17aa 382a B51-80 Laptop + 9d71 Sunrise Point-LP HD Audio a000 Atom Processor D4xx/D5xx/N4xx/N5xx DMI Bridge 1458 5000 GA-D525TUD 8086 4f4d DeskTop Board D510MO @@ -28003,6 +28877,7 @@ a169 Sunrise Point-H PCI Root Port #19 a16a Sunrise Point-H PCI Root Port #20 a170 Sunrise Point-H HD Audio + a171 CM238 HD Audio Controller a182 Lewisburg SATA Controller [AHCI mode] a186 Lewisburg SATA Controller [RAID mode] a190 Lewisburg PCI Express Root Port #1 @@ -28027,6 +28902,7 @@ a1a3 Lewisburg SMBus a1a4 Lewisburg SPI Controller a1af Lewisburg USB 3.0 xHCI Controller + a1b1 Lewisburg Thermal Subsystem a1ba Lewisburg CSME: HECI #1 a1bb Lewisburg CSME: HECI #2 a1bc Lewisburg CSME: IDE-r @@ -28274,7 +29150,7 @@ 9004 7888 AHA-2930UW SCSI Controller 8b78 ABA-1030 ec78 AHA-4944W/UW -# acquired by PMC-Sierra +# acquired by Microsemi 9005 Adaptec 0010 AHA-2940U2/U2W 9005 2180 AHA-2940U2 SCSI Controller @@ -28472,6 +29348,53 @@ 9005 0552 Series 8 - ASR-8805 - 8 internal 0 external 12G SAS Port/PCIe 3.0 9005 0553 Series 8 - ASR-8085 - 0 internal 8 external 12G SAS Port/PCIe 3.0 9005 0554 Series 8 - ASR-8885 - 8 internal 8 external 12G SAS Port/PCIe 3.0 + 028f Smart Storage PQI 12G SAS/PCIe 3 + 103c 0600 Smart Array P408i-p SR Gen10 + 103c 0601 Smart Array P408e-p SR Gen10 + 103c 0602 Smart Array P408i-a SR Gen10 + 103c 0603 Smart Array P408i-c SR Gen10 + 103c 0650 Smart Array E208i-p SR Gen10 + 103c 0651 Smart Array E208e-p SR Gen10 + 103c 0652 Smart Array E208i-c SR Gen10 + 103c 0654 Smart Array E208i-a SR Gen10 + 103c 0655 Smart Array P408e-m SR Gen10 + 103c 0700 Smart Array P204i-c SR Gen10 + 103c 0701 Smart Array P204i-b SR Gen10 + 103c 1100 Smart Array P816i-a SR Gen10 + 103c 1101 Smart Array P416ie-m SR G10 + 152d 8a22 QS-8204-8i + 152d 8a23 QS-8238-16i + 152d 8a24 QS-8236-16i + 152d 8a36 QS-8240-24i + 152d 8a37 QS-8242-24i + 9005 0800 SmartRAID 3154-8i + 9005 0801 SmartRAID 3152-8i + 9005 0802 SmartRAID 3151-4i + 9005 0803 SmartRAID 3101-4i + 9005 0804 SmartRAID 3154-8e + 9005 0805 SmartRAID 3102-8i + 9005 0806 SmartRAID 3100 + 9005 0807 SmartRAID 3162-8i + 9005 0900 SmartHBA 2100-8i + 9005 0901 SmartHBA 2100-4i + 9005 0902 HBA 1100-8i + 9005 0903 HBA 1100-4i + 9005 0904 SmartHBA 2100-8e + 9005 0905 HBA 1100-8e + 9005 0906 SmartHBA 2100-4i4e + 9005 0907 HBA 1100 + 9005 0908 SmartHBA 2100 + 9005 090a SmartHBA 2100A-8i + 9005 1200 SmartRAID 3154-24i + 9005 1201 SmartRAID 3154-8i16e + 9005 1202 SmartRAID 3154-8i8e + 9005 1280 HBA 1100-16i + 9005 1281 HBA 1100-16e + 9005 1300 HBA 1100-8i8e + 9005 1301 HBA 1100-24i + 9005 1302 SmartHBA 2100-8i8e + 9005 1303 SmartHBA 2100-24i + 9005 1380 SmartRAID 3154-16i 0410 AIC-9410W SAS (Razor HBA RAID) 9005 0410 ASC-48300(Spirit RAID) 9005 0411 ASC-58300 (Oakmont RAID) @@ -28646,8 +29569,8 @@ bdbd Blackmagic Design a124 Intensity Extreme a126 Intensity Shuttle a127 UltraStudio Express - a129 UltraStudio Mini Monitor - a12a UltraStudio Mini Recorder + a129 UltraStudio Mini Recorder + a12a UltraStudio Mini Monitor a12d UltraStudio 4K a12e DeckLink 4K Extreme a12f DeckLink Mini Monitor @@ -28662,6 +29585,11 @@ bdbd Blackmagic Design a13e UltraStudio 4K Extreme a13f DeckLink Quad 2 a140 DeckLink Duo 2 + a141 UltraStudio 4K Extreme 3 + a142 UltraStudio HD Mini + a143 DeckLink Mini Recorder 4K + a144 DeckLink Mini Monitor 4K + a14b DeckLink 8K Pro c001 TSI Telsys c0a9 Micron/Crucial Technology c0de Motorola @@ -28773,9 +29701,8 @@ deaf Middle Digital Inc. 9052 PC Weasel Watchdog Timer # formerly SoftHard Technology Ltd. deda XIMEA - 4001 Camera CB -# Thunderbolt based camera MT family - 4021 Camera MT + 4001 CB or MX camera + 4021 MT camera e000 Winbond e000 W89C940 e159 Tiger Jet Network Inc. @@ -28886,9 +29813,11 @@ f1d0 AJA Video cafe Kona SD cfee Xena LS/SD-22-DA/SD-DA daff KONA LHi + db01 Corvid22 db09 Corvid 24 dcaf Kona HD dfee Xena HD-DA + eb0e Corvid 44 efac Xena SD-MM/SD-22-MM facd Xena HD-MM f5f5 F5 Networks, Inc. diff --git a/usr/src/data/hwdata/usb.ids b/usr/src/data/hwdata/usb.ids index 292affb22d..cc8556a420 100644 --- a/usr/src/data/hwdata/usb.ids +++ b/usr/src/data/hwdata/usb.ids @@ -9,8 +9,8 @@ # The latest version can be obtained from # http://www.linux-usb.org/usb.ids # -# Version: 2017.02.12 -# Date: 2017-02-12 20:34:05 +# Version: 2018.01.04 +# Date: 2018-01-04 20:34:07 # # Vendors, devices and interfaces. Please keep sorted. @@ -50,7 +50,6 @@ 0301 MIDI Port 02ad HUMAX Co., Ltd. 138c PVR Mass Storage -0300 MM300 eBook Reader 0324 OCZ Technology Inc bc06 OCZ ATV USB 2.0 Flash Drive bc08 OCZ Rally2/ATV USB 2.0 Flash Drive @@ -62,6 +61,8 @@ 0499 SE340D PC Remote Control 03da Bernd Walter Computer Technology 0002 HD44780 LCD interface +03e7 Intel + 2150 Myriad VPU [Movidius Neural Compute Stick] 03e8 EndPoints, Inc. 0004 SE401 Webcam 0008 101 Ethernet [klsi] @@ -110,6 +111,7 @@ 2106 STK600 development board 2107 AVR Dragon 2109 STK541 ZigBee Development Board + 210a AT86RF230 [RZUSBSTICK] transceiver 210d XPLAIN evaluation kit (CDC ACM) 2110 AVR JTAGICE3 Debugger and Programmer 2111 Xplained Pro board debugger and programmer @@ -156,6 +158,7 @@ 7615 AT76C505AMX Wireless Adapter 7617 AT76C505AS Wireless Adapter 7800 Mini Album + 800c Airspy HF+ ff07 Tux Droid fish dongle 03ec Iwatsu America, Inc. 03ed Mitel Corp. @@ -202,6 +205,7 @@ 0217 LaserJet 2200 0218 APOLLO P2500/2600 0221 StreamSmart 400 [F2235AA] + 0223 Digital Drive Flash Reader 022a Laserjet CP1525nw 0241 Link-5 micro dongle 0304 DeskJet 810c/812c @@ -236,6 +240,7 @@ 0611 OfficeJet K60xi 0612 business inkjet 3000 0624 Bluetooth Dongle + 0641 X1200 Optical Mouse 0701 ScanJet 5300c/5370c 0704 DeskJet 825c 0705 ScanJet 4400c @@ -314,6 +319,7 @@ 1524 Smart Card Keyboard - KR 1539 Mini Magnetic Stripe Reader 1541 Prime [G8X92AA] + 154a Laser Mouse 1602 PhotoSmart 330 series 1604 DeskJet 940c 1605 ScanJet 5530C PhotoSmart @@ -528,6 +534,7 @@ 5307 v165w Stick 5311 OfficeJet 6300 5312 Officejet Pro 8500A + 5317 Color LaserJet CP2025 series 5411 OfficeJet 4300 5511 DeskJet F300 series 5611 PhotoSmart C3180 @@ -648,6 +655,7 @@ 9c02 PhotoSmart M440 series a004 DeskJet 5850c a011 Deskjet 3050A + a407 Wireless Optical Comfort Mouse b002 PhotoSmart 7200 series b102 PhotoSmart 7200 series b107 v255w/c310w Flash Drive @@ -781,6 +789,8 @@ a951 HCP HIT GSM/GPRS modem [Cinterion MC55i] a9a0 FT2232D - Dual UART/FIFO IC - FTDI abb8 Lego Mindstorms NXTCam + b0c2 iID contactless RFID device + b0c3 iID contactless RFID device b810 US Interface Navigator (CAT and 2nd PTT lines) b811 US Interface Navigator (WKEY and FSK lines) b812 US Interface Navigator (RS232 and CONFIG lines) @@ -1114,6 +1124,7 @@ 602a i900 040b Weltrend Semiconductor 0a68 Func MS-3 gaming mouse [WT6573F MCU] + 2367 Human Interface Device [HP CalcPad 200 Calculator and Numeric Keypad] 6510 Weltrend Bar Code Reader 6520 XBOX Xploder 6533 Speed-Link Competition Pro @@ -1290,6 +1301,7 @@ 3100 IR Receiver (SB0540) 3121 WoW tap chat 3220 Sound Blaster Tactic(3D) Sigma sound card + 3232 Sound Blaster Premium HD [SBX] 3f00 E-Mu Xboard 25 MIDI Controller 3f02 E-Mu 0202 3f04 E-Mu 0404 @@ -1430,6 +1442,10 @@ 0104 ADL Re-Flashing Engine Parent 0105 Nokia Firmware Upgrade Mode 0106 ROM Parent + 010d E75 (Storage Mode) + 010e E75 (PC Suite mode) + 010f E75 (Media transfer mode) + 0110 E75 (Imaging Mode) 0154 5800 XpressMusic (PC Suite mode) 0155 5800 XpressMusic (Multimedia mode) 0156 5800 XpressMusic (Storage mode) @@ -1574,6 +1590,7 @@ 2602 USB 2.0 Hub 2640 USB 2.0 Hub 2660 Hub + 4041 Hub and media card controller 4060 Ultra Fast Media Reader 4064 Ultra Fast Media Reader 5434 Hub @@ -1615,6 +1632,9 @@ a101 remote key/mouse for P3 chip a102 remote key/mouse/storage for P3 chip a103 remote storage for P3 chip + a111 remote keyboard for P4 chip + a112 remote mouse for P4 chip + a113 remote storage for P4 chip a4a2 Ethernet (RNDIS and CDC ethernet) cdab Raritan KVM dongle 0431 Itac Systems, Inc. @@ -1781,6 +1801,8 @@ 4303 Xerox WorkCentre Pro 412 043e LG Electronics USA, Inc. 3001 AN-WF100 802.11abgn Wireless Adapter [Broadcom BCM4323] + 3004 TWFM-B003D 802.11abgn Wireless Module [Broadcom BCM43236B] + 3101 AN-WF500 802.11abgn + BT Wireless Adapter [Broadcom BCM43242] 42bd Flatron 795FT Plus Monitor 4a4d Flatron 915FT Plus Monitor 7001 MF-PD100 Soul Digital MP3 Player @@ -1859,6 +1881,7 @@ b651 Ferrari GT Rumble Force Wheel b653 RGT Force Feedback Clutch Racing Wheel b654 Ferrari GT Force Feedback Wheel + b678 T.Flight Rudder Pedals b687 TWCS Throttle b700 Tacticalboard 0450 DFI, Inc. @@ -2310,24 +2333,29 @@ 0736 Sidewinder X5 Mouse 0737 Compact Optical Mouse 500 0745 Nano Transceiver v1.0 for Bluetooth + 074a LifeCam VX-500 [1357] 0750 Wired Keyboard 600 0752 Wired Keyboard 400 075d LifeCam Cinema 0761 LifeCam VX-2000 + 0765 Xbox360 Slim Internal Wireless Module (1400) [Marvell 88W8786U] 0766 LifeCam VX-800 0768 Sidewinder X4 076c Comfort Mouse 4500 076d LifeCam HD-5000 + 0770 LifeCam VX-700 0772 LifeCam Studio 0779 LifeCam HD-3000 077f LifeChat LX-6000 Headset 0780 Comfort Curve Keyboard 3000 0797 Optical Mouse 200 + 0799 Surface Pro embedded keyboard 07a5 Wireless Receiver 1461C 07b9 Wired Keyboard 200 07ca Surface Pro 3 Docking Station Audio Device 07f8 Wired Keyboard 600 (model 1576) 07fd Nano Transceiver 1.1 + 0a00 Lumia 950 Dual SIM (RM-1118) 930a ISOUSB.SYS Intel 82930 Isochronous IO Test Board ffca Catalina fff8 Keyboard @@ -2377,7 +2405,7 @@ 081c Elitegroup ECS-C11 Camera 081d Elitegroup ECS-C11 Storage 0a00 Micro Innovations Web Cam 320 - 4d01 Comfort Keyboard + 4d01 Comfort Keyboard / Kensington Orbit Elite 4d02 Mouse-in-a-Box 4d03 Kensington Mouse-in-a-box 4d04 Mouse @@ -2395,6 +2423,7 @@ 4d75 Rocketfish RF-FLBTAD Bluetooth Adapter 4d81 Dell N889 Optical Mouse 4de7 webcam + 4e04 Lenovo Keyboard KB1021 0463 MGE UPS Systems 0001 UPS ffff UPS @@ -2459,6 +2488,7 @@ 0826 HD Webcam C525 0828 HD Webcam B990 082b Webcam C170 + 082c HD Webcam C615 082d HD Pro Webcam C920 0830 QuickClip 0836 B525 HD Webcam @@ -2466,6 +2496,7 @@ 0840 QuickCam Express 0843 Webcam C930e 0850 QuickCam Web + 085c C922 Pro Stream Webcam 0870 QuickCam Express 0890 QuickCam Traveler 0892 OrbiCam @@ -2574,6 +2605,7 @@ 0a45 960 Headset 0a4d G430 Surround Sound Gaming Headset 0a5b G933 Wireless Headset Dongle + 0a66 [G533 Wireless Headset Dongle] 0b02 C-UV35 [Bluetooth Mini-Receiver] (HID proxy mode) 8801 Video Camera b014 Bluetooth Mouse M336/M337/M535 @@ -2649,6 +2681,7 @@ c07c M-R0017 [G700s Rechargeable Gaming Mouse] c07d G502 Mouse c07e G402 Gaming Mouse + c083 G403 Prodigy Gaming Mouse c101 UltraX Media Remote c110 Harmony 785/880/885 Remote c111 Harmony 525 Remote @@ -2744,7 +2777,10 @@ c31b Compact Keyboard K300 c31c Keyboard K120 c31d Media Keyboard K200 + c31f Comfort Keyboard K290 + c328 Corded Keyboard K280e c332 G502 Proteus Spectrum Optical Mouse + c335 G910 Orion Spectrum Mechanical Keyboard c401 TrackMan Marble Wheel c402 Marble Mouse (2-button) c403 Turbo TrackMan Marble FX @@ -3106,6 +3142,7 @@ 0203 AH-K3001V 0204 iBurst Terminal 0408 FS-1320D Printer + 069b ECOSYS M2635dn 0483 STMicroelectronics 0137 BeWAN ADSL USB ST (blue or green) 0138 Unicorn II (ST70138B + MTC-20174TQ chipset) @@ -3168,6 +3205,7 @@ 9306 IT930x DVB stick 9503 ITE it9503 feature-limited DVB-T transmission chip [ccHDtv] 9507 ITE it9507 full featured DVB-T transmission chip [ccHDtv] + 9910 IT9910 chipset based grabber 048f Eicon Tech. 0490 United Microelectronics Corp. 0491 Capetronic @@ -3235,6 +3273,7 @@ 1054 S90XS Keyboard/Music Synthesizer 160f P-105 1613 Clavinova CLP535 + 1704 Steinberg UR44 2000 DGP-7 2001 DGP-5 3001 YST-MS55D USB Speaker @@ -3508,47 +3547,110 @@ 1601 DR-2080C Scanner 1607 DR-6080 Scanner 1608 DR-2580C Scanner + 1609 DR-3080CII 1700 PIXMA MP110 Scanner 1701 PIXMA MP130 Scanner 1702 MP410 Composite 1703 MP430 Composite 1704 MP330 Composite 1706 PIXMA MP750 Scanner - 1707 PIXMA MP780 Scanner - 1708 PIXMA MP760 Scanner + 1707 PIXMA MP780/MP790 + 1708 PIXMA MP760/MP770 1709 PIXMA MP150 Scanner 170a PIXMA MP170 Scanner 170b PIXMA MP450 Scanner 170c PIXMA MP500 Scanner 170d PIXMA MP800 Scanner - 170e MP800R + 170e PIXMA MP800R 1710 MP950 - 1712 MP530 + 1712 PIXMA MP530 1713 PIXMA MP830 Scanner 1714 MP160 - 1715 MP180 Storage - 1716 MP460 Composite - 1717 MP510 - 1718 MP600 Storage - 171a MP810 Storage - 171b MP960 - 1721 MP210 ser - 1723 MP470 ser + 1715 PIXMA MP180 + 1716 PIXMA MP460 + 1717 PIXMA MP510 + 1718 PIXMA MP600 + 1719 PIXMA MP600R + 171a PIXMA MP810 + 171b PIXMA MP960 + 171c PIXMA MX7600 + 1721 PIXMA MP210 + 1722 PIXMA MP220 + 1723 PIXMA MP470 1724 PIXMA MP520 series - 1725 MP610 ser - 1726 MP970 ser - 1727 MX300 ser + 1725 PIXMA MP610 + 1726 PIXMA MP970 + 1727 PIXMA MX300 1728 PIXMA MX310 series - 1729 MX700 ser + 1729 PIXMA MX700 172b MP140 ser + 172c PIXMA MX850 + 172d PIXMA MP980 + 172e PIXMA MP630 + 172f PIXMA MP620 + 1730 PIXMA MP540 + 1731 PIXMA MP480 + 1732 PIXMA MP240 + 1733 PIXMA MP260 + 1734 PIXMA MP190 + 1735 PIXMA MX860 1736 PIXMA MX320 series - 173a MP250 series printer + 1737 PIXMA MX330 + 173a PIXMA MP250 173b PIXMA MP270 All-In-One Printer - 173e MP560 - 173f Pixma MP640 Multifunction device - 1748 Pixma MG5150 - 174d MX360 ser - 176d PIXMA MG2550 + 173c PIXMA MP490 + 173d PIXMA MP550 + 173e PIXMA MP560 + 173f PIXMA MP640 + 1740 PIXMA MP990 + 1741 PIXMA MX340 + 1742 PIXMA MX350 + 1743 PIXMA MX870 + 1746 PIXMA MP280 + 1747 PIXMA MP495 + 1748 PIXMA MG5100 Series + 1749 PIXMA MG5200 Series + 174a PIXMA MG6100 Series + 174b PIXMA MG8100 Series + 174d PIXMA MX360 + 174e PIXMA MX410 + 174f PIXMA MX420 + 1750 PIXMA MX880 Series + 1752 PIXMA MG3100 Series + 1753 PIXMA MG4100 Series + 1754 PIXMA MG5300 Series + 1755 PIXMA MG6200 Series + 1756 PIXMA MG8200 Series + 1757 PIXMA MP493 + 1759 PIXMA MX370 Series + 175b PIXMA MX430 Series + 175c PIXMA MX510 Series + 175d PIXMA MX710 Series + 175e PIXMA MX890 Series + 175f PIXMA MP230 + 1762 PIXMA MG3200 Series + 1763 PIXMA MG4200 Series + 1764 PIXMA MG5400 Series + 1765 PIXMA MG6300 Series + 1766 PIXMA MX390 Series + 1768 PIXMA MX450 Series + 1769 PIXMA MX520 Series + 176a PIXMA MX720 Series + 176b PIXMA MX920 Series + 176d PIXMA MG2500 Series + 176e PIXMA MG3500 Series + 176f PIXMA MG6500 Series + 1770 PIXMA MG6400 Series + 1771 PIXMA MG5500 Series + 1772 PIXMA MG7100 Series + 1774 PIXMA MX470 Series + 1775 PIXMA MX530 Series + 177c PIXMA MG7500 Series + 177e PIXMA MG6600 Series + 177f PIXMA MG5600 Series + 1780 PIXMA MG2900 Series + 1787 PIXMA MX490 Series + 178a PIXMA MG3600 Series 178d PIXMA MG6853 1900 CanoScan LiDE 90 1901 CanoScan 8800F @@ -3594,12 +3696,12 @@ 2229 CanoScan 8600F 2602 MultiPASS C555 2603 MultiPASS C755 - 260a CAPT Printer + 260a LBP810 260e LBP-2000 2610 MPC600F 2611 SmartBase MPC400 2612 MultiPASS C855 - 2617 CAPT Printer + 2617 LBP1210 261a iR1600 261b iR1610 261c iC2300 @@ -3610,19 +3712,20 @@ 2629 FAXPHONE L75 262b LaserShot LBP-1120 Printer 262d iR C3200 - 262f MultiPASS MP730 - 2630 MultiPASS MP700 + 262f PIXMA MP730 + 2630 PIXMA MP700 2631 LASER CLASS 700 2632 FAX-L2000 2635 MPC190 2637 iR C6800 2638 iR C3100 - 263c Smartbase MP360 - 263d MP370 - 263e MP390 FAX - 263f MP375 + 263c PIXMA MP360 + 263d PIXMA MP370 + 263e PIXMA MP390 + 263f PIXMA MP375R 2646 MF5530 Scanner Device V1.9.1 2647 MF5550 Composite + 264c PIXMA MP740 264d PIXMA MP710 264e MF5630 264f MF5650 (FAX) @@ -3653,9 +3756,9 @@ 2671 iR5570/iR6570 2672 iR C3170 2673 iR 3170C EUR - 2674 L120 + 2674 FAX-L120 2675 iR2830 - 2676 CAPT Device + 2676 LBP2900 2677 iR C2570 2678 iR 2570C EUR 2679 CAPT Device @@ -3666,6 +3769,7 @@ 2686 MF6500 series 2687 iR4530 2688 LBP3460 + 2689 FAX-L180/L380S/L398S 268c iR C6870 268d iR 6870C EUR 268e iR C5870 @@ -3677,6 +3781,7 @@ 26b5 MF4200 series 26da LBP3010B printer 26e6 iR1024 + 271a LBP6000 2736 I-SENSYS MF4550d 2737 MF4410 3041 PowerShot S10 @@ -3963,6 +4068,7 @@ 3277 PowerShot SX510 HS 3278 PowerShot S200 327a SELPHY CP910 + 327b SELPHY CP820 327d Powershot ELPH 115 IS / IXUS 132 327f EOS Rebel T5 / EOS 1200D / EOS Kiss X70 3284 PowerShot D30 @@ -3986,9 +4092,12 @@ 32ad PowerShot SX410 IS 32b1 SELPHY CP1200 32b2 PowerShot G9 X + 32b4 EOS Rebel T6 32bb EOS M5 + 32bf PowerShot SX420 IS 32c1 PowerShot ELPH 180 / IXUS 175 32c2 PowerShot SX720 HS + 32d5 PowerShot SX430 IS 04aa DaeWoo Telecom, Ltd 04ab Chromatic Research 04ac Micro Audiometrics Corp. @@ -4065,6 +4174,7 @@ 0428 D7000 0429 D5100 042a D800 (ptp) + 043f D5600 0f03 PD-10 Wireless Printer Adapter 4000 Coolscan LS 40 ED 4001 LS 50 ED/Coolscan V ED @@ -4444,6 +4554,8 @@ 10fe S500 1150 fi-6230 125a PalmSecure Sensor Device - MP + 200f Sigma DP2 (Mass Storage) + 2010 Sigma DP2 (PictBridge) 201d SATA 3.0 6Gbit/s Adaptor [GROOVY] 04c6 Toshiba America Electronic Components 04c7 Micro Macro Technologies @@ -4549,6 +4661,7 @@ 01bf FinePix F6000fd/S6500fd Zoom (PTP) 01c0 FinePix F20 (PTP) 01c1 FinePix F31fd (PTP) + 01c3 FinePix S5 Pro 01c4 FinePix S5700 Zoom (PTP) 01c5 FinePix F40fd (PTP) 01c6 FinePix A820 Zoom (PTP) @@ -4562,6 +4675,8 @@ 0240 FinePix S2950 Digital Camera 0241 FinePix S3200 Digital Camera 0278 FinePix JV300 + 02c5 FinePix S9900W Digital Camera (PTP) + 5006 ASK-300 04cc ST-Ericsson 1122 Hub 1520 USB 2.0 Hub (Avocent KVM) @@ -4643,6 +4758,7 @@ 0022 Portable Keyboard 048e Optical Mouse 0499 Optical Mouse + 1135 Mouse [MGK-15BU/MLK-15BU] 1203 Keyboard 1400 PS/2 keyboard + mouse controller 1503 Keyboard @@ -4660,7 +4776,11 @@ a01c wireless multimedia keyboard with trackball [Trust ADURA 17911] a050 Chatman V1 a055 Keyboard + a096 Keyboard + a09f E-Signal LUOM G10 Mechanical Gaming Mouse + a100 Mouse [HV-MS735] a11b Mouse [MX-3200] + e002 MCU 04da Panasonic (Matsushita) 0901 LS-120 Camera 0912 SDR-S10 @@ -4697,6 +4817,7 @@ 250c Gobi Wireless Modem (QDL mode) 250d Gobi Wireless Modem 3904 N5HBZ0000055 802.11abgn Wireless Adapter [Atheros AR7010+AR9280] + 3908 N5HBZ0000062 802.11abgn Wireless Adapter [Atheros AR9374v1.1] 3c04 JT-P100MR-20 [ePassport Reader] 04db Hypertec Pty, Ltd 04dc Huan Hsin Holdings, Ltd @@ -4817,6 +4938,7 @@ 5292 SCL011 RFID reader 5410 SCR35xx Smart Card Reader 5591 SCL3711-NFC&RW + 5810 uTrust 2700 R Smart Card Reader e000 SCRx31 Reader e001 SCR331 SmartCard Reader e003 SPR532 PinPad SmartCard Reader @@ -4895,6 +5017,7 @@ 329f CLP-325 Color Laser Printer 3301 ML-1660 Series 330c ML-1865 + 330f ML-216x Series Laser Printer 3310 ML-331x Series Laser Printer 3315 ML-2540 Series Laser Printer 331e M262x/M282x Xpress Series Laser Printer @@ -5144,6 +5267,7 @@ b104 CNF7069 Webcam b107 CNF7070 Webcam b14c CNF8050 Webcam + b159 CNF8243 Webcam b15c Sony Vaio Integrated Camera b175 4-Port Hub b1aa Webcam-101 @@ -5167,12 +5291,15 @@ b330 Asus 720p CMOS webcam b354 UVC 1.00 device HD UVC WebCam b394 Integrated Camera + b3eb HP 720p HD Monitor Webcam b3f6 HD WebCam (Acer) + b3fd HD WebCam (Asus N-series) b40e HP Truevision HD camera b444 Lenovo Integrated Webcam 04f3 Elan Microelectronics Corp. 000a Touchscreen 0103 ActiveJet K-2024 Multimedia Keyboard + 016f Touchscreen 01a4 Wireless Keyboard 0201 Touchscreen 0210 Optical Mouse @@ -5228,6 +5355,7 @@ 002c Printer 002d Printer 0039 HL-5340 series + 0041 HL-2250DN Laser Printer 0042 HL-2270DW Laser Printer 0100 MFC8600/9650 series 0101 MFC9600/9870 series @@ -5415,6 +5543,7 @@ 021c MFC-9320CW 021d MFC-9120CN 021e DCP-9010CN + 021f DCP-8085DN 0220 MFC-9010CN 0222 DCP-195C 0223 DCP-365CN @@ -5439,6 +5568,7 @@ 023f MFC-8680DN 0240 MFC-J950DN 0248 DCP-7055 scanner/printer + 024e MFC-7460DN 0253 DCP-J125 0254 DCP-J315W 0255 DCP-J515W @@ -5458,6 +5588,7 @@ 026d MFC-J805D 026e MFC-J855DN 026f MFC-J270W + 0270 MFC-7360N 0273 DCP-7057 scanner/printer 0276 MFC-5895CW 0278 MFC-J410W @@ -5681,6 +5812,7 @@ 1002 Printer 2002 PTUSB Printing 2004 PT-2300/2310 p-Touch Laber Printer + 2007 PT-2420PC P-touch Label Printer 2015 QL-500 P-touch label printer 2016 QL-550 P-touch label printer 201a PT-18R P-touch label printer @@ -5688,6 +5820,7 @@ 2027 QL-560 P-touch Label Printer 2028 QL-570 P-touch Label Printer 202b PT-7600 P-touch Label Printer + 2041 PT-2730 P-touch Label Printer 2061 PT-P700 P-touch Label Printer 2064 PT-P700 P-touch Label Printer RemovableDisk 2100 Card Reader Writer @@ -6069,7 +6202,9 @@ 2727 Xircom PGUNET USB-USB Bridge 2750 EZ-Link (EZLNKUSB.SYS) 2810 Cypress ATAPI Bridge + 4018 AmScope MU1803 4d90 AmScope MD1900 camera + 6010 AmScope MU1000 camera 6510 Touptek UCMOS05100KPA 7000 PowerSpec MCE460 Front Panel LED Display 7777 Bluetooth Device @@ -6153,6 +6288,7 @@ 014c Aiwa AM-NX9 Net MD Music Recorder MDLP 014d Memory Stick Reader/Writer 0154 Eyetoy Audio Device + 0155 Eyetoy Video Device 015f IC Recorder (BM) 0169 Clie PEG-TJ35 PDA Serial 016a Clie PEG-TJ35 PDA Mass Storage @@ -6247,6 +6383,7 @@ 0385 Walkman NWZ-E436F 0387 IC Recorder (P) 03bc Webbie HD - MHS-CM1 + 03cc SD Card Reader 03d1 DPF-X95 03d3 DR-BT100CX 03d5 PlayStation Move motion controller @@ -6257,15 +6394,17 @@ 0485 MHS-PM5 HD camcorder 04cb WALKMAN NWZ-E354 0541 DSC-HX100V [Cybershot Digital Still Camera] - 05c4 DualShock 4 + 05c4 DualShock 4 [CUH-ZCT1E] 0689 Walkman NWZ-B173F 06bb WALKMAN NWZ-F805 06c3 RC-S380 07c4 ILCE-6000 (aka Alpha-6000) in Mass Storage mode + 0847 WG-C10 Portable Wireless Server 088c Portable Headphone Amplifier 08b7 ILCE-6000 (aka Alpha-6000) in MTP mode 094e ILCE-6000 (aka Alpha-6000) in PC Remote mode 0994 ILCE-6000 (aka Alpha-6000) in charging mode + 09cc DualShock 4 [CUH-ZCT2E] 0bb5 Headset MDR-1000X 1000 Wireless Buzz! Receiver 054d Try Corp. @@ -6423,6 +6562,7 @@ 3002 Keyboard 3004 Genius KB-29E 3107 Keyboard + 4006 FID 638 Mouse (Sun Microsystems) 0567 Xyratex International, Ltd 0568 Quartz Ingenierie 0569 SegaSoft @@ -6560,6 +6700,14 @@ 034b DTH-W1620 [MobileStudio Pro 16] touchscreen 034d DTH-W1320 [MobileStudio Pro 13] tablet 034e DTH-W1620 [MobileStudio Pro 16] tablet + 034f DTH-1320 [Cintiq Pro 13] tablet + 0350 DTH-1620 [Cintiq Pro 16] tablet + 0353 DTH-1320 [Cintiq Pro 13] touchscreen + 0354 DTH-1620 [Cintiq Pro 16] touchscreen + 0357 PTH-660 [Intuos Pro (M)] + 0358 PTH-860 [Intuos Pro (L)] + 035a DTH-1152 tablet + 0368 DTH-1152 touchscreen 0400 PenPartner 4x5 4001 TPC4001 4004 TPC4004 @@ -6580,6 +6728,7 @@ 0003 Device Bay Controller 056e Elecom Co., Ltd 0002 29UO Mouse + 0057 M-PGDL Mouse 0072 Mouse 200c LD-USB/TX 4002 Laneed 100Mbps Ethernet LD-USB/TX [pegasus] @@ -6708,7 +6857,7 @@ 2000 ISDN-Connector FRITZ!X 2200 BlueFRITZ! 2300 Teledat X130 DSL - 2800 ISDN-Connector TA + 2800 Teledat 2a/b / X120 / NetXXL ISDN Terminal Adapter 3200 Teledat X130 DSL 3500 FRITZ!Card DSL SL 3701 FRITZ!Box SL @@ -6716,7 +6865,7 @@ 3800 BlueFRITZ! Bluetooth Stick 3a00 FRITZ!Box Fon 3c00 FRITZ!Box WLAN - 3d00 Fritz!Box + 3d00 FRITZ!Box Fon WLAN 7050/7140/7170/IAD3331 3e01 FRITZ!Box (Annex A) 4001 FRITZ!Box Fon (Annex A) 4101 FRITZ!Box WLAN (Annex A) @@ -6737,6 +6886,9 @@ 057e Nintendo Co., Ltd 0305 Broadcom BCM2045A Bluetooth Radio [Nintendo Wii] 0306 Wii Remote Controller RVL-003 + 0337 Wii U GameCube Controller Adapter + 2006 Joy-Con L + 2007 Joy-Con R 057f QuickShot, Ltd 6238 USB StrikePad 0580 Denron, Inc. @@ -7182,6 +7334,7 @@ 0525 BigDisk Extreme 500 0641 Mobile Hard Drive 0829 BigDisk Extreme+ + 1004 Little Disk 20 GB 100c Rugged Triple Interface Mobile Hard Drive 1010 Desktop Hard Drive 1016 Desktop Hard Drive @@ -7192,7 +7345,9 @@ 102a Rikiki Hard Drive 1049 rikiki Harddrive 1052 P'9220 Mobile Drive + 1061 Rugged USB3-FW 1064 Rugged 16 and 32 GB + 106b Rugged Mini HDD 106d Porsche Design Mobile Drive 106e Porsche Design Desktop Drive a601 HardDrive @@ -7202,6 +7357,11 @@ 05a2 Fuji Film Microdevices Co., Ltd 05a3 ARC International 8388 Marvell 88W8388 802.11a/b/g WLAN + 9230 Camera + 9320 Camera + 9331 Camera + 9422 Camera + 9520 Camera 05a4 Ortek Technology, Inc. 1000 WKB-1000S Wireless Ergo Keyboard with Touchpad 2000 WKB-2000 Wireless Keyboard with Touchpad @@ -7703,6 +7863,7 @@ 3021 1200dpi Scanner 3022 Scanner 4800dpi 3023 USB1200II Scanner + 3025 ScanMaker S460 30c1 USB600 Scanner 30ce ScanMaker 3800 30cf ScanMaker 4800 @@ -7815,7 +7976,9 @@ a811 16GB Gizmo! a813 16gB flash thumb drive a815 JumpDrive V10 + a81d LJDTT16G [JumpDrive 16GB] a833 JumpDrive S23 64GB + a838 JumpDrive Tough b002 USB CF Reader b018 Multi-Card Reader b047 SDHC Reader [RW047-7000] @@ -7978,6 +8141,7 @@ 3303 Keyboard with PS/2 Mouse Port 05fc Harman 0001 Soundcraft Si Multi Digital Card + 0010 Soundcraft Si MADI combo card 7849 Harman/Kardon SoundSticks 05fd InterAct, Inc. 0239 SV-239 HammerHead Digital @@ -8009,6 +8173,7 @@ 00f1 Keyboard (Labtec Ultra Flat Keyboard) 00f2 Keyboard (Labtec Ultra Flat Keyboard) 6871 Mouse + 8611 NTK96550 based camera 0604 Jean Co., Ltd 0605 Anchor C&C Co., Ltd 0606 Royal Information Electronics Co., Ltd @@ -8092,7 +8257,7 @@ 0627 Adomax Technology Co., Ltd 0628 Tasking Software, Inc. 0629 Zida Technologies, Ltd -062a Creative Labs +062a MosArt Semiconductor Corp. 0000 Optical mouse 0001 Notebook Optical Mouse 0102 Wireless Keyboard/Mouse Combo [MK1152WC] @@ -8193,11 +8358,14 @@ f209 HP Webcam f300 UVC 0.3M Webcam 064f WIBU-Systems AG - 03e9 CmStick (article no. 1001) - 03f2 CmStick/M (article no. 1010) - 03f3 CmStick/M (article no. 1011) - 0bd7 BOX/U - 0bd8 BOX/RU + 03e9 CmStick (MSD, article no. 1001-xx-xxx) + 03f2 CmStick/M (MSD, article no. 1010-xx-xxx) + 03f3 CmStick/M (MSD, article no. 1011-xx-xxx) + 0bd7 Wibu-Box/U (article no. 3031-xx-xxx) + 0bd8 Wibu-Box/RU (article no. 3032-xx-xxx) + 2af9 CmStick (HID, article no. 1001-xx-xxx) + 2b03 CmStick/M (HID, article no. 1011-xx-xxx) + 5213 CmStick/M (COMPOSITE, article no. 1011-xx-xxx) 0650 Dynapro Systems 0651 Likom Technology Sdn. Bhd. 0652 Stargate Solutions, Inc. @@ -8211,6 +8379,7 @@ 0656 Glory Mark Electronic, Ltd 0657 Tekcon Electronics Corp. 0658 Sigma Designs, Inc. + 0200 Aeotec Z-Stick Gen5 (ZW090) - UZB 0659 Aethra 065a Optoelectronics Co., Ltd 0001 Opticon OPR-2001 / NLV-1001 (keyboard mode) @@ -8815,15 +8984,20 @@ 038c CP900DW(ID) Port 0393 CP9500D/DW Port 0394 CP9000D/DW Port + 0398 P93D 03a1 CP9550D/DW Port 03a5 CP9550DW-S 03a9 CP-9600DW 03aa CP3020DA - 03ad CP-9800DW-S + 03ad CP-9800D/DW 03ae CP-9800DW-S 3b10 P95D + 3b21 CP-9810D/DW 3b30 CP-D70DW / CP-D707DW 3b31 CP-K60DW-S + 3b36 CP-D80DW + 3b50 CP-W5000DW + 3b60 CP-D90DW 06d4 Cisco Systems 06d5 Toshiba 4000 Japanese Keyboard @@ -9078,6 +9252,8 @@ 1005 Diva ISDN 4.0 [HFC-S] 2000 Teledat Surf 071e Ariston Technologies +0720 Keyence Corp. + 8001 LJ-V7001 0723 Centillium Communications Corp. 0002 Palladia 300/400 Adsl Modem 0726 Vanguard International Semiconductor-America @@ -9222,9 +9398,10 @@ 0002 PS/2 Adapter 0755 Aureal Semiconductor 0757 Network Technologies, Inc. +0758 Carl Zeiss Microscopy GmbH 075b Sophisticated Circuits, Inc. 0001 Kick-off! Watchdog -0763 Midiman +0763 M-Audio 0115 O2 / KeyRig 25 0117 Trigger Finger 0119 MidAir @@ -9669,6 +9846,7 @@ 0114 C-350Z Camera 0118 Mju Mini Digital/Mju Digital 500 Camera / Stylus 850 SW 0125 Tough TG-1 Camera + 0126 VR340/D750 Digital Camera 0184 P-S100 port 0202 Foot Switch RS-26 0203 Digital Voice Recorder DW-90 @@ -9711,7 +9889,7 @@ 4104 XX9 420a UF200 Ethernet 5301 GW-US54ZGL 802.11bg - 6001 802.11bg + 6001 WUG2690 802.11bg Wireless Module [ZyDAS ZD1211+AL2230] 8188 AboCom Systems Inc [WN2001 Prolink Wireless-N Nano Adapter] a001 WUG2200 802.11g Wireless Adapter [Envara WiND512] abc1 DU-E10 Ethernet [pegasus] @@ -10048,6 +10226,7 @@ 0001 Dual PSX Adaptor 0002 Dual PCS Adaptor 0003 PlayStation Gamepad + e001 Twin controller e501 SNES Gamepad 0813 Mattel, Inc. 0001 Intel Play QX3 Microscope @@ -10224,6 +10403,7 @@ 9042 On Networks N150MA 802.11bgn [Realtek RTL8188CUS] 9043 WNA1000Mv2 802.11bgn [Realtek RTL8188CUS?] 9050 A6200 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526] + 9051 A6200v2 802.11a/b/g/n/ac (2x2) Wireless Adapter [Realtek RTL8812AU] 9052 A6100 AC600 DB Wireless Adapter [Realtek RTL8811AU] a001 PA101 10 Mbps HPNA Home Phoneline RJ-1 f001 On Networks N300MA 802.11bgn [Realtek RTL8192CU] @@ -10368,7 +10548,10 @@ 0894 TSI Incorporated 0010 Remote NDIS Network Device 0897 Lauterbach + 0001 ICE In-Circuit Emulator 0002 Power Debug/Power Debug II + 0004 PowerDebug + 0005 PowerDebug PRO 089c United Technologies Research Cntr. 089d Icron Technologies Corp. 089e NST Co., Ltd @@ -10691,6 +10874,8 @@ 01fe SIMATIC NET PC Adapter A2 04b1 MediSET 04b2 NC interface + 04b3 keyboard front panel Cockpit + 04b4 SCR_CCID 2701 ShenZhen SANZHAI Technology Co.,Ltd Spy Pen VGA 0909 Audio-Technica Corp. 090a Trumpion Microelectronics, Inc. @@ -10860,6 +11045,7 @@ 070b Pocket PC e800 Series 0a07 WLM-10U1 802.11abgn Wireless Adapter [Ralink RT3572] 0a08 WLM-20U2/GN-1080 802.11abgn Wireless Adapter [Atheros AR7010+AR9280] + 0a0b WLU5053 802.11abgn Wireless Module [Broadcom BCM43236B] 0a13 AX88179 Gigabit Ethernet [Toshiba] 0b05 PX1220E-1G25 External hard drive 0b09 PX1396E-3T01 External hard drive @@ -11020,6 +11206,7 @@ 1624 DataTraveler G2 1625 DataTraveler 101 II 162a DataTraveler 112 4GB Pen Drive + 162b DataTraveler HyperX 3.0 162d DataTraveler 102 1630 DataTraveler 200 (32GB) 1642 DT101 G2 @@ -11032,13 +11219,18 @@ 1689 DataTraveler SE9 168a DataTraveler Micro 168c DT Elite 3.0 + 16b3 HyperX Savage 0954 RPM Systems Corp. -0955 NVidia Corp. - 7018 APX - 7030 Tegra 3 (recovery mode) +0955 NVIDIA Corp. + 7018 T186 [Tegra Parker] + 701a U-Boot running on Tegra + 7020 L4T (Linux for Tegra) running on Tegra + 7030 T30 [Tegra 3] recovery mode 7100 Tegra Device + 7140 T124 [Tegra K1/Logan 32-bit] 7210 SHIELD Controller - 7820 Tegra 2 AC100 developer mode + 7721 T210 [Tegra Erista] + 7820 T20 [Tegra 2] recovery mode b400 SHIELD (debug) b401 SHIELD cf05 SHIELD Tablet (debug) @@ -11066,6 +11258,7 @@ 095c K-Tec Electronics 095d Polycom, Inc. 0001 Polycom ViaVideo +0964 BITRAN 0967 Acer NeWeb Corp. 0204 WarpLink 802.11b Adapter 0968 Catalyst Enterprises, Inc. @@ -11496,10 +11689,14 @@ 5804 BCM5880 Secure Applications Processor with fingerprint swipe sensor 6300 Pirelli Remote NDIS Device 6410 BCM20703A1 Bluetooth 4.1 + LE - bd11 TiVo AG0100 802.11bg Wireless Adapter [Broadcom BCM4320] + bd11 BCM4320 802.11bg Wireless Adapter + bd12 BCM4326U 802.11bg Wireless Adapter bd13 BCM4323 802.11abgn Wireless Adapter bd16 BCM4319 802.11bgn Wireless Adapter bd17 BCM43236 802.11abgn Wireless Adapter + bd1d BCM43526 802.11a/b/g/n/ac (2x2) Wireless Adapter + bd1e BCM43143 802.11bgn (1x1) Wireless Adapter + bd1f BCM43242 802.11abgn Wireless Adapter d11b Eminent EM4045 [Broadcom 4320 USB] 0a5d Diatrend Corp. 0a5f Zebra @@ -11733,6 +11930,7 @@ 0630 Spectrum III Mag-Only Insert Reader (SPT3-355 Series) USB-CDC 0810 SecurePIN (IDPA-506100Y) PIN Pad 2030 ValueMag Magnetic Stripe Reader + 3710 ViVOpay Kiosk III 0ace ZyDAS 1201 ZD1201 802.11b 1211 ZD1211 802.11g @@ -11809,12 +12007,13 @@ 0b00 INGENICO 0b05 ASUSTek Computer, Inc. 0001 MeMO Pad HD 7 (CD-ROM mode) + 0301 MyPal A696 GPS PDA 1101 Mass Storage (UISDMC4S) 1706 WL-167G v1 802.11g Adapter [Ralink RT2571] 1707 WL-167G v1 802.11g Adapter [Ralink RT2571] 1708 Mass Storage Device 170b Multi card reader - 170c WL-159g 802.11bg + 170c WL-159g 802.11bg [ZyDAS ZD1211B+AL2230] 170d 802.11b/g Wireless Network Adapter 1712 BT-183 Bluetooth 2.0+EDR adapter 1715 2045 Bluetooth 2.0 Device with trace filter @@ -11826,11 +12025,11 @@ 1723 WL-167G v2 802.11g Adapter [Ralink RT2571W] 1724 RT2573 1726 Laptop OLED Display - 172a ASUS 802.11n Network Adapter + 172a 802.11n Network Adapter 172b 802.11n Network Adapter 1731 802.11n Network Adapter 1732 802.11n Network Adapter - 1734 ASUS AF-200 + 1734 AF-200 173c BT-183 Bluetooth 2.0 173f My Cinema U3100 Mini 1742 802.11n Network Adapter @@ -11856,8 +12055,14 @@ 17c7 WL-330NUL 17c9 USB-AC53 802.11a/b/g/n/ac Wireless Adapter [Broadcom BCM43526] 17cb Broadcom BCM20702A0 Bluetooth - 17d1 AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610/Ralink RT2870] + 17d1 AC51 802.11a/b/g/n/ac Wireless Adapter [Mediatek MT7610U] + 17d2 USB-AC56 802.11a/b/g/n/ac Wireless Adapter [Realtek RTL8812AU] + 17d3 USB-N10 v2 802.11b/g/n Wireless Adapter [MediaTek MT7601U] + 17db USB-AC50 802.11a/b/g/n/ac (1x1) Wireless Adapter [MediaTek MT7610U] + 17e8 USB-N14 802.11b/g/n (2x2) Wireless Adapter [Ralink RT5372] + 17eb USB-AC55 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7612U] 180a Broadcom BCM20702 Single-Chip Bluetooth 4.0 + LE + 1817 USB-AC68 802.11a/b/g/n/ac (4x4) Wireless Adapter [Realtek RTL8814AU] 1825 Qualcomm Bluetooth 4.1 4c80 Transformer Pad TF300TG 4c90 Transformer Pad Infinity TF700 @@ -11872,12 +12077,12 @@ 550f Fonepad 7 6101 Cable Modem 620a Remote NDIS Device - 7772 ASUS Zenfone GO (ZB500KL) (MTP mode) - 7773 ASUS Zenfone GO (ZB500KL) (Debug, MTP mode) - 7774 ASUS Zenfone GO (ZB500KL) (RNDIS mode) - 7775 ASUS Zenfone GO (ZB500KL) (Debug, RNDIS mode) - 7776 ASUS Zenfone GO (ZB500KL) (PTP mode) - 7777 ASUS Zenfone GO (ZB500KL) (Debug, PTP mode) + 7772 Zenfone GO (ZB500KL) (MTP mode) + 7773 Zenfone GO (ZB500KL) (Debug, MTP mode) + 7774 Zenfone GO (ZB500KL) (RNDIS mode) + 7775 Zenfone GO (ZB500KL) (Debug, RNDIS mode) + 7776 Zenfone GO (ZB500KL) (PTP mode) + 7777 Zenfone GO (ZB500KL) (Debug, PTP mode) b700 Broadcom Bluetooth 2.1 0b0b Datamax-O'Neil 106e Datamax E-4304 @@ -11921,6 +12126,7 @@ 0b33 Contour Design, Inc. 0020 ShuttleXpress 0030 ShuttlePro v2 + 0401 RollerMouse Free 2 0700 RollerMouse Pro 0b37 Hitachi ULSI Systems Co., Ltd 0b38 Gear Head @@ -12332,6 +12538,7 @@ 3101 FreeAgent XTreme 640GB 3312 SRD00F2 Expansion Desktop Drive (STBV) 3320 SRD00F2 [Expansion Desktop Drive] + 3322 SRD0NF2 [Expansion Desktop Drive] 3332 Expansion 5020 FreeAgent GoFlex 5021 FreeAgent GoFlex USB 2.0 @@ -12344,14 +12551,18 @@ 50a5 FreeAgent GoFlex Desk USB 3.0 5121 FreeAgent GoFlex 5161 FreeAgent GoFlex dock + 6126 Maxtor D3 Station 5TB + 61b6 Maxtor HX-M101TCB/GM [M3 Portable 1TB] 61b7 Maxtor M3 Portable a003 Backup Plus a0a1 Backup Plus Desktop a0a4 Backup Plus Desktop Drive ab00 Slim Portable Drive + ab1e Backup Plus Portable Drive ab20 Backup Plus Portable Drive ab21 Backup Plus Slim ab24 Backup Plus Portable Drive + ab26 Backup Plus Slim Portable Drive 1 TB ab31 Backup Plus Desktop Drive (5TB) ab34 Backup Plus ab38 Backup Plus Hub @@ -12417,6 +12628,7 @@ 0186 Card Reader 0301 multicard reader 0307 Card Reader + 0326 Card reader 1724 RTL8723AU 802.11n WLAN Adapter 2831 RTL2831U DVB-T 2832 RTL2832U DVB-T @@ -12428,6 +12640,7 @@ 5775 HP "Truevision HD" laptop camera 57b3 Acer 640 × 480 laptop camera 57da Built-In Video Camera + 58c8 Integrated Webcam HD 8150 RTL8150 Fast Ethernet Adapter 8151 RTL8151 Adapteon Business Mobile Networks BV 8152 RTL8152 Fast Ethernet Adapter @@ -12441,13 +12654,15 @@ 817f RTL8188RU 802.11n WLAN Adapter 8187 RTL8187 Wireless Adapter 8189 RTL8187B Wireless 802.11g 54Mbps Network Adapter - 818b ACT-WNP-UA-005 802.11b/g/n WLAN Adapter + 818b RTL8192EU 802.11b/g/n WLAN Adapter 8192 RTL8191SU 802.11n Wireless Adapter 8193 RTL8192DU 802.11an WLAN Adapter 8197 RTL8187B Wireless Adapter 8198 RTL8187B Wireless Adapter 8199 RTL8187SU 802.11g WLAN Adapter - 8812 RTL8812AU 802.11a/b/g/n/ac WLAN Adapter + 8812 RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter + 8813 RTL8814AU 802.11a/b/g/n/ac Wireless Adapter + a811 RTL8811AU 802.11a/b/g/n/ac WLAN Adapter 0bdb Ericsson Business Mobile Networks BV 1000 BV Bluetooth Device 1002 Bluetooth Device 1.2 @@ -12581,6 +12796,8 @@ 0b61 Vuquest 3310g 0b6a Vuquest 3310 Area-Imaging Scanner 0b81 Barcode scanner Voyager 1400g Series +0c30 Mutoh Industries Ltd + 6010 Kona 1400 Cutting Plotter 0c35 Eagletron, Inc. 0c36 E Ink Corp. 0c37 e.Digital @@ -12729,6 +12946,7 @@ 6417 Integrated Webcam 6419 Integrated Webcam 641d 1.3 MPixel Integrated Webcam + 6433 Laptop Integrated Webcam HD (Composite Device) 643f Dell Integrated HD Webcam 644d 1.3 MPixel Integrated Webcam 6480 Sonix 1.3 MP Laptop Integrated Webcam @@ -12742,6 +12960,7 @@ 7401 TEMPer Temperature Sensor 7402 TEMPerHUM Temperature & Humidity Sensor 7403 Foot Switch + 7404 Foot switch FS1-P 8000 DC31VC 8006 Dual Mode Camera (8006 VGA) 800a Vivitar Vivicam3350B @@ -12911,6 +13130,7 @@ 0ca7 Information Systems Laboratories 0cad Motorola CGISS 1007 APX Series Consolette + 1020 MOTOTRBO Series Radio (Portable) 1030 APX Series Radio (Portable) 1031 APX Series Radio (Mobile) 1602 IMPRES Battery Data Reader @@ -13123,7 +13343,7 @@ 0d18 coaXmedia 0d19 Hank Connection Industrial Co., Ltd 0d28 NXP - 0204 LPC1768 + 0204 ARM mbed 0d32 Leo Hui Electric Wire & Cable Co., Ltd 0d33 AirSpeak, Inc. 0d34 Rearden Steel Technologies @@ -13144,6 +13364,7 @@ 0d46 Kobil Systems GmbH 2012 KAAN Standard Plus (Smartcard reader) 3003 mIDentity Light / KAAN SIM III + 3014 Smart Token 4000 mIDentity (mass storage) 4001 mIDentity Basic/Classic (composite device) 4081 mIDentity Basic/Classic (installationless) @@ -13218,6 +13439,7 @@ 2208 Mass Storage 3105 Dual Mode Digital Camera Disk 3108 Digicam Mass Storage Device + 5566 Contour Roam Model 1600 0d65 KMJP Co., Ltd 0d66 TMT 0d67 Advanet, Inc. @@ -13270,10 +13492,12 @@ 0001 Audio Device 0002 Composite Device 0003 Sound Device + 0005 Blue Snowball 0006 Storm HP-USB500 5.1 Headset 000c Audio Adapter 000d Composite Device 000e Audio Adapter (Planet UP-100, Genius G-Talk) + 0014 Audio Adapter (Unitek Y-247A) 001f CM108 Audio Controller 0102 CM106 Like Sound Device 0103 CM102-A+/102S+ Audio Controller @@ -13383,6 +13607,8 @@ 1967 Bluetooth Dongle 3713 Primo 73 3801 Motorola Bluetooth 2.1+EDR Device + 3870 MS-3870 802.11bgn Wireless Module [Ralink RT3070] + 3871 MS-3871 802.11bgn Wireless Module [Ralink RT8070] 4011 Medion Flash XL V2.0 Card Reader 4023 Lexar Mobile Card Reader 4600 802.11b/g Turbo Wireless Adapter @@ -13598,6 +13824,9 @@ 0004 Virtual CCID 0005 Virtual Mass Storage 0006 Virtual Keyboard + 8001 Root Hub + 8002 Root Hub + 8003 Root Hub f80a Smoker FX2 0e16 JMTek, LLC 0e17 Walex Electronic, Ltd @@ -13670,6 +13899,7 @@ 2390 Games Jtech Controller 7288 funkey reader 0e50 TechnoData Interware + 0001 Matrix USB-Key 0002 Matrixlock Dongle (HID) 0e55 Speed Dragon Multimedia, Ltd 110a Tanic S110-SG1 + ISSC IS1002N [Slow Infra-Red (SIR) & Bluetooth 1.2 (Class 2) Adapter] @@ -13703,6 +13933,7 @@ 030b Truly Ergonomic Computer Keyboard (Device Firmware Update mode) 030c Truly Ergonomic Computer Keyboard 6001 GEMBIRD Flexible keyboard KB-109F-B-DE + 7f5c BPF-015 Key Chain Photo Frame 0e6f Logic3 0003 Freebird wireless Controller 0005 Eclipse wireless Controller @@ -13748,6 +13979,7 @@ 0021 Multimedia Keyboard Controller 0022 multimedia keyboard controller 0201 SmartJoy Frag Xpad/PS2 adaptor + 300a steering Wheel 0e90 WiebeTech, LLC 0100 Storage Adapter V1 0e91 VTech Engineering Canada, Ltd @@ -14429,6 +14661,11 @@ 2599 My Passport Ultra (WD40NMZW) 259d My Passport Ultra (WDBBKD) 259f My Passport Ultra (WD10JMVW) + 25a1 Elements / My Passport (WD20NMVW) + 25a2 Elements 25A2 + 25a3 Elements Desktop (WDBWLG) + 25e2 My Passport (WD40NMZW) + 30a0 SATA adapter cable 1059 Giesecke & Devrient GmbH 000b StarSign Bio Token 3.0 105b Foxconn International, Inc. @@ -14444,6 +14681,8 @@ 1065 CCYU Technology 0020 USB-DVR2 Dev Board 2136 EasyDisk ED1064 +1068 Micropi Elettronica + 0001 CPUSB - V 1.8 - software-rights management key 106a Loyal Legend, Ltd 106c Curitel Communications, Inc. 1101 CDMA 2000 1xRTT USB modem (HX-550C) @@ -14534,14 +14773,45 @@ 107f KidzMouse, Inc. 1082 Shin-Etsukaken Co., Ltd 1083 Canon Electronics, Inc. + 160c CR-55 + 160f DR-1210C + 1614 DR-4010C + 1617 DR-2510C + 1618 DR-X10C + 161a CR-25 161b DR-2010C Scanner + 161d DR-3010C + 1620 DR-7090C + 1622 DR-9050C + 1623 DR-7550C + 1624 DR-6050C + 1626 DR-6010C 162c P-150 Scanner + 1638 DR-6030C + 1639 CR-135i + 163e DR-M160 + 163f DR-M140 + 1640 DR-C125 + 1641 DR-P215 + 1648 FSU-201 + 164a DR-C130 + 164b DR-P208 + 164f DR-G1130 + 1650 DR-G1100 + 1651 DR-C120 + 1654 DR-F120 + 1657 DR-M1060 + 1658 DR-C225 + 1659 DR-P215II + 165d DR-P208II 1084 Pantech Co., Ltd 108a Chloride Power Protection 108b Grand-tek Technology Co., Ltd 0005 HID Keyboard/Mouse PS/2 Translator 108c Robert Bosch GmbH 108e Lotes Co., Ltd. +1091 Numerik Jena + 8101 Absoflex 1099 Surface Optics Corp. 109a DATASOFT Systems GmbH 109b Hisense @@ -14608,10 +14878,10 @@ 10b5 Comodo (PLX?) 9060 Test Board 10b8 DiBcom - 0bb8 DiBcom USB DVB-T reference design (MOD300) (cold) - 0bb9 DiBcom USB DVB-T reference design (MOD300) (warm) - 0bc6 DiBcom USB2.0 DVB-T reference design (MOD3000P) (cold) - 0bc7 DiBcom USB2.0 DVB-T reference design (MOD3000P) (warm) + 0bb8 DVB-T reference design (MOD300) (cold) + 0bb9 DVB-T reference design (MOD300) (warm) + 0bc6 DVB-T reference design (MOD3000P) (cold) + 0bc7 DVB-T reference design (MOD3000P) (warm) 10bb TM Technology, Inc. 10bc Dinging Technology Co., Ltd 10bd TMT Technology, Inc. @@ -14624,10 +14894,13 @@ 10c4 Cygnal Integrated Products, Inc. 0002 F32x USBXpress Device 0003 CommandIR + 800a SPORTident + 800b AES 8030 K4JRG Ham Radio devices 8044 USB Debug Adapter 804e Software Bisque Paramount ME 80a9 CP210x to UART Bridge Controller + 80c4 Infrared Thermometer Adapter 80ca ATM2400 Sensor Device 813f tams EasyControl 8149 West Mountain Radio Computerized Battery Analyzer @@ -14635,24 +14908,34 @@ 814b West Mountain Radio RIGtalk 818a Silicon Labs FM Radio Reference Design 81e8 Zephyr BioHarness + 834b Infrared Online Sensor Adapter + 834e Infrared Sensor Adapter 8460 Sangoma Wanpipe VoiceTime 8461 Sangoma U100 + 8470 Juniper Networks BX Series System Console 8477 Balluff RFID Reader 8496 SiLabs Cypress FW downloader 8497 SiLabs Cypress EVB + 84fb Infrared Blackbody Adapter + 8508 RS485 Adapter 8605 dilitronics ESoLUX solar lighting controller + 8660 Netronics CANdoISO 86bc C8051F34x AudioDelay [AD-340] 8789 C8051F34x Extender & EDID MGR [EMX-DVI] 87be C8051F34x HDMI Audio Extractor [EMX-HD-AUD] 8863 C8051F34x Bootloader 8897 C8051F38x HDMI Splitter [UHBX] + 88c9 AES HID device 8918 C8051F38x HDMI Audio Extractor [VSA-HA-DP] 8973 C8051F38x HDMI Extender [UHBX-8X] + 89c6 SPORTident HID device 89e1 C8051F38x HDMI Extender [UHBX-SW3-WP] - ea60 CP210x UART Bridge / myAVR mySmartUSB light + ea60 CP2102/CP2109 UART Bridge Controller [CP210x family] ea61 CP210x UART Bridge ea70 CP210x UART Bridge ea80 CP210x UART Bridge + eac9 EFM8UB1 Bootloader + eaca EFM8UB2 Bootloader 10c5 Sanei Electric, Inc. 819a FM Radio 10c6 Intec, Inc. @@ -14661,7 +14944,11 @@ 1101 MP3 Player 10cd Kycon, Inc. 10ce Silicon Labs + 0007 Shinko/Sinfonia CHC-S1245 000e Shinko/Sinfonia CHC-S2145 + 0019 Shinko/Sinfonia CHC-S6145 + 001d Shinko/Sinfonia CHC-S6245 + 001e Ciaat Brava 21 ea6a MobiData EDGE USB Modem 10cf Velleman Components, Inc. 2011 R-Engine MPEG2 encoder/decoder @@ -14703,6 +14990,7 @@ 1a08 Internal Webcam 1a1e Laptop Integrated Webcam 1.3M 1a2a Laptop Integrated Webcam + 1a2e HP Truevision HD Integrated Webcam 10f5 Turtle Beach 0200 Audio Advantage Roadie 10fb Pictos Technologies, Inc. @@ -14758,6 +15046,7 @@ 0202 Rocket Launcher 6604 MCE IR-Receiver 660c Foot Pedal/Thermometer + 6626 Key 6806 Keychain photo frame c301 Digital Photo viewer [Wallet Pix] f211 TP6911 Audio Headset @@ -14778,6 +15067,9 @@ 3131 CTS LS515 113c Arin Tech Co., Ltd 113d Mapower Electronics Co., Ltd +113f Integrated Biometrics, LLC + 1020 Watson Two-Finger Roll Scanner + 1100 Columbo Single-Finger Scanner 1141 V One Multimedia, Pte., Ltd 1142 CyberScan Technologies, Inc. 0709 Cyberview High Speed Scanner @@ -14878,6 +15170,7 @@ 9008 Gobi 2000 Wireless Modem 9009 Gobi 2000 Wireless Modem 900a Gobi 2000 Wireless Modem + 9013 Sierra Wireless Gobi 3000 Modem device (MC8355) 9055 Gobi 9x15 Multimode 3G/4G LTE Modem (NAT mode) 9057 Gobi 9x15 Multimode 3G/4G LTE Modem (IP passthrough mode) 119a ZHAN QI Technology Co., Ltd @@ -14897,6 +15190,8 @@ 6208 PRO-28U 11be R&D International NV f0a0 Martin Maxxyz DMX +11c0 Betop + 5506 Gamepad 11c5 Inmax 0521 IMT-0521 Smartcard Reader 11ca VeriFone Inc @@ -14926,18 +15221,27 @@ 1004 IBSecureCam-O 1005 IBSecureCam-N 1006 Mini IO-Board + 1ab5 Arachnid Labs Tsunami 2000 Zygmunt Krynicki Lantern Brightness Sensor 2048 Housedillon.com MRF49XA Transciever 2222 LabConnect Signalgenerator 2300 Keyboardio Keyboardio Model 01 Bootloader 2301 Keyboardio Keyboardio Model 01 + 2327 K.T.E.C.Bootloader Device + 2328 K.T.E.C. Keyboard Device 2337 /Dev or SlashDev /Net 3000 lloyd3000 3333 LabConnect Digitalnetzteil 5222 telavivmakers attami + 53c0 SatoshiLabs TREZOR Bootloader + 53c1 SatoshiLabs TREZOR 5a22 ikari_01 sd2snes + 7530 Refflion - IoT Board - Bootloader + 7531 Refflion - IoT Board - Sketch 7bd0 pokey9000 Tiny Bit Dingus abd0 tibounise ADB converter + aced Open Lighting Project - Ja Rule Device + acee Open Lighting Project - Ja Rule Bootloader beef Modal MC-USB c0f5 unethi PERswitch ca1c KnightOS Hub @@ -14957,6 +15261,11 @@ 001c RP255 Guitar Multi-Effects Processor 121e Jungsoft Co., Ltd 3403 Muzio JM250 Audio Player +1220 TC Electronic + 000a Hall of Fame Reverb + 002a Polytune + 0032 Ditto X2 Looper + 0039 Alter Ego X4 Vintage Echo 1221 Unknown manufacturer 3234 Disk (Thumb drive) 1223 SKYCABLE ENTERPRISE. CO., LTD. @@ -15007,6 +15316,9 @@ 8010 Forte 8012 Scarlett 6i6 8014 Scarlett 18i8 + 8016 Focusrite Scarlett 2i2 + 8203 Focusrite Scarlett 6i6 + 8204 Scarlett 18i8 2nd Gen 1241 Belkin 0504 Wireless Trackball Keyboard 1111 Mouse @@ -15039,6 +15351,7 @@ c93a 4GB Pen Drive c96a C906 Flash Drive cb10 Dash Drive UV100 + cb20 DashDrive UV110 1260 Standard Microsystems Corp. ee22 SMC2862W-G v3 EZ Connect 802.11g Adapter [Intersil ISL3887] 1264 Covidien Energy-based Devices @@ -15046,7 +15359,7 @@ 6302 Fastweb DRG A226M ADSL Router 1267 Logic3 / SpectraVideo plc 0103 G-720 Keyboard - 0201 A4Tech SWOP-3 Mouse + 0201 Mouse 0210 LG Optical Mouse 3D-310 a001 JP260 PC Game Pad c002 Wireless Optical Mouse @@ -15096,17 +15409,21 @@ 1fab 88W8338 [Libertas] 802.11g 2001 88W8388 802.11a/b/g WLAN 2006 88W8362 802.11n WLAN + 203c K30326 802.11bgn Wireless Module [Marvell 88W8786U] 8001 BLOB boot loader firmware 1291 Qualcomm Flarion Technologies, Inc. / Leadtek Research, Inc. 0010 FDM 2xxx Flash-OFDM modem 0011 LR7F06/LR7F14 Flash-OFDM modem 1292 Innomedia 0258 Creative Labs VoIP Blaster + 4154 Retro Link Atari cable 1293 Belkin Components [hex] 0002 F5U002 Parallel Port [uss720] 2101 104-key keyboard 1294 RISO KAGAKU CORP. 1320 Webmail Notifier +1297 DekTec + 020f DTU-215 Multi-Standard Modulator 129b CyberTAN Technology 160b Siemens S30853-S1031-R351 802.11g Wireless Adapter [Atheros AR5523] 160c Siemens S30853-S1038-R351 802.11g Wireless Adapter [Atheros AR5523] @@ -15118,6 +15435,8 @@ 12b8 Zhejiang Xinya Electronic Technology Co., Ltd. 12b9 E28 12ba Licensed by Sony Computer Entertainment America + 0032 Wireless Stereo Headset + 0042 Wireless Stereo Headset 00ff Rocksmith Guitar Adapter 0100 RedOctane Guitar for PlayStation(R)3 0120 RedOctane Drum Kit for PlayStation(R)3 @@ -15125,13 +15444,15 @@ 0210 Harmonix Drum Kit for PlayStation(R)3 12bd Gembird d012 JPD Shockforce gamepad + d015 Generic 4-button NES USB Controller 12c4 Autocue Group Ltd 0006 Teleprompter Two-button Hand Control (v1) 0008 Teleprompter Foot Control (v1) 12cf DEXIN 0170 Tt eSPORTS BLACK Gaming mouse + 600b Cougar 600M Gaming Mouse 12d1 Huawei Technologies Co., Ltd. - 1001 E169/E620/E800 HSDPA Modem + 1001 E161/E169/E620/E800 HSDPA Modem 1003 E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem 1004 E220 (bis) 1009 U120 @@ -15141,20 +15462,23 @@ 1037 Ideos 1038 Ideos (debug mode) 1039 Ideos (tethering mode) + 1052 MT7-L09 1404 EM770W miniPCI WCDMA Modem 1406 E1750 140b EC1260 Wireless Data Modem HSD USB Card 140c E180v 1412 EC168c 1436 Broadband stick - 1446 Broadband stick (modem on) + 1446 HSPA modem 1465 K3765 HSPA + 14ac E815 14c3 K5005 Vodafone LTE/UMTS/GSM Modem/Networkcard 14c8 K5005 Vodafone LTE/UMTS/GSM MOdem/Networkcard 14c9 K3770 3G Modem 14cf K3772 14d1 K3770 3G Modem (Mass Storage Mode) 14db E353/E3131 + 14dc E33372 LTE/UMTS/GSM HiLink Modem/Networkcard 14f1 Gobi 3000 HSPA+ Modem 14fe Modem (Mass Storage Mode) 1501 Pulse @@ -15165,6 +15489,8 @@ 1521 K4505 HSPA+ 155a R205 Mobile WiFi (CD-ROM mode) 1575 K5150 LTE modem + 15bb ME936 LTE/HSDPA+ 4G modem + 15c1 ME906s LTE M.2 Module 15ca E3131 3G/UMTS/HSPA+ Modem (Mass Storage Mode) 1805 AT&T Go Phone U2800A phone 1c05 Broadband stick (modem on) @@ -15185,6 +15511,8 @@ 0013 Blofeld 12ef Tapwave, Inc. 0100 Tapwave Handheld [Tapwave Zodiac] +12f2 ViewPlus Technologies, Inc. + 000a Braille embosser [SpotDot Emprint] 12f5 Dynamic System Electronics Corp. 12f7 Memorex Products, Inc. 1a00 TD Classic 003B @@ -15197,7 +15525,7 @@ 0163 256MB/512MB/1GB Flash Drive 0165 2GB/4GB/8GB Flash Drive 0190 Ut190 8 GB Flash Drive with MicroSD reader - 0310 SD/MicroSD CardReader [hama] + 0310 SD/MicroSD CardReader [hama]/IT1327E [Basic Line flash drive] 0330 63-in-1 Multi-Card Reader/Writer 0361 CR-75: 51-in-1 Card Reader/Writer [Sakar] 1169 TS2GJF210 JetFlash 210 2GB @@ -15225,9 +15553,15 @@ 8022 PM320E Optical Power and Energy Meter 8030 ER100 Extinction Ratio Meter 8070 PM100D + 8072 PM100USB Power and Energy Meter Interface + 8078 PM100D Compact Power and Energy Meter Console + 8080 CCS100 - Compact Spectrometer 131d Natural Point 0155 TrackIR 3 Pro Head Tracker 0156 TrackIR 4 Pro Head Tracker + 0158 TrackIR 5 Pro Head Tracker +1325 ams AG + 4002 I2C Dongle 132a Envara Inc. 1502 WiND 802.11abg / 802.11bg WLAN 132b Konica Minolta @@ -15270,9 +15604,13 @@ 0204 Ethernet 0304 EasiDock Ethernet 1343 Citizen Systems + 0002 CW-01 0003 CX / DNP DS40 - 0004 CX-W / DNP DS80 - 0005 CY / DNP DSRX + 0004 CX-W / DNP DS80 / Mitsubishi CP3800 + 0005 CY / DNP DSRX1 + 0006 CW-02 + 0007 DNP DS80DX + 0008 CX2 / DNP DS620 1345 Sino Lite Technology Corp. 001c Xbox Controller Hub 6006 Defender Wireless Controller @@ -15289,6 +15627,9 @@ 0412 G1-0300 CCD 0413 G1-2000 CCD 0414 G1-1400 CCD + 0415 G1-1200 CCD + 04b0 Gx CCD-B CCD + 04b1 Gx CCD-BI CCD 1348 Katsuragawa Electric Co., Ltd. 134c PanJit International Inc. 0001 Touch Panel Controller @@ -15310,6 +15651,7 @@ 0101 J-Link PLUS 136b STEC 136e Andor Technology Ltd. + 0012 iXon Ultra CCD 0014 Zyla 5.5 sCMOS camera 1370 Swissbit 0323 Swissmemory cirrusWHITE @@ -15324,6 +15666,8 @@ 9032 CWD-854 rev F 9401 CWD-854 Wireless 802.11g 54Mbps Network Adapter [RTL8187] 1376 Vimtron Electronics Co., Ltd. +1377 Sennheiser electronic GmbH & Co. KG + 4000 HDVD800 137b SCAPS GmbH 0002 SCAPS USC-2 Scanner Controller 1385 Netgear, Inc @@ -15340,21 +15684,27 @@ 0008 VFS300 Fingerprint Reader 0010 VFS Fingerprint sensor 0011 VFS5011 Fingerprint Reader - 0017 Fingerprint Reader + 0015 VFS 5011 fingerprint sensor + 0017 VFS 5011 fingerprint sensor 0018 Fingerprint scanner 003c VFS471 Fingerprint Reader 003d VFS491 003f VFS495 Fingerprint Reader 0050 Swipe Fingerprint Sensor + 0090 VFS7500 Touch Fingerprint Sensor + 0091 VFS7552 Touch Fingerprint Sensor 138e Jungo LTD - 9000 Raisonance S.A. STM32 ARM evaluation board + 9000 Raisonance S.A. STM32 ARM evaluation board / RLink dongle 1390 TOMTOM B.V. 0001 GO 520 T/GO 630/ONE XL (v9) 5454 Blue & Me 2 7474 GPS Sport Watch [Runner, Multi-Sport] + a001 Bandit Action Camera Batt-Stick 1391 IdealTEK, Inc. 1000 URTC-1000 1395 Sennheiser Communications + 0025 Headset [PC 8] + 0046 PXC 550 3556 USB Headset 1397 BEHRINGER International GmbH 00bc BCF2000 @@ -15389,6 +15739,8 @@ 003b AE3000 802.11abgn (3x3) Wireless Adapter [Ralink RT3573] 003e AE6000 802.11a/b/g/n/ac Wireless Adapter [MediaTek MT7610U] 003f WUSB6300 802.11a/b/g/n/ac Wireless Adapter [Realtek RTL8812AU] + 0041 Gigabit Ethernet Adapter + 0042 WUSB6100M 802.11a/b/g/n/ac Wireless Adapter 13b1 WUSB200: Wireless-G Business Network Adapter with Rangebooster 13b2 Alesis 0030 Multimix 8 @@ -15439,8 +15791,9 @@ 3242 DTV-DVB UDAT7240LP - ATSC/NTSC/PAL Driver(Without HID) 3243 DTV-DVB UDXTTM6010 - A/D Driver(Without HID) 3244 DTV-DVB UDTT 7047Z-USB 2.0 DVB-T Driver - 3247 802.11 n/g/b Wireless LAN Adapter + 3247 AW-NU222 802.11bgn Wireless Module [Ralink RT2770+RT2720] 3249 Internal Bluetooth + 3250 Broadcom Bluetooth 2.1 3262 802.11 n/g/b Wireless LAN USB Adapter 3273 802.11 n/g/b Wireless LAN USB Mini-Card 3274 DVB-T Dongle [RTL2832U] @@ -15449,6 +15802,7 @@ 3304 Asus Integrated Bluetooth module [AR3011] 3306 Mediao 802.11n WLAN [Realtek RTL8191SU] 3315 Bluetooth module + 3327 AW-NU137 802.11bgn Wireless Module [Atheros AR9271] 3362 Atheros AR3012 Bluetooth 4.0 Adapter 3375 Atheros AR3012 Bluetooth 4.0 Adapter 3392 Azurewave 43228+20702 @@ -15461,6 +15815,7 @@ 5122 2M Integrated Webcam 5126 PC Cam 5130 Integrated Webcam + 5134 Integrated Webcam 5702 UVC VGA Webcam 5710 UVC VGA Webcam 5716 UVC VGA Webcam @@ -15468,6 +15823,7 @@ 7022 DTV-DVB UDST7022BDA DVB-S Box(Without HID) 13d7 Guidance Software, Inc. 0001 T5 PATA forensic bridge + 000c T8-R2 forensic bridge 13dc ALEREON, INC. 13dd i.Tech Dynamic Limited 13e1 Kaibo Wire & Cable (Shenzhen) Co., Ltd. @@ -15485,6 +15841,7 @@ 13fd Initio Corporation 0840 INIC-1618L SATA 0841 Samsung SE-T084M DVD-RW + 0940 ASUS SBW-06D2X-U 1040 INIC-1511L PATA Bridge 1340 Hi-Speed USB to SATA Bridge 160f RocketFish SATA Bridge [INIC-1611] @@ -15492,6 +15849,9 @@ 1669 INIC-1609PN 1840 INIC-1608 SATA bridge 1e40 INIC-1610P SATA bridge + 2040 Samsung Writemaster external DVD writer + 3940 external DVD burner ECD819-SU3 + 3e40 ZALMAN ZM-VE350 13fe Kingston Technology Company Inc. 1a00 512MB/1GB Flash Drive 1a23 512MB Flash Drive @@ -15509,10 +15869,12 @@ 4100 Flash drive 5000 USB flash drive (32 GB SHARKOON Accelerate) 5100 Flash Drive + 5200 DataTraveler R3.0 1400 Axxion Group Corp. 1402 Bowe Bell & Howell 1403 Sitronix 0001 Digital Photo Frame + 0003 Digital Photo Frame (DPF-1104) 1409 IDS Imaging Development Systems GmbH 1000 generic (firmware not loaded yet) 1485 uEye UI1485 @@ -15543,6 +15905,30 @@ 1419 ABILITY ENTERPRISE CO., LTD. 1421 Sensor Technology 0605 Sentech Camera +1424 Posnet Polska S.A. + 1001 Temo + 1002 Thermal + 1003 Neo + 1004 Combo DF + 1005 Thermal-A + 1006 Thermal FV + 1007 Bingo HS + 1008 Thermal HS FV + 1009 Thermal FV EJ + 100a Thermal HD + 100b Thermal + 100c Neo + 100d Ergo + 100e Trio + 1010 Thermal HS FV EJ + 1011 Neo EJ + 1012 Thermal-A + 1013 Thermal-A EJ + 1014 Mobile + 1015 Temo HS + 1016 Mobile HS + 1017 TH230+ FV EJ + 1018 4610-1NR FV EJ 1429 Vega Technologies Industrial (Austria) Co. 142a Thales E-Transactions 0003 Artema Hybrid @@ -15570,6 +15956,20 @@ 1446 X.J.GROUP 6a73 Stamps.com Model 510 5LB Scale 6a78 DYMO Endicia 75lb Digital Scale +1451 Force Dimension + 0301 haptic device + 0302 haptic device + 0400 haptic device + 0401 delta.x haptic device + 0402 omega.x haptic device + 0403 sigma.x haptic device + 0404 haptic controller + 0405 dedicated haptic device + 0406 dedicated haptic device + 0407 dedicated haptic device + 0408 dedicated haptic device +1452 Dai Nippon Printing, Inc + 8b01 DS620 1453 Radio Shack 4026 26-183 Serial Cable 1456 Extending Wire & Cable Co., Ltd. @@ -15587,7 +15987,7 @@ 5123 OpenMoko Neo1973 internal USB CSR4 module 5124 OpenMoko Neo1973 Bluetooth Device ID service 145f Trust - 0106 Trust K56 V92 USB Modem + 0106 K56 V92 Modem 013d PC Camera (SN9C201 + OV7660) 013f Megapixel Auto Focus Webcam 0142 WB-6250X Webcam @@ -15653,10 +16053,12 @@ 5572 RT5572 Wireless Adapter 7601 MT7601U Wireless Adapter 760b MT7601U Wireless Adapter + 761a MT7610U ("Archer T2U" 2.4G+5G WLAN Adapter 9020 RT2500USB Wireless Adapter 9021 RT2501USB Wireless Adapter 1491 Futronic Technology Co. Ltd. 0020 FS81 Fingerprint Scanner Module + 0088 Fingerprint Scanner Model FS88 1493 Suunto 0010 Bluebird [Ambit] 0019 Duck [Ambit2] @@ -15702,6 +16104,7 @@ 0250 Storage Adapter V2 0350 Storage Adapter V2 14c8 Zytronic + 0005 Touchscreen Controller 14cd Super Top 1212 microSD card reader (SY-T18) 121c microSD card reader @@ -15715,6 +16118,8 @@ 6900 Card Reader 8123 SD MMC Reader 8125 SD MMC Reader + 8601 4-Port hub + 8608 Hub [Super Top] 14d8 JAMER INDUSTRIES CO., LTD. 14dd Raritan Computer, Inc. 1007 D2CIM-VUSB KVM connector @@ -15756,6 +16161,35 @@ 0002 HDReye (before firmware loads) 1519 Comneon 0020 HSIC Device +151f Opal Kelly Incorporated + 0020 XEM3001v1 + 0021 XEM3001v2 + 0022 XEM3010 + 0023 XEM3005 + 0028 XEM3050 + 002b XEM5010 + 002c XEM6001 + 002d XEM6010-LX45 + 002e XEM6010-LX150 + 0030 XEM6006-LX16 + 0033 XEM6002-LX9 + 0034 XEM7001-A15 + 0036 XEM7010-A50 + 0037 XEM7010-A200 + 0120 ZEM4310 + 0121 XEM6310-LX45 + 0122 XEM6310-LX150 + 0123 XEM6310MT-LX45T + 0125 XEM7350-K70T + 0126 XEM7350-K160T + 0127 XEM7350-K410T + 0128 XEM6310MT-LX150T + 0129 ZEM5305-A2 + 012b XEM7360-K160T + 012c XEM7360-K410T + 012d ZEM5310-A4 + 0130 XEM7310-A75 + 0131 XEM7310-A200 1520 Bitwire Corp. 1524 ENE Technology Inc 6680 UTS 6680 @@ -15793,8 +16227,12 @@ 0015 spirodoc 152d JMicron Technology Corp. / JMicron USA Technology Corp. 0539 JMS539/567 SuperSpeed SATA II/III 3.0G/6.0G Bridge + 0551 JMS551 SuperSpeed two ports SATA 3Gb/s bridge + 0561 JMS551 - Sharkoon SATA QuickPort Duo 0567 JMS567 SATA 6Gb/s bridge + 0578 JMS567 SATA 6Gb/s bridge 0770 Alienware Integrated Webcam + 1561 JMS561U two ports SATA 6Gb/s bridge 2329 JM20329 SATA Bridge 2335 ATA/ATAPI Bridge 2336 Hard Disk Drive @@ -15802,10 +16240,11 @@ 2338 JM20337 Hi-Speed USB to SATA & PATA Combo Bridge 2339 JM20339 SATA Bridge 2352 ATA/ATAPI Bridge - 2509 JMS539 SuperSpeed SATA II 3.0G Bridge + 2509 JMS539, JMS551 SATA 3Gb/s bridge 2551 JMS551 SATA 3Gb/s bridge + 2561 CEB-2235S-U3 external RAID box 2566 JMS566 SATA 3Gb/s bridge - 2590 Seatay ATA/ATAPI Bridge + 2590 JMS567 SATA 6Gb/s bridge 3562 JMS567 SATA 6Gb/s bridge 3569 JMS566 SATA 3Gb/s bridge 152e LG (HLDS) @@ -15820,19 +16259,44 @@ 0016 DeathAdder Mouse 0017 RZ01-0035 Laser Gaming Mouse [Imperator] 001c RZ01-0036 Optical Gaming Mouse [Abyssus] - 0024 Razer Mamba + 0024 Mamba 002e RZ01-0058 Gaming Mouse [Naga] + 002f Imperator 2012 0036 RZ01-0075, Gaming Mouse [Naga Hex] + 0042 Abyssus 2014 + 0043 DeathAdder Chroma + 0044 Mamba Chroma (Wired) + 0045 Mamba Chroma (Wireless) + 0046 Mamba 2015 Tournament Edition [RZ01-01370100-R3] + 0048 Orochi (Wired) 0101 Copperhead Mouse 0102 Tarantula Keyboard 0109 Lycosa Keyboard + 010d BlackWidow Ultimate 2012 0113 RZ07-0074 Gaming Keypad [Orbweaver] + 0118 RZ03-0080, Gaming Keyboard [Deathstalker] + 011a BlackWidow Ultimate 2013 + 011b BlackWidow Classic + 0203 BlackWidow Chroma + 0205 Blade Stealth + 0208 Tartarus + 0209 BlackWidow Tournament Edition Chroma + 0214 BlackWidow Ultimate 2016 + 0216 BlackWidow X Chroma + 021a BlackWidow X Tournament Edition Chroma + 0220 Blade Stealth (2016) 0300 RZ06-0063 Motion Sensing Controllers [Hydra] + 0c00 Firefly 153b TerraTec Electronic GmbH 1181 Cinergy S2 PCIe Dual Port 1 1182 Cinergy S2 PCIe Dual Port 2 1546 U-Blox AG - 01a5 NL-402U + 01a4 Antaris 4 + 01a5 [u-blox 5] + 01a6 [u-blox 6] + 01a7 [u-blox 7] + 01a8 [u-blox 8] + 1102 LISA-U2 1547 SG Intec Ltd & Co KG 1000 SG-Lock[U2] 154a Celectronic GmbH @@ -15979,6 +16443,7 @@ 15f4 HanfTek 0001 HanfTek UMT-010 USB2.0 DVB-T (cold) 0025 HanfTek UMT-010 USB2.0 DVB-T (warm) + 0135 Astrometa T2hybrid 1604 Tascam 8000 US-428 Audio/Midi Controller (without fw) 8001 US-428 Audio/Midi Controller @@ -15986,6 +16451,8 @@ 8005 US-224 Audio/Midi Controller 8006 US-122 Audio/Midi Interface (without fw) 8007 US-122 Audio/Midi Interface +1605 ACCES I/O Products, Inc. + 0001 DIO-32 (No Firmware Yet) 1606 Umax 0002 Astra 1236U Scanner 0010 Astra 1220U @@ -16091,6 +16558,8 @@ 1617 Sony Corp. 2002 NVX-P1 Personal Navigation System 1619 L & K Precision Technology Co., Ltd. +161c Digitech Systems + 0002 DTC-02U [Digi Touch Controller] 1621 Wionics Research 1628 Stonestreet One, Inc. 162a Airgo Networks Inc. @@ -16140,6 +16609,8 @@ fad1 Alphatrack Control Surface 165c Kondo Kagaku 0002 Serial Adapter + 0006 FT232 [ICS adapter HS] + 0008 FT232 [Dual adapter HS] 1660 Creatix Polymedia GmbH 1667 GIGA-TMS INC. 0005 PCR330A RFID Reader (125 kHz, keyboard emulation) @@ -16181,7 +16652,10 @@ a332 DVB-T Dongle [RTL2832U] 1681 Prevo Technologies, Inc. 0001 Tuner's Dashboard - 0002 Tubachron + 0002 DocuBrain(R) Tubachron + 0003 DocuBrain(R) I2C + 0004 DocuBrain(R) WWVB Receiver + 0005 DocuBrain(R) WWVB Transmitter 1682 Maxwise Production Enterprise Ltd. 1684 Godspeed Computer Corp. 1685 Delock @@ -16308,16 +16782,20 @@ 1502 Bluetooth Dongle 16cc silex technology, Inc. 16d0 MCS + 0436 Xylanta Ltd, XSP Device 0498 Braintechnology USB-LPS 0504 RETRO Innovations ZoomFloppy 054b GrauTec ReelBox OLED Display (external) 05be EasyLogic Board + 06cc Trinamic TMCM-3110 06f9 Gabotronics Xminilab 0753 Digistump DigiSpark 075c AB-1.x UAC1 [Audio Widget] 075d AB-1.x UAC2 [Audio Widget] 080a S2E1 Interface 0870 Kaufmann Automotive GmbH, RKS+CAN Interface + 0b03 AIS Receiver [dAISy] + 0bd4 codesrc SCSI2SD 16d1 Suprema Inc. 0401 SUP-SFR400(A) BioMini Fingerprint Reader 16d3 Frontline Test Equipment, Inc. @@ -16348,6 +16826,7 @@ 0011 MARATON Power Supply System 0012 MPOD Multi Channel Power Supply System 0015 CML Control, Measurement and Data Logging System +16de Telemecanique 16df King Billion Electronics Co., Ltd. 16f0 GN ReSound A/S 0001 Speedlink Programming Interface @@ -16392,6 +16871,9 @@ 0077 WUSB54GC v3 802.11g Adapter [Ralink RT2070L] 0078 WUSB100 v2 RangePlus Wireless Network Adapter [Ralink RT3070] 0079 WUSB600N v2 Dual-Band Wireless-N Network Adapter [Ralink RT3572] +173a Roche + 2198 Accu-Chek Mobile + 21ca ACCU-CHEK Mobile Model U1 173d QSENN 0002 GP-K7000 keyboard 1740 Senao @@ -16413,12 +16895,14 @@ 1748 MQP Electronics 0101 Packet-Master USB12 174c ASMedia Technology Inc. - 1153 ASM2115 SATA 6Gb/s bridge + 07d1 Transcend ESD400 Portable SSD (USB 3.0) + 1153 ASM1153 SATA 3Gb/s bridge 2074 ASM1074 High-Speed hub 3074 ASM1074 SuperSpeed hub 5106 ASM1051 SATA 3Gb/s bridge - 5136 ASM1053 SATA 6Gb/s bridge - 55aa ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge + 5136 ASM1053 SATA 3Gb/s bridge + 51d6 ASM1051W SATA 3Gb/s bridge + 55aa Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge 174f Syntek 1105 SM-MS/Pro-MMC-XD Card Reader 110b HP Webcam @@ -17736,6 +18220,9 @@ 2d50 Kova+ Mouse 2d51 Kone+ Mouse 30d4 Arvo Keyboard +1ea7 SHARKOON Technologies GmbH + 0066 [Mediatrack Edge Mini Keyboard] + 2007 SHARK ZONE K30 Illuminated Gaming Keyboard 1ebb NuCORE Technology, Inc. 1eda AirTies Wireless Networks 2012 Air2210 54 Mbps Wireless Adapter @@ -18215,6 +18702,19 @@ 24e1 Paratronic 3001 Adp-usb 3005 Radius +2516 Cooler Master Co., Ltd. + 0003 Storm Xornet + 0004 Storm QuickFire Rapid Mechanical Keyboard + 0006 Storm Recon + 0007 Storm Sentinel Advance II + 0009 Storm Quick Fire PRO + 0011 Storm Quick Fire TK + 0017 CM Storm Quick Fire Stealth + 0020 QuickFire Rapid-i Keyboard + 0027 CM Storm Coolermaster Novatouch TKL + 002d Alcor mouse + 0047 MasterKeys Pro L + 9494 Sirus Headset 2632 TwinMOS 3209 7-in-1 Card Reader 2639 Xsens @@ -18333,6 +18833,10 @@ 0a02 Jolla Phone Developer 0a05 Jolla PC connection 0afe Jolla charging only +2939 Zaber Technologies Inc. + 4959 A-MCB2 + 495a X-MCB1 + 495b X-MCB2 2a03 dog hunter AG 0001 Linino ONE (bootloader) 0036 Arduino Leonardo (bootloader) diff --git a/usr/src/lib/Makefile.lib b/usr/src/lib/Makefile.lib index 79db7f9bec..82e3a22d41 100644 --- a/usr/src/lib/Makefile.lib +++ b/usr/src/lib/Makefile.lib @@ -112,9 +112,6 @@ ROOTFS_LINKSCCC64= $(ROOTFS_LIBDIR64)/$(LIBLINKSCCC) ROOTLINT= $(LINTSRC:%=$(ROOTLINTDIR)/%) ROOTFS_LINT= $(LINTSRC:%=$(ROOTFS_LINTDIR)/%) ROOTFS_LINT64= $(LINTSRC:%=$(ROOTFS_LINTDIR64)/%) -ROOTMAN3= $(ROOT)/usr/share/man/man3 -ROOTMAN3FILES= $(MAN3FILES:%=$(ROOTMAN3)/%) -$(ROOTMAN3FILES) := FILEMODE= 444 # Demo rules DEMOFILES= @@ -250,9 +247,6 @@ objs/%.o pics/%.o: %.cc # Define the majority text domain in this directory. TEXT_DOMAIN= SUNW_OST_OSLIB -$(ROOTMAN3)/%: %.sunman - $(INS.rename) - # # For library source code, we expect that some symbols may not be used or # may *appear* to be able to rescoped to static; shut lint up. Never add diff --git a/usr/src/lib/libzfs/common/libzfs.h b/usr/src/lib/libzfs/common/libzfs.h index 0e4a8a03df..675914b1e8 100644 --- a/usr/src/lib/libzfs/common/libzfs.h +++ b/usr/src/lib/libzfs/common/libzfs.h @@ -390,6 +390,7 @@ typedef struct importargs { int can_be_active : 1; /* can the pool be active? */ int unique : 1; /* does 'poolname' already exist? */ int exists : 1; /* set on return if pool already exists */ + nvlist_t *policy; /* rewind policy (rewind txg, etc.) */ } importargs_t; extern nvlist_t *zpool_search_import(libzfs_handle_t *, importargs_t *); diff --git a/usr/src/lib/libzfs/common/libzfs_import.c b/usr/src/lib/libzfs/common/libzfs_import.c index 7fbd9faf0b..8cbbd58696 100644 --- a/usr/src/lib/libzfs/common/libzfs_import.c +++ b/usr/src/lib/libzfs/common/libzfs_import.c @@ -412,7 +412,8 @@ vdev_is_hole(uint64_t *hole_array, uint_t holes, uint_t id) * return to the user. */ static nvlist_t * -get_configs(libzfs_handle_t *hdl, pool_list_t *pl, boolean_t active_ok) +get_configs(libzfs_handle_t *hdl, pool_list_t *pl, boolean_t active_ok, + nvlist_t *policy) { pool_entry_t *pe; vdev_entry_t *ve; @@ -746,6 +747,12 @@ get_configs(libzfs_handle_t *hdl, pool_list_t *pl, boolean_t active_ok) continue; } + if (policy != NULL) { + if (nvlist_add_nvlist(config, ZPOOL_REWIND_POLICY, + policy) != 0) + goto nomem; + } + if ((nvl = refresh_config(hdl, config)) == NULL) { nvlist_free(config); config = NULL; @@ -1251,7 +1258,7 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importargs_t *iarg) goto error; } - ret = get_configs(hdl, &pools, iarg->can_be_active); + ret = get_configs(hdl, &pools, iarg->can_be_active, iarg->policy); error: for (pe = pools.pools; pe != NULL; pe = penext) { @@ -1381,6 +1388,14 @@ zpool_find_import_cached(libzfs_handle_t *hdl, const char *cachefile, if (active) continue; + if (nvlist_add_string(src, ZPOOL_CONFIG_CACHEFILE, + cachefile) != 0) { + (void) no_memory(hdl); + nvlist_free(raw); + nvlist_free(pools); + return (NULL); + } + if ((dst = refresh_config(hdl, src)) == NULL) { nvlist_free(raw); nvlist_free(pools); diff --git a/usr/src/lib/libzfs/common/libzfs_iter.c b/usr/src/lib/libzfs/common/libzfs_iter.c index 11ff3e2fd7..59eb50fef0 100644 --- a/usr/src/lib/libzfs/common/libzfs_iter.c +++ b/usr/src/lib/libzfs/common/libzfs_iter.c @@ -435,16 +435,20 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig, /* * Iterate over all children, snapshots and filesystems + * Process snapshots before filesystems because they are nearer the input + * handle: this is extremely important when used with zfs_iter_f functions + * looking for data, following the logic that we would like to find it as soon + * and as close as possible. */ int zfs_iter_children(zfs_handle_t *zhp, zfs_iter_f func, void *data) { int ret; - if ((ret = zfs_iter_filesystems(zhp, func, data)) != 0) + if ((ret = zfs_iter_snapshots(zhp, B_FALSE, func, data)) != 0) return (ret); - return (zfs_iter_snapshots(zhp, B_FALSE, func, data)); + return (zfs_iter_filesystems(zhp, func, data)); } diff --git a/usr/src/lib/libzfs/common/libzfs_pool.c b/usr/src/lib/libzfs/common/libzfs_pool.c index d235f46b52..60681b5841 100644 --- a/usr/src/lib/libzfs/common/libzfs_pool.c +++ b/usr/src/lib/libzfs/common/libzfs_pool.c @@ -1809,8 +1809,9 @@ zpool_import_props(libzfs_handle_t *hdl, nvlist_t *config, const char *newname, nvlist_lookup_nvlist(nvinfo, ZPOOL_CONFIG_MISSING_DEVICES, &missing) == 0) { (void) printf(dgettext(TEXT_DOMAIN, - "The devices below are missing, use " - "'-m' to import the pool anyway:\n")); + "The devices below are missing or " + "corrupted, use '-m' to import the pool " + "anyway:\n")); print_vdev_tree(hdl, NULL, missing, 2); (void) printf("\n"); } diff --git a/usr/src/lib/libzfs/common/libzfs_sendrecv.c b/usr/src/lib/libzfs/common/libzfs_sendrecv.c index 4e89dc053d..d3002aec29 100644 --- a/usr/src/lib/libzfs/common/libzfs_sendrecv.c +++ b/usr/src/lib/libzfs/common/libzfs_sendrecv.c @@ -1577,6 +1577,7 @@ zfs_send_resume(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, int error = 0; char name[ZFS_MAX_DATASET_NAME_LEN]; enum lzc_send_flags lzc_flags = 0; + FILE *fout = (flags->verbose && flags->dryrun) ? stdout : stderr; (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN, "cannot resume send")); @@ -1591,9 +1592,9 @@ zfs_send_resume(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, return (zfs_error(hdl, EZFS_FAULT, errbuf)); } if (flags->verbose) { - (void) fprintf(stderr, dgettext(TEXT_DOMAIN, + (void) fprintf(fout, dgettext(TEXT_DOMAIN, "resume token contents:\n")); - nvlist_print(stderr, resume_nvl); + nvlist_print(fout, resume_nvl); } if (nvlist_lookup_string(resume_nvl, "toname", &toname) != 0 || @@ -1650,7 +1651,7 @@ zfs_send_resume(libzfs_handle_t *hdl, sendflags_t *flags, int outfd, lzc_flags, &size); if (error == 0) size = MAX(0, (int64_t)(size - bytes)); - send_print_verbose(stderr, zhp->zfs_name, fromname, + send_print_verbose(fout, zhp->zfs_name, fromname, size, flags->parsable); } diff --git a/usr/src/lib/libzpool/common/kernel.c b/usr/src/lib/libzpool/common/kernel.c index 1d94907b1a..e74f14cc9b 100644 --- a/usr/src/lib/libzpool/common/kernel.c +++ b/usr/src/lib/libzpool/common/kernel.c @@ -461,6 +461,16 @@ kernel_fini(void) system_taskq_fini(); } +/* ARGSUSED */ +uint32_t +zone_get_hostid(void *zonep) +{ + /* + * We're emulating the system's hostid in userland. + */ + return (strtoul(hw_serial, NULL, 10)); +} + int z_uncompress(void *dst, size_t *dstlen, const void *src, size_t srclen) { diff --git a/usr/src/lib/libzpool/common/sys/zfs_context.h b/usr/src/lib/libzpool/common/sys/zfs_context.h index 4993d77967..199f7203c9 100644 --- a/usr/src/lib/libzpool/common/sys/zfs_context.h +++ b/usr/src/lib/libzpool/common/sys/zfs_context.h @@ -317,6 +317,7 @@ typedef struct callb_cpr { #define zone_dataset_visible(x, y) (1) #define INGLOBALZONE(z) (1) +extern uint32_t zone_get_hostid(void *zonep); extern int zfs_secpolicy_snapshot_perms(const char *name, cred_t *cr); extern int zfs_secpolicy_rename_perms(const char *from, const char *to, diff --git a/usr/src/pkg/manifests/system-test-zfstest.mf b/usr/src/pkg/manifests/system-test-zfstest.mf index 56ce7e7391..18d54d3b64 100644 --- a/usr/src/pkg/manifests/system-test-zfstest.mf +++ b/usr/src/pkg/manifests/system-test-zfstest.mf @@ -1465,11 +1465,44 @@ file \ mode=0444 file path=opt/zfs-tests/tests/functional/cli_root/zpool_import/cleanup \ mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_added \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_removed \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_replaced \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_attached \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_detached \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_shared_device \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_devices_missing \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_paths_changed \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_config_changed \ + mode=0555 +file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_device_replaced \ + mode=0555 file path=opt/zfs-tests/tests/functional/cli_root/zpool_import/setup mode=0555 file \ path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg \ mode=0444 file \ + path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.kshlib \ + mode=0444 +file \ path=opt/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import_001_pos \ mode=0555 file \ diff --git a/usr/src/test/zfs-tests/runfiles/delphix.run b/usr/src/test/zfs-tests/runfiles/delphix.run index 88d6e368ab..9c59485b2a 100644 --- a/usr/src/test/zfs-tests/runfiles/delphix.run +++ b/usr/src/test/zfs-tests/runfiles/delphix.run @@ -279,7 +279,17 @@ tests = ['zpool_import_001_pos', 'zpool_import_002_pos', 'zpool_import_features_001_pos', 'zpool_import_features_002_neg', 'zpool_import_features_003_pos', 'zpool_import_missing_001_pos', 'zpool_import_missing_002_pos', 'zpool_import_missing_003_pos', - 'zpool_import_rename_001_pos'] + 'zpool_import_rename_001_pos', + 'import_cachefile_device_added', + 'import_cachefile_device_removed', + 'import_cachefile_mirror_attached', + 'import_cachefile_mirror_detached', + 'import_cachefile_device_replaced', + 'import_rewind_config_changed', + 'import_rewind_device_replaced', + 'import_cachefile_shared_device', + 'import_paths_changed', + 'import_devices_missing'] [/opt/zfs-tests/tests/functional/cli_root/zpool_labelclear] tests = ['zpool_labelclear_active', 'zpool_labelclear_exported'] diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_added.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_added.ksh new file mode 100644 index 0000000000..bda6b891b9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_added.ksh @@ -0,0 +1,76 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should be importable using an outdated cachefile that is unaware +# that one or two top-level vdevs were added. +# +# STRATEGY: +# 1. Create a pool with some devices and an alternate cachefile. +# 2. Backup the cachefile. +# 3. Add a device/mirror/raid to the pool. +# 4. Export the pool. +# 5. Verify that we can import the pool using the backed-up cachefile. +# + +verify_runnable "global" + +log_onexit cleanup + +function test_add_vdevs +{ + typeset poolcreate="$1" + typeset addvdevs="$2" + typeset poolcheck="$3" + + log_note "$0: pool '$poolcreate', add $addvdevs." + + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $poolcreate + + log_must cp $CPATH $CPATHBKP + + log_must zpool add -f $TESTPOOL1 $addvdevs + + log_must zpool export $TESTPOOL1 + + log_must zpool import -c $CPATHBKP $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolcheck" + + # Cleanup + log_must zpool destroy $TESTPOOL1 + log_must rm -f $CPATH $CPATHBKP + + log_note "" +} + +test_add_vdevs "$VDEV0" "$VDEV1" "$VDEV0 $VDEV1" +test_add_vdevs "$VDEV0 $VDEV1" "$VDEV2" "$VDEV0 $VDEV1 $VDEV2" +test_add_vdevs "$VDEV0" "$VDEV1 $VDEV2" "$VDEV0 $VDEV1 $VDEV2" +test_add_vdevs "$VDEV0" "mirror $VDEV1 $VDEV2" \ + "$VDEV0 mirror $VDEV1 $VDEV2" +test_add_vdevs "mirror $VDEV0 $VDEV1" "mirror $VDEV2 $VDEV3" \ + "mirror $VDEV0 $VDEV1 mirror $VDEV2 $VDEV3" +test_add_vdevs "$VDEV0" "raidz $VDEV1 $VDEV2 $VDEV3" \ + "$VDEV0 raidz $VDEV1 $VDEV2 $VDEV3" +test_add_vdevs "$VDEV0" "log $VDEV1" "$VDEV0 log $VDEV1" +test_add_vdevs "$VDEV0 log $VDEV1" "$VDEV2" "$VDEV0 $VDEV2 log $VDEV1" +test_add_vdevs "$VDEV0" "$VDEV1 log $VDEV2" "$VDEV0 $VDEV1 log $VDEV2" + +log_pass "zpool import -c cachefile_unaware_of_add passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_removed.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_removed.ksh new file mode 100644 index 0000000000..1d878b7a25 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_removed.ksh @@ -0,0 +1,145 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should be importable using an outdated cachefile that is unaware +# that one or more vdevs were removed. +# +# STRATEGY: +# 1. Create a pool with some devices and an alternate cachefile. +# 2. Backup the cachefile. +# 3. Remove device(s) from the pool and remove them. +# 4. (Optionally) Add device(s) to pool. +# 5. Export the pool. +# 6. Verify that we can import the pool using the backed-up cachefile. +# + +verify_runnable "global" + +function custom_cleanup +{ + cleanup +} + +log_onexit custom_cleanup + +function test_remove_vdev +{ + typeset poolcreate="$1" + typeset removevdev="$2" + typeset poolcheck="$3" + + log_note "$0: pool '$poolcreate', remove $2." + + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $poolcreate + + log_must cp $CPATH $CPATHBKP + + log_must zpool remove $TESTPOOL1 $removevdev + log_must wait_for_pool_config $TESTPOOL1 "$poolcheck" + log_must rm $removevdev + + log_must zpool export $TESTPOOL1 + + log_must zpool import -c $CPATHBKP $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolcheck" + + # Cleanup + log_must zpool destroy $TESTPOOL1 + log_must rm -f $CPATH $CPATHBKP + log_must mkfile $FILE_SIZE $removevdev + + log_note "" +} + +# +# We have to remove top-level non-log vdevs one by one, else there is a high +# chance pool will report busy and command will fail for the second vdev. +# +function test_remove_two_vdevs +{ + log_note "$0." + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 \ + $VDEV0 $VDEV1 $VDEV2 $VDEV3 $VDEV4 + + log_must cp $CPATH $CPATHBKP + + log_must zpool remove $TESTPOOL1 $VDEV4 + log_must wait_for_pool_config $TESTPOOL1 \ + "$VDEV0 $VDEV1 $VDEV2 $VDEV3" + log_must zpool remove $TESTPOOL1 $VDEV3 + log_must wait_for_pool_config $TESTPOOL1 "$VDEV0 $VDEV1 $VDEV2" + log_must rm $VDEV3 $VDEV4 + + log_must zpool export $TESTPOOL1 + + log_must zpool import -c $CPATHBKP $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$VDEV0 $VDEV1 $VDEV2" + + # Cleanup + log_must zpool destroy $TESTPOOL1 + log_must rm -f $CPATH $CPATHBKP + log_must mkfile $FILE_SIZE $VDEV3 $VDEV4 + + log_note "" +} + +# +# We want to test the case where a whole created by a log device is filled +# by a regular device +# +function test_remove_log_then_add_vdev +{ + log_note "$0." + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 \ + $VDEV0 $VDEV1 $VDEV2 log $VDEV3 + + log_must cp $CPATH $CPATHBKP + + log_must zpool remove $TESTPOOL1 $VDEV1 + log_must wait_for_pool_config $TESTPOOL1 "$VDEV0 $VDEV2 log $VDEV3" + log_must zpool remove $TESTPOOL1 $VDEV3 + log_must check_pool_config $TESTPOOL1 "$VDEV0 $VDEV2" + log_must rm $VDEV1 $VDEV3 + log_must zpool add $TESTPOOL1 $VDEV4 + + log_must zpool export $TESTPOOL1 + + log_must zpool import -c $CPATHBKP $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$VDEV0 $VDEV2 $VDEV4" + + # Cleanup + log_must zpool destroy $TESTPOOL1 + log_must rm -f $CPATH $CPATHBKP + log_must mkfile $FILE_SIZE $VDEV1 $VDEV3 + + log_note "" +} + +test_remove_vdev "$VDEV0 $VDEV1 $VDEV2" "$VDEV2" "$VDEV0 $VDEV1" +test_remove_vdev "$VDEV0 $VDEV1 $VDEV2" "$VDEV1" "$VDEV0 $VDEV2" +test_remove_vdev "$VDEV0 log $VDEV1" "$VDEV1" "$VDEV0" +test_remove_vdev "$VDEV0 log $VDEV1 $VDEV2" "$VDEV1 $VDEV2" "$VDEV0" +test_remove_vdev "$VDEV0 $VDEV1 $VDEV2 log $VDEV3" "$VDEV2" \ + "$VDEV0 $VDEV1 log $VDEV3" +test_remove_two_vdevs +test_remove_log_then_add_vdev + +log_pass "zpool import -c cachefile_unaware_of_remove passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_replaced.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_replaced.ksh new file mode 100644 index 0000000000..74957770cb --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_device_replaced.ksh @@ -0,0 +1,164 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should be importable using an outdated cachefile that is unaware +# of a zpool replace operation at different stages in time. +# +# STRATEGY: +# 1. Create a pool with some devices and an alternate cachefile. +# 2. Backup the cachefile. +# 3. Initiate device replacement, backup cachefile again and export pool. +# Special care must be taken so that resilvering doesn't complete +# before we exported the pool. +# 4. Verify that we can import the pool using the first cachefile backup. +# (Test 1. cachefile: pre-replace, pool: resilvering) +# 5. Wait for the resilvering to finish and export the pool. +# 6. Verify that we can import the pool using the first cachefile backup. +# (Test 2. cachefile: pre-replace, pool: post-replace) +# 7. Export the pool. +# 8. Verify that we can import the pool using the second cachefile backup. +# (Test 3. cachefile: resilvering, pool: post-replace) +# +# STRATEGY TO SLOW DOWN RESILVERING: +# 1. Reduce zfs_txg_timeout, which controls how long can we resilver for +# each sync. +# 2. Add data to pool +# 3. Re-import the pool so that data isn't cached +# 4. Use zinject to slow down device I/O +# 5. Trigger the resilvering +# 6. Use spa freeze to stop writing to the pool. +# 7. Clear zinject events (needed to export the pool) +# 8. Export the pool +# + +verify_runnable "global" + +ZFS_TXG_TIMEOUT="" + +function custom_cleanup +{ + # Revert zfs_txg_timeout to defaults + [[ -n ZFS_TXG_TIMEOUT ]] && + log_must set_zfs_txg_timeout $ZFS_TXG_TIMEOUT + + cleanup +} + +log_onexit custom_cleanup + +function test_replacing_vdevs +{ + typeset poolcreate="$1" + typeset replacevdev="$2" + typeset replaceby="$3" + typeset poolfinalstate="$4" + typeset zinjectdevices="$5" + typeset earlyremove="$6" + + log_note "$0: pool '$poolcreate', replace $replacevdev by $replaceby." + + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $poolcreate + + # Cachefile: pool in pre-replace state + log_must cp $CPATH $CPATHBKP + + # Steps to insure resilvering happens very slowly. + log_must write_some_data $TESTPOOL1 + log_must zpool export $TESTPOOL1 + log_must cp $CPATHBKP $CPATH + log_must zpool import -c $CPATH -o cachefile=$CPATH $TESTPOOL1 + typeset device + for device in $zinjectdevices ; do + log_must zinject -d $device -D 200:1 $TESTPOOL1 > /dev/null + done + log_must zpool replace $TESTPOOL1 $replacevdev $replaceby + + # Cachefile: pool in resilvering state + log_must cp $CPATH $CPATHBKP2 + + # We must disable zinject in order to export the pool, so we freeze + # it first to prevent writing out subsequent resilvering progress. + log_must zpool freeze $TESTPOOL1 + # Confirm pool is still replacing + log_must pool_is_replacing $TESTPOOL1 + log_must zinject -c all > /dev/null + log_must zpool export $TESTPOOL1 + + ( $earlyremove ) && log_must rm $replacevdev + + ############################################################ + # Test 1. Cachefile: pre-replace, pool: resilvering + ############################################################ + log_must cp $CPATHBKP $CPATH + log_must zpool import -c $CPATH $TESTPOOL1 + + # Wait for resilvering to finish + log_must wait_for_pool_config $TESTPOOL1 "$poolfinalstate" + log_must zpool export $TESTPOOL1 + + ( ! $earlyremove ) && log_must rm $replacevdev + + ############################################################ + # Test 2. Cachefile: pre-replace, pool: post-replace + ############################################################ + log_must zpool import -c $CPATHBKP $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolfinalstate" + log_must zpool export $TESTPOOL1 + + ############################################################ + # Test 3. Cachefile: resilvering, pool: post-replace + ############################################################ + log_must zpool import -c $CPATHBKP2 $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolfinalstate" + + # Cleanup + log_must zpool destroy $TESTPOOL1 + log_must rm -f $CPATH $CPATHBKP $CPATHBKP2 + log_must mkfile $FILE_SIZE $replacevdev + + log_note "" +} + +# We set zfs_txg_timeout to 1 to reduce resilvering time at each sync. +ZFS_TXG_TIMEOUT=$(get_zfs_txg_timeout) +set_zfs_txg_timeout 1 + +test_replacing_vdevs "$VDEV0 $VDEV1" \ + "$VDEV1" "$VDEV2" \ + "$VDEV0 $VDEV2" \ + "$VDEV0 $VDEV1" \ + false + +test_replacing_vdevs "mirror $VDEV0 $VDEV1" \ + "$VDEV1" "$VDEV2" \ + "mirror $VDEV0 $VDEV2" \ + "$VDEV0 $VDEV1" \ + true + +test_replacing_vdevs "raidz $VDEV0 $VDEV1 $VDEV2" \ + "$VDEV1" "$VDEV3" \ + "raidz $VDEV0 $VDEV3 $VDEV2" \ + "$VDEV0 $VDEV1 $VDEV2" \ + true + +set_zfs_txg_timeout $ZFS_TXG_TIMEOUT + +log_pass "zpool import -c cachefile_unaware_of_replace passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_attached.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_attached.ksh new file mode 100644 index 0000000000..987b745b91 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_attached.ksh @@ -0,0 +1,72 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should be importable using an outdated cachefile that misses a +# mirror that was attached. +# +# STRATEGY: +# 1. Create a pool with some devices and an alternate cachefile. +# 2. Backup the cachefile. +# 3. Attach a mirror to one of the devices in the pool. +# 4. Export the pool. +# 5. Verify that we can import the pool using the backed-up cachefile. +# + +verify_runnable "global" + +log_onexit cleanup + +function test_attach_vdev +{ + typeset poolcreate="$1" + typeset attachto="$2" + typeset attachvdev="$3" + typeset poolcheck="$4" + + log_note "$0: pool '$poolcreate', attach $attachvdev to $attachto." + + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $poolcreate + + log_must cp $CPATH $CPATHBKP + + log_must zpool attach $TESTPOOL1 $attachto $attachvdev + + log_must zpool export $TESTPOOL1 + + log_must zpool import -c $CPATHBKP $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolcheck" + + # Cleanup + log_must zpool destroy $TESTPOOL1 + log_must rm -f $CPATH $CPATHBKP + + log_note "" +} + +test_attach_vdev "$VDEV0" "$VDEV0" "$VDEV4" "mirror $VDEV0 $VDEV4" +test_attach_vdev "$VDEV0 $VDEV1" "$VDEV1" "$VDEV4" \ + "$VDEV0 mirror $VDEV1 $VDEV4" +test_attach_vdev "mirror $VDEV0 $VDEV1" "$VDEV0" "$VDEV4" \ + "mirror $VDEV0 $VDEV1 $VDEV4" +test_attach_vdev "$VDEV0 log $VDEV1" "$VDEV1" "$VDEV4" \ + "$VDEV0 log mirror $VDEV1 $VDEV4" + +log_pass "zpool import -c cachefile_unaware_of_attach passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_detached.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_detached.ksh new file mode 100644 index 0000000000..85ec51673b --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_mirror_detached.ksh @@ -0,0 +1,70 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should be importable using an outdated cachefile that is unaware +# that a mirror was detached. +# +# STRATEGY: +# 1. Create a pool with some devices mirrored and an alternate cachefile. +# 2. Backup the cachefile. +# 3. Detach a mirror from the pool. +# 4. Export the pool. +# 5. Verify that we can import the pool using the backed-up cachefile. +# + +verify_runnable "global" + +log_onexit cleanup + +function test_detach_vdev +{ + typeset poolcreate="$1" + typeset poolcheck="$2" + + log_note "$0: pool '$poolcreate', detach $VDEV4." + + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $poolcreate + + log_must cp $CPATH $CPATHBKP + + log_must zpool detach $TESTPOOL1 $VDEV4 + log_must rm -f $VDEV4 + + log_must zpool export $TESTPOOL1 + + log_must zpool import -c $CPATHBKP $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolcheck" + + # Cleanup + log_must zpool destroy $TESTPOOL1 + log_must rm -f $CPATH $CPATHBKP + log_must mkfile $FILE_SIZE $VDEV4 + + log_note "" +} + +test_detach_vdev "mirror $VDEV0 $VDEV4" "$VDEV0" +test_detach_vdev "mirror $VDEV0 $VDEV4 mirror $VDEV1 $VDEV2" \ + "$VDEV0 mirror $VDEV1 $VDEV2" +test_detach_vdev "mirror $VDEV0 $VDEV1 $VDEV4" "mirror $VDEV0 $VDEV1" +test_detach_vdev "$VDEV0 log mirror $VDEV1 $VDEV4" "$VDEV0 log $VDEV1" + +log_pass "zpool import -c cachefile_unaware_of_detach passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_shared_device.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_shared_device.ksh new file mode 100644 index 0000000000..66225c11b9 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_cachefile_shared_device.ksh @@ -0,0 +1,113 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should not try to write to a device that doesn't belong to it +# anymore, even if the device is in its cachefile. +# +# STRATEGY: +# 1. Create pool1 with some devices and an alternate cachefile. +# 2. Backup the cachefile. +# 3. Export pool1. +# 4. Create pool2 using a device that belongs to pool1. +# 5. Export pool2. +# 6. Compute checksum of the shared device. +# 7. Import pool1 and write some data to it. +# 8. Verify that the checksum of the shared device hasn't changed. +# + +verify_runnable "global" + +function custom_cleanup +{ + destroy_pool $TESTPOOL2 + cleanup +} + +log_onexit custom_cleanup + +function dev_checksum +{ + typeset dev="$1" + typeset checksum + + log_note "Compute checksum of '$dev'" + + checksum=$(md5sum $dev) + if [[ $? -ne 0 ]]; then + log_fail "Failed to compute checksum of '$dev'" + return 1 + fi + + echo "$checksum" + return 0 +} + +function test_shared_device +{ + typeset pool1="$1" + typeset pool2="$2" + typeset sharedvdev="$3" + typeset importflags="${4:-}" + + log_note "$0: pool1 '$pool1', pool2 '$pool2' takes $sharedvdev." + + log_must zpool create -o cachefile=$CPATH $TESTPOOL1 $pool1 + + log_must cp $CPATH $CPATHBKP + + log_must zpool export $TESTPOOL1 + + log_must zpool create -f $TESTPOOL2 $pool2 + + log_must zpool export $TESTPOOL2 + + typeset checksum1=$(dev_checksum $sharedvdev) + + log_must zpool import -c $CPATHBKP $importflags $TESTPOOL1 + + log_must write_some_data $TESTPOOL1 2 + + log_must zpool destroy $TESTPOOL1 + + typeset checksum2=$(dev_checksum $sharedvdev) + + if [[ $checksum1 == $checksum2 ]]; then + log_pos "Device hasn't been modified by original pool" + else + log_fail "Device has been modified by original pool." \ + "Checksum mismatch: $checksum1 != $checksum2." + fi + + # Cleanup + log_must zpool import -d $DEVICE_DIR $TESTPOOL2 + log_must zpool destroy $TESTPOOL2 + log_must rm -f $CPATH $CPATHBKP + + log_note "" +} + +test_shared_device "mirror $VDEV0 $VDEV1" "mirror $VDEV1 $VDEV2" "$VDEV1" +test_shared_device "mirror $VDEV0 $VDEV1 $VDEV2" "mirror $VDEV2 $VDEV3" \ + "$VDEV2" +test_shared_device "raidz $VDEV0 $VDEV1 $VDEV2" "$VDEV2" "$VDEV2" +test_shared_device "$VDEV0 log $VDEV1" "$VDEV2 log $VDEV1" "$VDEV1" "-m" + +log_pass "Pool doesn't write to a device it doesn't own anymore." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_devices_missing.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_devices_missing.ksh new file mode 100644 index 0000000000..3f45ada6ee --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_devices_missing.ksh @@ -0,0 +1,122 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should be importable when up to 2 top-level devices are missing. +# +# STRATEGY: +# 1. Create a pool. +# 2. Write some data to the pool and checksum it. +# 3. Add one or more devices. +# 4. Write more data to the pool and checksum it. +# 5. Export the pool. +# 6. Move added devices out of the devices directory. +# 7. Import the pool with missing devices. +# 8. Verify that the first batch of data is intact. +# 9. Verify that accessing the second batch of data doesn't suspend pool. +# 10. Export the pool, move back missing devices, Re-import the pool. +# 11. Verify that all the data is intact. +# + +verify_runnable "global" + +function custom_cleanup +{ + log_must set_spa_load_verify_metadata 1 + log_must set_spa_load_verify_data 1 + log_must set_zfs_max_missing_tvds 0 + log_must rm -rf $BACKUP_DEVICE_DIR + # Highly damaged pools may fail to be destroyed, so we export them. + poolexists $TESTPOOL1 && log_must zpool export $TESTPOOL1 + cleanup +} + +log_onexit custom_cleanup + +function test_devices_missing +{ + typeset poolcreate="$1" + typeset addvdevs="$2" + typeset missingvdevs="$3" + typeset -i missingtvds="$4" + + log_note "$0: pool '$poolcreate', adding $addvdevs, then" \ + "moving away $missingvdevs." + + log_must zpool create $TESTPOOL1 $poolcreate + + log_must generate_data $TESTPOOL1 $MD5FILE "first" + + log_must zpool add $TESTPOOL1 $addvdevs + + log_must generate_data $TESTPOOL1 $MD5FILE2 "second" + + log_must zpool export $TESTPOOL1 + + log_must mv $missingvdevs $BACKUP_DEVICE_DIR + + # Tell zfs that it is ok to import a pool with missing top-level vdevs + log_must set_zfs_max_missing_tvds $missingtvds + # Missing devices means that data or metadata may be corrupted. + (( missingtvds > 1 )) && log_must set_spa_load_verify_metadata 0 + log_must set_spa_load_verify_data 0 + log_must zpool import -o readonly=on -d $DEVICE_DIR $TESTPOOL1 + + log_must verify_data_md5sums $MD5FILE + + log_note "Try reading second batch of data, make sure pool doesn't" \ + "get suspended." + verify_data_md5sums $MD5FILE >/dev/null 2>&1 + + log_must zpool export $TESTPOOL1 + + typeset newpaths=$(echo "$missingvdevs" | \ + sed "s:$DEVICE_DIR:$BACKUP_DEVICE_DIR:g") + log_must mv $newpaths $DEVICE_DIR + log_must set_spa_load_verify_metadata 1 + log_must set_spa_load_verify_data 1 + log_must set_zfs_max_missing_tvds 0 + log_must zpool import -d $DEVICE_DIR $TESTPOOL1 + + log_must verify_data_md5sums $MD5FILE + log_must verify_data_md5sums $MD5FILE2 + + # Cleanup + log_must zpool destroy $TESTPOOL1 + + log_note "" +} + +log_must mkdir $BACKUP_DEVICE_DIR + +test_devices_missing "$VDEV0" "$VDEV1" "$VDEV1" 1 +test_devices_missing "$VDEV0" "$VDEV1 $VDEV2" "$VDEV1" 1 +test_devices_missing "mirror $VDEV0 $VDEV1" "mirror $VDEV2 $VDEV3" \ + "$VDEV2 $VDEV3" 1 +test_devices_missing "$VDEV0 log $VDEV1" "$VDEV2" "$VDEV2" 1 + +# +# Note that we are testing for 2 non-consecutive missing devices. +# Missing consecutive devices results in missing metadata. Because of +# Missing metadata can cause the root dataset to fail to mount. +# +test_devices_missing "$VDEV0" "$VDEV1 $VDEV2 $VDEV3" "$VDEV1 $VDEV3" 2 + +log_pass "zpool import succeeded with missing devices." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_paths_changed.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_paths_changed.ksh new file mode 100644 index 0000000000..457eb6a14a --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_paths_changed.ksh @@ -0,0 +1,98 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# A pool should be importable even if device paths have changed. +# +# STRATEGY: +# 1. Create a pool. +# 2. Export the pool. +# 3. Change the paths of some of the devices. +# 4. Verify that we can import the pool in a healthy state. +# + +verify_runnable "global" + +log_onexit cleanup + +function test_new_paths +{ + typeset poolcreate="$1" + typeset pathstochange="$2" + + log_note "$0: pool '$poolcreate', changing paths of $pathstochange." + + log_must zpool create $TESTPOOL1 $poolcreate + + log_must zpool export $TESTPOOL1 + + for dev in $pathstochange; do + log_must mv $dev "${dev}_new" + done + + log_must zpool import -d $DEVICE_DIR $TESTPOOL1 + log_must check_pool_healthy $TESTPOOL1 + + # Cleanup + log_must zpool destroy $TESTPOOL1 + for dev in $pathstochange; do + log_must mv "${dev}_new" $dev + done + + log_note "" +} + +function test_swap_paths +{ + typeset poolcreate="$1" + typeset pathtoswap1="$2" + typeset pathtoswap2="$3" + + log_note "$0: pool '$poolcreate', swapping paths of $pathtoswap1" \ + "and $pathtoswap2." + + log_must zpool create $TESTPOOL1 $poolcreate + + log_must zpool export $TESTPOOL1 + + log_must mv $pathtoswap2 "$pathtoswap2.tmp" + log_must mv $pathtoswap1 "$pathtoswap2" + log_must mv "$pathtoswap2.tmp" $pathtoswap1 + + log_must zpool import -d $DEVICE_DIR $TESTPOOL1 + log_must check_pool_healthy $TESTPOOL1 + + # Cleanup + log_must zpool destroy $TESTPOOL1 + + log_note "" +} + +test_new_paths "$VDEV0 $VDEV1" "$VDEV0 $VDEV1" +test_new_paths "mirror $VDEV0 $VDEV1" "$VDEV0 $VDEV1" +test_new_paths "$VDEV0 log $VDEV1" "$VDEV1" +test_new_paths "raidz $VDEV0 $VDEV1 $VDEV2" "$VDEV1" + +test_swap_paths "$VDEV0 $VDEV1" "$VDEV0" "$VDEV1" +test_swap_paths "raidz $VDEV0 $VDEV1 $VDEV2" "$VDEV0" "$VDEV1" +test_swap_paths "mirror $VDEV0 $VDEV1 mirror $VDEV2 $VDEV3" \ + "$VDEV0" "$VDEV2" + +log_pass "zpool import succeeded after changing device paths." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_config_changed.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_config_changed.ksh new file mode 100644 index 0000000000..dda30a09df --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_config_changed.ksh @@ -0,0 +1,236 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# It should be possible to rewind a pool beyond a configuration change. +# +# STRATEGY: +# 1. Create a pool. +# 2. Generate files and remember their md5sum. +# 3. Note last synced txg. +# 4. Take a snapshot to make sure old blocks are not overwritten. +# 5. Perform zpool add/attach/detach/remove operation. +# 6. Change device paths if requested and re-import pool. +# 7. Overwrite the files. +# 8. Export the pool. +# 9. Verify that we can rewind the pool to the noted txg. +# 10. Verify that the files are readable and retain their old data. +# +# DISCLAIMER: +# This test can fail since nothing guarantees that old MOS blocks aren't +# overwritten. Snapshots protect datasets and data files but not the MOS. +# sync_some_data_a_few_times interleaves file data and MOS data for a few +# txgs, thus increasing the odds that some txgs will have their MOS data +# left untouched. +# + +verify_runnable "global" + +function custom_cleanup +{ + set_vdev_validate_skip 0 + cleanup +} + +log_onexit custom_cleanup + +function test_common +{ + typeset poolcreate="$1" + typeset addvdevs="$2" + typeset attachargs="${3:-}" + typeset detachvdev="${4:-}" + typeset removevdev="${5:-}" + typeset finalpool="${6:-}" + + typeset poolcheck="$poolcreate" + + log_must zpool create $TESTPOOL1 $poolcreate + + log_must generate_data $TESTPOOL1 $MD5FILE + + # syncing a few times while writing new data increases the odds that MOS + # metadata for some of the txgs will survive + log_must sync_some_data_a_few_times $TESTPOOL1 + typeset txg + txg=$(get_last_txg_synced $TESTPOOL1) + log_must zfs snapshot -r $TESTPOOL1@snap1 + + # + # Perform config change operations + # + if [[ -n $addvdev ]]; then + log_must zpool add -f $TESTPOOL1 $addvdev + fi + if [[ -n $attachargs ]]; then + log_must zpool attach $TESTPOOL1 $attachargs + fi + if [[ -n $detachvdev ]]; then + log_must zpool detach $TESTPOOL1 $detachvdev + fi + if [[ -n $removevdev ]]; then + [[ -z $finalpool ]] && + log_fail "Must provide final pool status!" + log_must zpool remove $TESTPOOL1 $removevdev + log_must wait_for_pool_config $TESTPOOL1 "$finalpool" + fi + if [[ -n $pathstochange ]]; then + # + # Change device paths and re-import pool to update labels + # + sudo zpool export $TESTPOOL1 + for dev in $pathstochange; do + log_must mv $dev "${dev}_new" + poolcheck=$(echo "$poolcheck" | \ + sed "s:$dev:${dev}_new:g") + done + sudo zpool import -d $DEVICE_DIR $TESTPOOL1 + fi + + log_must overwrite_data $TESTPOOL1 "" + + log_must zpool export $TESTPOOL1 + + log_must zpool import -d $DEVICE_DIR -T $txg $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolcheck" + + log_must verify_data_md5sums $MD5FILE + + # Cleanup + log_must zpool destroy $TESTPOOL1 + if [[ -n $pathstochange ]]; then + for dev in $pathstochange; do + log_must mv "${dev}_new" $dev + done + fi + # Fast way to clear vdev labels + log_must zpool create -f $TESTPOOL2 $VDEV0 $VDEV1 $VDEV2 $VDEV3 $VDEV4 + log_must zpool destroy $TESTPOOL2 + + log_note "" +} + +function test_add_vdevs +{ + typeset poolcreate="$1" + typeset addvdevs="$2" + + log_note "$0: pool '$poolcreate', add $addvdevs." + + test_common "$poolcreate" "$addvdevs" +} + +function test_attach_vdev +{ + typeset poolcreate="$1" + typeset attachto="$2" + typeset attachvdev="$3" + + log_note "$0: pool '$poolcreate', attach $attachvdev to $attachto." + + test_common "$poolcreate" "" "$attachto $attachvdev" +} + +function test_detach_vdev +{ + typeset poolcreate="$1" + typeset detachvdev="$2" + + log_note "$0: pool '$poolcreate', detach $detachvdev." + + test_common "$poolcreate" "" "" "$detachvdev" +} + +function test_attach_detach_vdev +{ + typeset poolcreate="$1" + typeset attachto="$2" + typeset attachvdev="$3" + typeset detachvdev="$4" + + log_note "$0: pool '$poolcreate', attach $attachvdev to $attachto," \ + "then detach $detachvdev." + + test_common "$poolcreate" "" "$attachto $attachvdev" "$detachvdev" +} + +function test_remove_vdev +{ + typeset poolcreate="$1" + typeset removevdev="$2" + typeset finalpool="$3" + + log_note "$0: pool '$poolcreate', remove $removevdev." + + test_common "$poolcreate" "" "" "" "$removevdev" "$finalpool" +} + +# Make the devices bigger to reduce chances of overwriting MOS metadata. +increase_device_sizes $(( FILE_SIZE * 4 )) + +# Part of the rewind test is to see how it reacts to path changes +typeset pathstochange="$VDEV0 $VDEV1 $VDEV2 $VDEV3" + +log_note " == test rewind after device addition == " + +test_add_vdevs "$VDEV0" "$VDEV1" +test_add_vdevs "$VDEV0 $VDEV1" "$VDEV2" +test_add_vdevs "$VDEV0" "$VDEV1 $VDEV2" +test_add_vdevs "mirror $VDEV0 $VDEV1" "mirror $VDEV2 $VDEV3" +test_add_vdevs "$VDEV0" "raidz $VDEV1 $VDEV2 $VDEV3" +test_add_vdevs "$VDEV0" "log $VDEV1" +test_add_vdevs "$VDEV0 log $VDEV1" "$VDEV2" + +log_note " == test rewind after device attach == " + +test_attach_vdev "$VDEV0" "$VDEV0" "$VDEV1" +test_attach_vdev "mirror $VDEV0 $VDEV1" "$VDEV0" "$VDEV2" +test_attach_vdev "$VDEV0 $VDEV1" "$VDEV0" "$VDEV2" + +log_note " == test rewind after device removal == " + +# Once we remove a device it will be overlooked in the device scan, so we must +# preserve its original path +pathstochange="$VDEV0 $VDEV2" +test_remove_vdev "$VDEV0 $VDEV1 $VDEV2" "$VDEV1" "$VDEV0 $VDEV2" + +# +# Path change and detach are incompatible. Detach changes the guid of the vdev +# so we have no direct way to link the new path to an existing vdev. +# +pathstochange="" + +log_note " == test rewind after device detach == " + +test_detach_vdev "mirror $VDEV0 $VDEV1" "$VDEV1" +test_detach_vdev "mirror $VDEV0 $VDEV1 mirror $VDEV2 $VDEV3" "$VDEV1" +test_detach_vdev "$VDEV0 log mirror $VDEV1 $VDEV2" "$VDEV2" + +log_note " == test rewind after device attach followed by device detach == " + +# +# We need to disable vdev validation since once we detach VDEV1, VDEV0 will +# inherit the mirror tvd's guid and lose its original guid. +# +set_vdev_validate_skip 1 +test_attach_detach_vdev "$VDEV0" "$VDEV0" "$VDEV1" "$VDEV1" +set_vdev_validate_skip 0 + +log_pass "zpool import rewind after configuration change passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_device_replaced.ksh b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_device_replaced.ksh new file mode 100644 index 0000000000..d57ced1040 --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/import_rewind_device_replaced.ksh @@ -0,0 +1,181 @@ +#!/usr/bin/ksh -p + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.kshlib + +# +# DESCRIPTION: +# It should be possible to rewind a pool beyond a device replacement. +# +# STRATEGY: +# 1. Create a pool. +# 2. Generate files and remember their md5sum. +# 3. Sync a few times and note last synced txg. +# 4. Take a snapshot to make sure old blocks are not overwritten. +# 5. Initiate device replacement and export the pool. Special care must +# be taken so that resilvering doesn't complete before the export. +# 6. Test 1: Rewind pool to noted txg and then verify data checksums. +# Import it read-only so that we do not overwrite blocks in later txgs. +# 7. Re-import pool at latest txg and let the replacement finish. +# 8. Export the pool an remove the new device - we shouldn't need it. +# 9. Test 2: Rewind pool to noted txg and then verify data checksums. +# +# STRATEGY TO SLOW DOWN RESILVERING: +# 1. Reduce zfs_txg_timeout, which controls how long can we resilver for +# each sync. +# 2. Add data to pool +# 3. Re-import the pool so that data isn't cached +# 4. Use zinject to slow down device I/O +# 5. Trigger the resilvering +# 6. Use spa freeze to stop writing to the pool. +# 7. Clear zinject events (needed to export the pool) +# 8. Export the pool +# +# DISCLAIMER: +# This test can fail since nothing guarantees that old MOS blocks aren't +# overwritten. Snapshots protect datasets and data files but not the MOS. +# sync_some_data_a_few_times interleaves file data and MOS data for a few +# txgs, thus increasing the odds that some txgs will have their MOS data +# left untouched. +# + +verify_runnable "global" + +ZFS_TXG_TIMEOUT="" + +function custom_cleanup +{ + # Revert zfs_txg_timeout to defaults + [[ -n ZFS_TXG_TIMEOUT ]] && + log_must set_zfs_txg_timeout $ZFS_TXG_TIMEOUT + log_must rm -rf $BACKUP_DEVICE_DIR + cleanup +} + +log_onexit custom_cleanup + +function test_replace_vdev +{ + typeset poolcreate="$1" + typeset replacevdev="$2" + typeset replaceby="$3" + typeset poolfinalstate="$4" + typeset zinjectdevices="$5" + + log_note "$0: pool '$poolcreate', replace $replacevdev by $replaceby." + + log_must zpool create $TESTPOOL1 $poolcreate + + # generate data and checksum it + log_must generate_data $TESTPOOL1 $MD5FILE + + # add more data so that resilver takes longer + log_must write_some_data $TESTPOOL1 + + # Syncing a few times while writing new data increases the odds that + # MOS metadata for some of the txgs will survive. + log_must sync_some_data_a_few_times $TESTPOOL1 + typeset txg + txg=$(get_last_txg_synced $TESTPOOL1) + log_must zfs snapshot -r $TESTPOOL1@snap1 + + # This should not free original data. + log_must overwrite_data $TESTPOOL1 "" + + # Steps to insure resilvering happens very slowly. + log_must zpool export $TESTPOOL1 + log_must zpool import -d $DEVICE_DIR $TESTPOOL1 + typeset device + for device in $zinjectdevices ; do + log_must zinject -d $device -D 200:1 $TESTPOOL1 > /dev/null + done + log_must zpool replace $TESTPOOL1 $replacevdev $replaceby + + # We must disable zinject in order to export the pool, so we freeze + # it first to prevent writing out subsequent resilvering progress. + log_must zpool freeze $TESTPOOL1 + # Confirm pool is still replacing + log_must pool_is_replacing $TESTPOOL1 + log_must zinject -c all > /dev/null + log_must zpool export $TESTPOOL1 + + ############################################################ + # Test 1: rewind while device is resilvering. + # Import read only to avoid overwriting more recent blocks. + ############################################################ + log_must zpool import -d $DEVICE_DIR -o readonly=on -T $txg $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolcreate" + + log_must verify_data_md5sums $MD5FILE + + log_must zpool export $TESTPOOL1 + + # Import pool at latest txg to finish the resilvering + log_must zpool import -d $DEVICE_DIR $TESTPOOL1 + log_must overwrite_data $TESTPOOL1 "" + log_must wait_for_pool_config $TESTPOOL1 "$poolfinalstate" + log_must zpool export $TESTPOOL1 + + # Move out the new device + log_must mv $replaceby $BACKUP_DEVICE_DIR/ + + ############################################################ + # Test 2: rewind after device has been replaced. + # Import read-write since we won't need the pool anymore. + ############################################################ + log_must zpool import -d $DEVICE_DIR -T $txg $TESTPOOL1 + log_must check_pool_config $TESTPOOL1 "$poolcreate" + + log_must verify_data_md5sums $MD5FILE + + # Cleanup + log_must zpool destroy $TESTPOOL1 + # Restore the device we moved out + log_must mv "$BACKUP_DEVICE_DIR/$(basename $replaceby)" $DEVICE_DIR/ + # Fast way to clear vdev labels + log_must zpool create -f $TESTPOOL2 $VDEV0 $VDEV1 $VDEV2 $VDEV3 $VDEV4 + log_must zpool destroy $TESTPOOL2 + + log_note "" +} + +log_must mkdir $BACKUP_DEVICE_DIR +# Make the devices bigger to reduce chances of overwriting MOS metadata. +increase_device_sizes $(( FILE_SIZE * 4 )) + +# We set zfs_txg_timeout to 1 to reduce resilvering time at each sync. +ZFS_TXG_TIMEOUT=$(get_zfs_txg_timeout) +set_zfs_txg_timeout 1 + +test_replace_vdev "$VDEV0 $VDEV1" \ + "$VDEV1" "$VDEV2" \ + "$VDEV0 $VDEV2" \ + "$VDEV0 $VDEV1" + +test_replace_vdev "mirror $VDEV0 $VDEV1" \ + "$VDEV1" "$VDEV2" \ + "mirror $VDEV0 $VDEV2" \ + "$VDEV0 $VDEV1" + +test_replace_vdev "raidz $VDEV0 $VDEV1 $VDEV2" \ + "$VDEV1" "$VDEV3" \ + "raidz $VDEV0 $VDEV3 $VDEV2" \ + "$VDEV0 $VDEV1 $VDEV2" + +set_zfs_txg_timeout $ZFS_TXG_TIMEOUT + +log_pass "zpool import rewind after device replacement passed." diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg index 08cb5f63e8..193c32c8ce 100644 --- a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.cfg @@ -25,7 +25,7 @@ # # -# Copyright (c) 2012, 2015 by Delphix. All rights reserved. +# Copyright (c) 2012, 2016 by Delphix. All rights reserved. # . $STF_SUITE/include/libtest.shlib @@ -64,11 +64,17 @@ export SLICE_SIZE="$((MINVDEVSIZE / (1024 * 1024)))m" export MAX_NUM=5 export GROUP_NUM=3 export DEVICE_DIR=/dev_import-test -export BACKUP_DEVICE_DIR=/bakdev_import-test +export BACKUP_DEVICE_DIR=$DEVICE_DIR/backup export DEVICE_FILE=disk export DEVICE_ARCHIVE=archive_import-test export MYTESTFILE=$STF_SUITE/include/libtest.shlib +export CPATH=/var/tmp/cachefile.$$ +export CPATHBKP=/var/tmp/cachefile.$$.bkp +export CPATHBKP2=/var/tmp/cachefile.$$.bkp2 +export MD5FILE=/var/tmp/md5sums.$$ +export MD5FILE2=/var/tmp/md5sums.$$.2 + typeset -i num=0 while (( num < $GROUP_NUM )); do DEVICE_FILES="$DEVICE_FILES ${DEVICE_DIR}/${DEVICE_FILE}$num" diff --git a/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.kshlib b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.kshlib new file mode 100644 index 0000000000..04ce5f858d --- /dev/null +++ b/usr/src/test/zfs-tests/tests/functional/cli_root/zpool_import/zpool_import.kshlib @@ -0,0 +1,367 @@ +#!/usr/bin/ksh + +# +# This file and its contents are supplied under the terms of the +# Common Development and Distribution License ("CDDL"), version 1.0. +# You may only use this file in accordance with the terms of version +# 1.0 of the CDDL. +# +# A full copy of the text of the CDDL should have accompanied this +# source. A copy of the CDDL is also available via the Internet at +# http://www.illumos.org/license/CDDL. +# + +# +# Copyright (c) 2016 by Delphix. All rights reserved. +# + +. $STF_SUITE/include/libtest.shlib +. $STF_SUITE/tests/functional/cli_root/zpool_import/zpool_import.cfg + +# +# Prototype cleanup function for zpool_import tests. +# +function cleanup +{ + destroy_pool $TESTPOOL1 + + log_must rm -f $CPATH $CPATHBKP $CPATHBKP2 $MD5FILE $MD5FILE2 + + log_must rm -rf $DEVICE_DIR/* + typeset i=0 + while (( i < $MAX_NUM )); do + log_must mkfile $FILE_SIZE ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +# +# Write a bit of data and sync several times. +# This function is intended to be used by zpool rewind tests. +# +function sync_some_data_a_few_times +{ + typeset pool=$1 + typeset -i a_few_times=${2:-10} + + typeset file="/$pool/tmpfile" + for i in {0..$a_few_times}; do + dd if=/dev/urandom of=${file}_$i bs=128k count=10 + sync + done + + return 0 +} + +# +# Just write a moderate amount of data to the pool. +# +function write_some_data +{ + typeset pool=$1 + typeset files10mb=${2:-10} + + typeset ds="$pool/fillerds" + zfs create $ds + [[ $? -ne 0 ]] && return 1 + + # Create 100 MB of data + typeset file="/$ds/fillerfile" + for i in {1..$files10mb}; do + dd if=/dev/urandom of=$file.$i bs=128k count=80 + [[ $? -ne 0 ]] && return 1 + done + + return 0 +} + +# +# Create/overwrite a few datasets with files. +# Apply md5sum on all the files and store checksums in a file. +# +# newdata: overwrite existing files if false. +# md5file: file where to store md5sums +# datasetname: base name for datasets +# +function _generate_data_common +{ + typeset pool=$1 + typeset newdata=$2 + typeset md5file=$3 + typeset datasetname=$4 + + typeset -i datasets=3 + typeset -i files=5 + typeset -i blocks=10 + + [[ -n $md5file ]] && rm -f $md5file + for i in {1..$datasets}; do + ( $newdata ) && log_must zfs create "$pool/$datasetname$i" + for j in {1..$files}; do + typeset file="/$pool/$datasetname$i/file$j" + dd if=/dev/urandom of=$file bs=128k count=$blocks > /dev/null + [[ -n $md5file ]] && md5sum $file >> $md5file + done + ( $newdata ) && sync + done + + return 0 +} + +function generate_data +{ + typeset pool=$1 + typeset md5file="$2" + typeset datasetname=${3:-ds} + + _generate_data_common $pool true "$md5file" $datasetname +} + +function overwrite_data +{ + typeset pool=$1 + typeset md5file="$2" + typeset datasetname=${3:-ds} + + _generate_data_common $1 false "$md5file" $datasetname +} + +# +# Verify md5sums of every file in md5sum file $1. +# +function verify_data_md5sums +{ + typeset md5file=$1 + + if [[ ! -f $md5file ]]; then + log_note "md5 sums file '$md5file' doesn't exist" + return 1 + fi + + md5sum -c --quiet $md5file + return $? +} + +# +# Set devices size in DEVICE_DIR to $1. +# +function increase_device_sizes +{ + typeset newfilesize=$1 + + typeset -i i=0 + while (( i < $MAX_NUM )); do + log_must mkfile $newfilesize ${DEVICE_DIR}/${DEVICE_FILE}$i + ((i += 1)) + done +} + +# +# Translate vdev names returned by zpool status into more generic names. +# +# eg: mirror-2 --> mirror +# +function _translate_vdev +{ + typeset vdev=$1 + + typeset keywords="mirror replacing raidz1 raidz2 raidz3 indirect" + for word in $keywords; do + echo $vdev | egrep "^${word}-[0-9]+\$" > /dev/null + if [[ $? -eq 0 ]]; then + vdev=$word + break + fi + done + + [[ $vdev == "logs" ]] && echo "log" && return 0 + [[ $vdev == "raidz1" ]] && echo "raidz" && return 0 + + echo $vdev + return 0 +} + +# +# Check that pool configuration returned by zpool status matches expected +# configuration. Format for the check string is same as the vdev arguments for +# creating a pool +# Add -q for quiet mode. +# +# eg: check_pool_config pool1 "mirror c0t0d0s0 c0t1d0s0 log c1t1d0s0" +# +function check_pool_config +{ + typeset logfailure=true + if [[ $1 == '-q' ]]; then + logfailure=false + shift + fi + + typeset poolname=$1 + typeset expected=$2 + + typeset status + status=$(zpool status $poolname 2>&1) + if [[ $? -ne 0 ]]; then + if ( $logfailure ); then + log_note "zpool status $poolname failed: $status" + fi + return 1 + fi + + typeset actual="" + typeset began=false + printf "$status\n" | while read line; do + typeset vdev=$(echo "$line" | awk '{printf $1}') + if ( ! $began ) && [[ $vdev == NAME ]]; then + began=true + continue + fi + ( $began ) && [[ -z $vdev ]] && break; + + if ( $began ); then + [[ -z $actual ]] && actual="$vdev" && continue + vdev=$(_translate_vdev $vdev) + actual="$actual $vdev" + fi + done + + expected="$poolname $expected" + + if [[ "$actual" != "$expected" ]]; then + if ( $logfailure ); then + log_note "expected pool vdevs:" + log_note "> '$expected'" + log_note "actual pool vdevs:" + log_note "> '$actual'" + fi + return 1 + fi + + return 0 +} + +# +# Check that pool configuration returned by zpool status matches expected +# configuration within a given timeout in seconds. See check_pool_config(). +# +# eg: wait_for_pool_config pool1 "mirror c0t0d0s0 c0t1d0s0" 60 +# +function wait_for_pool_config +{ + typeset poolname=$1 + typeset expectedconfig="$2" + typeset -i timeout=${3:-60} + + timeout=$(( $timeout + $(date +%s) )) + + while (( $(date +%s) < $timeout )); do + check_pool_config -q $poolname "$expectedconfig" + [[ $? -eq 0 ]] && return 0 + sleep 3 + done + + check_pool_config $poolname "$expectedconfig" + return $? +} + +# +# Check that pool status is ONLINE +# +function check_pool_healthy +{ + typeset pool=$1 + + typeset status + status=$(zpool status $pool 2>&1) + if [[ $? -ne 0 ]]; then + log_note "zpool status $pool failed: $status" + return 1 + fi + + status=$(echo "$status" | grep "$pool" | grep -v "pool:" | \ + awk '{print $2}') + + if [[ $status != "ONLINE" ]]; then + log_note "Invalid zpool status for '$pool': '$status'" \ + "!= 'ONLINE'" + return 1 + fi + + return 0 +} + +# +# Return 0 if a device is currently being replaced in the pool. +# +function pool_is_replacing +{ + typeset pool=$1 + + zpool status $pool | grep "replacing" | grep "ONLINE" > /dev/null + + return $? +} + +function set_vdev_validate_skip +{ + mdb_set_uint32 "vdev_validate_skip" "$1" +} + +function get_zfs_txg_timeout +{ + echo $(mdb_get_uint32 "zfs_txg_timeout") +} + +function set_zfs_txg_timeout +{ + mdb_set_uint32 "zfs_txg_timeout" "$1" +} + +function set_spa_load_verify_metadata +{ + mdb_set_uint32 "spa_load_verify_metadata" "$1" +} + +function set_spa_load_verify_data +{ + mdb_set_uint32 "spa_load_verify_data" "$1" +} + +function set_zfs_max_missing_tvds +{ + mdb_set_uint32 "zfs_max_missing_tvds" "$1" +} + +# +# Use mdb to find the last txg that was synced in an active pool. +# +function get_last_txg_synced +{ + typeset pool=$1 + + typeset spas + spas=$(mdb -k -e "::spa") + [[ $? -ne 0 ]] && return 1 + + typeset spa="" + print "$spas\n" | while read line; do + typeset poolname=$(echo "$line" | awk '{print $3}') + typeset addr=$(echo "$line" | awk '{print $1}') + if [[ $poolname == $pool ]]; then + spa=$addr + break + fi + done + if [[ -z $spa ]]; then + log_fail "Couldn't find pool '$pool'" + return 1 + fi + typeset mdbcmd="$spa::print spa_t spa_ubsync.ub_txg | ::eval '.=E'" + typeset -i txg + txg=$(mdb -k -e "$mdbcmd") + [[ $? -ne 0 ]] && return 1 + + echo $txg + return 0 +} diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib b/usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib index a82d3b3d59..8f1f30ed26 100644 --- a/usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib +++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend.kshlib @@ -512,11 +512,13 @@ function test_fs_setup { typeset sendfs=$1 typeset recvfs=$2 + typeset streamfs=$3 typeset sendpool=${sendfs%%/*} typeset recvpool=${recvfs%%/*} datasetexists $sendfs && log_must zfs destroy -r $sendpool datasetexists $recvfs && log_must zfs destroy -r $recvpool + datasetexists $streamfs && log_must zfs destroy -r $streamfs if $(datasetexists $sendfs || zfs create -o compress=lz4 $sendfs); then mk_files 1000 256 0 $sendfs & @@ -545,10 +547,7 @@ function test_fs_setup ">/$sendpool/incremental.zsend" fi - if datasetexists $streamfs; then - log_must zfs destroy -r $streamfs - fi - log_must zfs create -o compress=lz4 $sendpool/stream + log_must zfs create -o compress=lz4 $streamfs } # @@ -661,9 +660,10 @@ function resume_cleanup { typeset sendfs=$1 typeset streamfs=$2 + typeset sendpool=${sendfs%%/*} datasetexists $sendfs && log_must zfs destroy -r $sendfs datasetexists $streamfs && log_must zfs destroy -r $streamfs cleanup_pool $POOL2 - rm -f /$POOL/initial.zsend /$POOL/incremental.zsend + rm -f /$sendpool/initial.zsend /$sendpool/incremental.zsend } diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_019_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_019_pos.ksh index 79c9bb6d9b..3cd1a8eece 100644 --- a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_019_pos.ksh +++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_019_pos.ksh @@ -43,8 +43,8 @@ sendfs=$POOL/sendfs recvfs=$POOL3/recvfs streamfs=$POOL2/stream -for sendfs in $POOL2/sendfs $POOL2; do - test_fs_setup $sendfs $recvfs +for sendfs in $POOL2/sendfs $POOL3; do + test_fs_setup $sendfs $recvfs $streamfs resume_test "zfs send -v $sendfs@a" $streamfs $recvfs resume_test "zfs send -v -i @a $sendfs@b" $streamfs $recvfs file_check $sendfs $recvfs diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_020_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_020_pos.ksh index 97c19f505a..958131e6d9 100644 --- a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_020_pos.ksh +++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_020_pos.ksh @@ -42,7 +42,7 @@ streamfs=$POOL/stream log_onexit resume_cleanup $sendfs $streamfs -test_fs_setup $sendfs $recvfs +test_fs_setup $sendfs $recvfs $streamfs resume_test "zfs send -D -v $sendfs@a" $streamfs $recvfs file_check $sendfs $recvfs diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_021_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_021_pos.ksh index 2d2a3304da..39121b12ec 100644 --- a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_021_pos.ksh +++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_021_pos.ksh @@ -44,7 +44,7 @@ streamfs=$POOL/stream log_onexit resume_cleanup $sendfs $streamfs -test_fs_setup $sendfs $recvfs +test_fs_setup $sendfs $recvfs $streamfs resume_test "zfs send -v -e $sendfs@a" $streamfs $recvfs resume_test "zfs send -v -e -i @a $sendfs@b" $streamfs $recvfs file_check $sendfs $recvfs diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_022_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_022_pos.ksh index 9592cb9a79..57eb594051 100644 --- a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_022_pos.ksh +++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_022_pos.ksh @@ -47,7 +47,7 @@ streamfs=$POOL/stream log_onexit resume_cleanup $sendfs $streamfs -test_fs_setup $sendfs $recvfs +test_fs_setup $sendfs $recvfs $streamfs log_must zfs bookmark $sendfs@a $sendfs#bm_a log_must zfs destroy $sendfs@a log_must zfs receive -v $recvfs </$POOL/initial.zsend diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_024_pos.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_024_pos.ksh index d5d938e4b7..fc586cf8ee 100644 --- a/usr/src/test/zfs-tests/tests/functional/rsend/rsend_024_pos.ksh +++ b/usr/src/test/zfs-tests/tests/functional/rsend/rsend_024_pos.ksh @@ -44,7 +44,7 @@ streamfs=$POOL/stream log_onexit resume_cleanup $sendfs $streamfs -test_fs_setup $sendfs $recvfs +test_fs_setup $sendfs $recvfs $streamfs log_must zfs unmount $sendfs resume_test "zfs send $sendfs" $streamfs $recvfs file_check $sendfs $recvfs diff --git a/usr/src/test/zfs-tests/tests/functional/rsend/send-c_resume.ksh b/usr/src/test/zfs-tests/tests/functional/rsend/send-c_resume.ksh index 8b36177647..d5873788d9 100644 --- a/usr/src/test/zfs-tests/tests/functional/rsend/send-c_resume.ksh +++ b/usr/src/test/zfs-tests/tests/functional/rsend/send-c_resume.ksh @@ -41,7 +41,7 @@ streamfs=$POOL/stream log_assert "Verify compressed send streams can be resumed if interrupted" log_onexit resume_cleanup $sendfs $streamfs -test_fs_setup $sendfs $recvfs +test_fs_setup $sendfs $recvfs $streamfs resume_test "zfs send -c -v $sendfs@a" $streamfs $recvfs resume_test "zfs send -c -v -i @a $sendfs@b" $streamfs $recvfs file_check $sendfs $recvfs diff --git a/usr/src/uts/common/Makefile.files b/usr/src/uts/common/Makefile.files index e40df9d33b..8007406655 100644 --- a/usr/src/uts/common/Makefile.files +++ b/usr/src/uts/common/Makefile.files @@ -1494,7 +1494,8 @@ ZFS_COMMON_OBJS += \ zio_compress.o \ zio_inject.o \ zle.o \ - zrlock.o + zrlock.o \ + zthr.o ZFS_SHARED_OBJS += \ zfeature_common.o \ diff --git a/usr/src/uts/common/fs/hsfs/hsfs_vfsops.c b/usr/src/uts/common/fs/hsfs/hsfs_vfsops.c index dbe9aa4c07..523964f4ee 100644 --- a/usr/src/uts/common/fs/hsfs/hsfs_vfsops.c +++ b/usr/src/uts/common/fs/hsfs/hsfs_vfsops.c @@ -22,6 +22,7 @@ * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Bayard G. Bell. All rights reserved. * Copyright 2013 Joyent, Inc. All rights reserved. + * Copyright (c) 2017 by Delphix. All rights reserved. */ /* @@ -150,7 +151,7 @@ static vfsdef_t vfw = { "hsfs", hsfsinit, /* We don't suppport remounting */ - VSW_HASPROTO|VSW_STATS|VSW_CANLOFI, + VSW_HASPROTO|VSW_STATS|VSW_CANLOFI|VSW_MOUNTDEV, &hsfs_proto_opttbl }; diff --git a/usr/src/uts/common/fs/pcfs/pc_vfsops.c b/usr/src/uts/common/fs/pcfs/pc_vfsops.c index b85c6abf43..53c49de28c 100644 --- a/usr/src/uts/common/fs/pcfs/pc_vfsops.c +++ b/usr/src/uts/common/fs/pcfs/pc_vfsops.c @@ -23,6 +23,9 @@ * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ +/* + * Copyright (c) 2017 by Delphix. All rights reserved. + */ #include <sys/param.h> #include <sys/systm.h> @@ -156,7 +159,7 @@ static vfsdef_t vfw = { VFSDEF_VERSION, "pcfs", pcfsinit, - VSW_HASPROTO|VSW_CANREMOUNT|VSW_STATS|VSW_CANLOFI, + VSW_HASPROTO|VSW_CANREMOUNT|VSW_STATS|VSW_CANLOFI|VSW_MOUNTDEV, &pcfs_mntopts }; diff --git a/usr/src/uts/common/fs/udfs/udf_vfsops.c b/usr/src/uts/common/fs/udfs/udf_vfsops.c index 479898fe9c..ebb1d7d813 100644 --- a/usr/src/uts/common/fs/udfs/udf_vfsops.c +++ b/usr/src/uts/common/fs/udfs/udf_vfsops.c @@ -22,6 +22,7 @@ * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * Copyright (c) 2011 Bayard G. Bell. All rights reserved. + * Copyright (c) 2017 by Delphix. All rights reserved. */ #include <sys/types.h> @@ -121,7 +122,7 @@ static vfsdef_t vfw = { VFSDEF_VERSION, "udfs", udfinit, - VSW_HASPROTO|VSW_CANREMOUNT|VSW_STATS|VSW_CANLOFI, + VSW_HASPROTO|VSW_CANREMOUNT|VSW_STATS|VSW_CANLOFI|VSW_MOUNTDEV, &udfs_mntopts }; @@ -177,7 +178,7 @@ _NOTE(SCHEME_PROTECTS_DATA("safe sharing", rootvp)) #endif static int32_t udf_mount(struct vfs *vfsp, struct vnode *mvp, - struct mounta *uap, struct cred *cr) + struct mounta *uap, struct cred *cr) { dev_t dev; struct vnode *lvp = NULL; @@ -489,8 +490,7 @@ udf_sync(struct vfs *vfsp, int16_t flag, struct cred *cr) /* ARGSUSED */ static int32_t -udf_vget(struct vfs *vfsp, - struct vnode **vpp, struct fid *fidp) +udf_vget(struct vfs *vfsp, struct vnode **vpp, struct fid *fidp) { int32_t error = 0; struct udf_fid *udfid; @@ -612,9 +612,8 @@ udf_mountroot(struct vfs *vfsp, enum whymountroot why) static int32_t -ud_mountfs(struct vfs *vfsp, - enum whymountroot why, dev_t dev, char *name, - struct cred *cr, int32_t isroot) +ud_mountfs(struct vfs *vfsp, enum whymountroot why, dev_t dev, char *name, + struct cred *cr, int32_t isroot) { struct vnode *devvp = NULL; int32_t error = 0; @@ -1554,7 +1553,7 @@ ud_destroy_fsp(struct udf_vfs *udf_vfsp) void ud_convert_to_superblock(struct udf_vfs *udf_vfsp, - struct log_vol_int_desc *lvid) + struct log_vol_int_desc *lvid) { int32_t i, c; uint32_t *temp; @@ -1652,7 +1651,7 @@ int32_t ud_sub_count = 4; */ static int32_t ud_val_get_vat(struct udf_vfs *udf_vfsp, dev_t dev, - daddr_t blkno, struct ud_map *udm) + daddr_t blkno, struct ud_map *udm) { struct buf *secbp; struct file_entry *fe; @@ -1776,7 +1775,7 @@ end: int32_t ud_read_sparing_tbls(struct udf_vfs *udf_vfsp, - dev_t dev, struct ud_map *map, struct pmap_typ2 *typ2) + dev_t dev, struct ud_map *map, struct pmap_typ2 *typ2) { int32_t index, valid = 0; uint32_t sz; diff --git a/usr/src/uts/common/fs/ufs/ufs_vfsops.c b/usr/src/uts/common/fs/ufs/ufs_vfsops.c index 002d821ec2..afd43e7e63 100644 --- a/usr/src/uts/common/fs/ufs/ufs_vfsops.c +++ b/usr/src/uts/common/fs/ufs/ufs_vfsops.c @@ -23,6 +23,7 @@ * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * Copyright 2016 Nexenta Systems, Inc. + * Copyright (c) 2017 by Delphix. All rights reserved. */ /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ @@ -196,7 +197,7 @@ static vfsdef_t vfw = { VFSDEF_VERSION, "ufs", ufsinit, - VSW_HASPROTO|VSW_CANREMOUNT|VSW_STATS|VSW_CANLOFI, + VSW_HASPROTO|VSW_CANREMOUNT|VSW_STATS|VSW_CANLOFI|VSW_MOUNTDEV, &ufs_mntopts }; @@ -258,8 +259,7 @@ static int mountfs(struct vfs *, enum whymountroot, struct vnode *, char *, static int ufs_mount(struct vfs *vfsp, struct vnode *mvp, struct mounta *uap, - struct cred *cr) - + struct cred *cr) { char *data = uap->dataptr; int datalen = uap->datalen; @@ -796,7 +796,7 @@ int ufs_mount_timeout = 60000; /* default to 1 minute */ static int mountfs(struct vfs *vfsp, enum whymountroot why, struct vnode *devvp, - char *path, cred_t *cr, int isroot, void *raw_argsp, int args_len) + char *path, cred_t *cr, int isroot, void *raw_argsp, int args_len) { dev_t dev = devvp->v_rdev; struct fs *fsp; diff --git a/usr/src/uts/common/fs/vfs.c b/usr/src/uts/common/fs/vfs.c index 61f43e6b00..5a88c3e69d 100644 --- a/usr/src/uts/common/fs/vfs.c +++ b/usr/src/uts/common/fs/vfs.c @@ -23,7 +23,7 @@ * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2016 Joyent, Inc. * Copyright 2016 Toomas Soome <tsoome@me.com> - * Copyright (c) 2016 by Delphix. All rights reserved. + * Copyright (c) 2016, 2017 by Delphix. All rights reserved. * Copyright 2016 Nexenta Systems, Inc. * Copyright 2017 RackTop Systems. */ @@ -1293,7 +1293,8 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp, * successful for later cleanup and addition to * the mount in progress table. */ - if ((uap->flags & MS_GLOBAL) == 0 && + if ((vswp->vsw_flag & VSW_MOUNTDEV) && + (uap->flags & MS_GLOBAL) == 0 && lookupname(uap->spec, fromspace, FOLLOW, NULL, &bvp) == 0) { addmip = 1; @@ -1509,7 +1510,8 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp, * wlock above. This case is for a non-spliced, non-global filesystem. */ if (!addmip) { - if ((uap->flags & MS_GLOBAL) == 0 && + if ((vswp->vsw_flag & VSW_MOUNTDEV) && + (uap->flags & MS_GLOBAL) == 0 && lookupname(uap->spec, fromspace, FOLLOW, NULL, &bvp) == 0) { addmip = 1; } diff --git a/usr/src/uts/common/fs/zfs/spa.c b/usr/src/uts/common/fs/zfs/spa.c index 56d316a16d..a772c24e65 100644 --- a/usr/src/uts/common/fs/zfs/spa.c +++ b/usr/src/uts/common/fs/zfs/spa.c @@ -151,9 +151,8 @@ const zio_taskq_info_t zio_taskqs[ZIO_TYPES][ZIO_TASKQ_TYPES] = { static void spa_sync_version(void *arg, dmu_tx_t *tx); static void spa_sync_props(void *arg, dmu_tx_t *tx); static boolean_t spa_has_active_shared_spare(spa_t *spa); -static int spa_load_impl(spa_t *spa, uint64_t, nvlist_t *config, - spa_load_state_t state, spa_import_type_t type, boolean_t trust_config, - char **ereport); +static int spa_load_impl(spa_t *spa, spa_import_type_t type, char **ereport, + boolean_t reloading); static void spa_vdev_resilver_done(spa_t *spa); uint_t zio_taskq_batch_pct = 75; /* 1 thread per cpu in pset */ @@ -177,6 +176,54 @@ boolean_t spa_load_verify_dryrun = B_FALSE; #define TRYIMPORT_NAME "$import" /* + * For debugging purposes: print out vdev tree during pool import. + */ +boolean_t spa_load_print_vdev_tree = B_FALSE; + +/* + * A non-zero value for zfs_max_missing_tvds means that we allow importing + * pools with missing top-level vdevs. This is strictly intended for advanced + * pool recovery cases since missing data is almost inevitable. Pools with + * missing devices can only be imported read-only for safety reasons, and their + * fail-mode will be automatically set to "continue". + * + * With 1 missing vdev we should be able to import the pool and mount all + * datasets. User data that was not modified after the missing device has been + * added should be recoverable. This means that snapshots created prior to the + * addition of that device should be completely intact. + * + * With 2 missing vdevs, some datasets may fail to mount since there are + * dataset statistics that are stored as regular metadata. Some data might be + * recoverable if those vdevs were added recently. + * + * With 3 or more missing vdevs, the pool is severely damaged and MOS entries + * may be missing entirely. Chances of data recovery are very low. Note that + * there are also risks of performing an inadvertent rewind as we might be + * missing all the vdevs with the latest uberblocks. + */ +uint64_t zfs_max_missing_tvds = 0; + +/* + * The parameters below are similar to zfs_max_missing_tvds but are only + * intended for a preliminary open of the pool with an untrusted config which + * might be incomplete or out-dated. + * + * We are more tolerant for pools opened from a cachefile since we could have + * an out-dated cachefile where a device removal was not registered. + * We could have set the limit arbitrarily high but in the case where devices + * are really missing we would want to return the proper error codes; we chose + * SPA_DVAS_PER_BP - 1 so that some copies of the MOS would still be available + * and we get a chance to retrieve the trusted config. + */ +uint64_t zfs_max_missing_tvds_cachefile = SPA_DVAS_PER_BP - 1; +/* + * In the case where config was assembled by scanning device paths (/dev/dsks + * by default) we are less tolerant since all the existing devices should have + * been detected and we want spa_load to return the right error codes. + */ +uint64_t zfs_max_missing_tvds_scan = 0; + +/* * ========================================================================== * SPA properties routines * ========================================================================== @@ -1291,6 +1338,12 @@ spa_unload(spa_t *spa) spa->spa_vdev_removal = NULL; } + if (spa->spa_condense_zthr != NULL) { + ASSERT(!zthr_isrunning(spa->spa_condense_zthr)); + zthr_destroy(spa->spa_condense_zthr); + spa->spa_condense_zthr = NULL; + } + spa_condense_fini(spa); bpobj_close(&spa->spa_deferred_bpobj); @@ -1633,13 +1686,34 @@ load_nvlist(spa_t *spa, uint64_t obj, nvlist_t **value) } /* + * Concrete top-level vdevs that are not missing and are not logs. At every + * spa_sync we write new uberblocks to at least SPA_SYNC_MIN_VDEVS core tvds. + */ +static uint64_t +spa_healthy_core_tvds(spa_t *spa) +{ + vdev_t *rvd = spa->spa_root_vdev; + uint64_t tvds = 0; + + for (uint64_t i = 0; i < rvd->vdev_children; i++) { + vdev_t *vd = rvd->vdev_child[i]; + if (vd->vdev_islog) + continue; + if (vdev_is_concrete(vd) && !vdev_is_dead(vd)) + tvds++; + } + + return (tvds); +} + +/* * Checks to see if the given vdev could not be opened, in which case we post a * sysevent to notify the autoreplace code that the device has been removed. */ static void spa_check_removed(vdev_t *vd) { - for (int c = 0; c < vd->vdev_children; c++) + for (uint64_t c = 0; c < vd->vdev_children; c++) spa_check_removed(vd->vdev_child[c]); if (vd->vdev_ops->vdev_op_leaf && vdev_is_dead(vd) && @@ -1649,38 +1723,14 @@ spa_check_removed(vdev_t *vd) } } -static void -spa_config_valid_zaps(vdev_t *vd, vdev_t *mvd) -{ - ASSERT3U(vd->vdev_children, ==, mvd->vdev_children); - - vd->vdev_top_zap = mvd->vdev_top_zap; - vd->vdev_leaf_zap = mvd->vdev_leaf_zap; - - for (uint64_t i = 0; i < vd->vdev_children; i++) { - spa_config_valid_zaps(vd->vdev_child[i], mvd->vdev_child[i]); - } -} - -/* - * Validate the current config against the MOS config - */ -static boolean_t -spa_config_valid(spa_t *spa, nvlist_t *config) +static int +spa_check_for_missing_logs(spa_t *spa) { - vdev_t *mrvd, *rvd = spa->spa_root_vdev; - nvlist_t *nv; - - VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nv) == 0); - - spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); - VERIFY(spa_config_parse(spa, &mrvd, nv, NULL, 0, VDEV_ALLOC_LOAD) == 0); - - ASSERT3U(rvd->vdev_children, ==, mrvd->vdev_children); + vdev_t *rvd = spa->spa_root_vdev; /* * If we're doing a normal import, then build up any additional - * diagnostic information about missing devices in this config. + * diagnostic information about missing log devices. * We'll pass this up to the user for further processing. */ if (!(spa->spa_import_flags & ZFS_IMPORT_MISSING_LOG)) { @@ -1691,109 +1741,52 @@ spa_config_valid(spa_t *spa, nvlist_t *config) KM_SLEEP); VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) == 0); - for (int c = 0; c < rvd->vdev_children; c++) { + for (uint64_t c = 0; c < rvd->vdev_children; c++) { vdev_t *tvd = rvd->vdev_child[c]; - vdev_t *mtvd = mrvd->vdev_child[c]; - if (tvd->vdev_ops == &vdev_missing_ops && - mtvd->vdev_ops != &vdev_missing_ops && - mtvd->vdev_islog) - child[idx++] = vdev_config_generate(spa, mtvd, - B_FALSE, 0); + /* + * We consider a device as missing only if it failed + * to open (i.e. offline or faulted is not considered + * as missing). + */ + if (tvd->vdev_islog && + tvd->vdev_state == VDEV_STATE_CANT_OPEN) { + child[idx++] = vdev_config_generate(spa, tvd, + B_FALSE, VDEV_CONFIG_MISSING); + } } - if (idx) { - VERIFY(nvlist_add_nvlist_array(nv, - ZPOOL_CONFIG_CHILDREN, child, idx) == 0); - VERIFY(nvlist_add_nvlist(spa->spa_load_info, - ZPOOL_CONFIG_MISSING_DEVICES, nv) == 0); + if (idx > 0) { + fnvlist_add_nvlist_array(nv, + ZPOOL_CONFIG_CHILDREN, child, idx); + fnvlist_add_nvlist(spa->spa_load_info, + ZPOOL_CONFIG_MISSING_DEVICES, nv); - for (int i = 0; i < idx; i++) + for (uint64_t i = 0; i < idx; i++) nvlist_free(child[i]); } nvlist_free(nv); kmem_free(child, rvd->vdev_children * sizeof (char **)); - } - - /* - * Compare the root vdev tree with the information we have - * from the MOS config (mrvd). Check each top-level vdev - * with the corresponding MOS config top-level (mtvd). - */ - for (int c = 0; c < rvd->vdev_children; c++) { - vdev_t *tvd = rvd->vdev_child[c]; - vdev_t *mtvd = mrvd->vdev_child[c]; - - /* - * Resolve any "missing" vdevs in the current configuration. - * Also trust the MOS config about any "indirect" vdevs. - * If we find that the MOS config has more accurate information - * about the top-level vdev then use that vdev instead. - */ - if ((tvd->vdev_ops == &vdev_missing_ops && - mtvd->vdev_ops != &vdev_missing_ops) || - (mtvd->vdev_ops == &vdev_indirect_ops && - tvd->vdev_ops != &vdev_indirect_ops)) { - /* - * Device specific actions. - */ - if (mtvd->vdev_islog) { - if (!(spa->spa_import_flags & - ZFS_IMPORT_MISSING_LOG)) { - continue; - } + if (idx > 0) { + spa_load_failed(spa, "some log devices are missing"); + return (SET_ERROR(ENXIO)); + } + } else { + for (uint64_t c = 0; c < rvd->vdev_children; c++) { + vdev_t *tvd = rvd->vdev_child[c]; + if (tvd->vdev_islog && + tvd->vdev_state == VDEV_STATE_CANT_OPEN) { spa_set_log_state(spa, SPA_LOG_CLEAR); - } else if (mtvd->vdev_ops != &vdev_indirect_ops) { - continue; - } - - /* - * Swap the missing vdev with the data we were - * able to obtain from the MOS config. - */ - vdev_remove_child(rvd, tvd); - vdev_remove_child(mrvd, mtvd); - - vdev_add_child(rvd, mtvd); - vdev_add_child(mrvd, tvd); - - vdev_reopen(rvd); - } else { - if (mtvd->vdev_islog) { - /* - * Load the slog device's state from the MOS - * config since it's possible that the label - * does not contain the most up-to-date - * information. - */ - vdev_load_log_state(tvd, mtvd); - vdev_reopen(tvd); + spa_load_note(spa, "some log devices are " + "missing, ZIL is dropped."); + break; } - - /* - * Per-vdev ZAP info is stored exclusively in the MOS. - */ - spa_config_valid_zaps(tvd, mtvd); } - - /* - * Never trust this info from userland; always use what's - * in the MOS. This prevents it from getting out of sync - * with the rest of the info in the MOS. - */ - tvd->vdev_removing = mtvd->vdev_removing; - tvd->vdev_indirect_config = mtvd->vdev_indirect_config; } - vdev_free(mrvd); - spa_config_exit(spa, SCL_ALL, FTAG); - - /* - * Ensure we were able to validate the config. - */ - return (rvd->vdev_guid_sum == spa->spa_uberblock.ub_guid_sum); + return (0); } /* @@ -2092,6 +2085,16 @@ spa_vdev_err(vdev_t *vdev, vdev_aux_t aux, int err) return (SET_ERROR(err)); } +static void +spa_spawn_aux_threads(spa_t *spa) +{ + ASSERT(spa_writeable(spa)); + + ASSERT(MUTEX_HELD(&spa_namespace_lock)); + + spa_start_indirect_condensing_thread(spa); +} + /* * Fix up config after a partly-completed split. This is done with the * ZPOOL_CONFIG_SPLIT nvlist. Both the splitting pool and the split-off @@ -2175,53 +2178,15 @@ spa_try_repair(spa_t *spa, nvlist_t *config) } static int -spa_load(spa_t *spa, spa_load_state_t state, spa_import_type_t type, - boolean_t trust_config) +spa_load(spa_t *spa, spa_load_state_t state, spa_import_type_t type) { - nvlist_t *config = spa->spa_config; char *ereport = FM_EREPORT_ZFS_POOL; - char *comment; int error; - uint64_t pool_guid; - nvlist_t *nvl; - - if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &pool_guid)) - return (SET_ERROR(EINVAL)); - - ASSERT(spa->spa_comment == NULL); - if (nvlist_lookup_string(config, ZPOOL_CONFIG_COMMENT, &comment) == 0) - spa->spa_comment = spa_strdup(comment); - - /* - * Versioning wasn't explicitly added to the label until later, so if - * it's not present treat it as the initial version. - */ - if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, - &spa->spa_ubsync.ub_version) != 0) - spa->spa_ubsync.ub_version = SPA_VERSION_INITIAL; - - (void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG, - &spa->spa_config_txg); - if ((state == SPA_LOAD_IMPORT || state == SPA_LOAD_TRYIMPORT) && - spa_guid_exists(pool_guid, 0)) { - error = SET_ERROR(EEXIST); - } else { - spa->spa_config_guid = pool_guid; - - if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_SPLIT, - &nvl) == 0) { - VERIFY(nvlist_dup(nvl, &spa->spa_config_splitting, - KM_SLEEP) == 0); - } - - nvlist_free(spa->spa_load_info); - spa->spa_load_info = fnvlist_alloc(); + spa->spa_load_state = state; - gethrestime(&spa->spa_loaded_ts); - error = spa_load_impl(spa, pool_guid, config, state, type, - trust_config, &ereport); - } + gethrestime(&spa->spa_loaded_ts); + error = spa_load_impl(spa, type, &ereport, B_FALSE); /* * Don't count references from objsets that are already closed @@ -2273,13 +2238,80 @@ vdev_count_verify_zaps(vdev_t *vd) } static int -spa_ld_parse_config(spa_t *spa, uint64_t pool_guid, nvlist_t *config, - spa_import_type_t type) +spa_verify_host(spa_t *spa, nvlist_t *mos_config) +{ + uint64_t hostid; + char *hostname; + uint64_t myhostid = 0; + + if (!spa_is_root(spa) && nvlist_lookup_uint64(mos_config, + ZPOOL_CONFIG_HOSTID, &hostid) == 0) { + hostname = fnvlist_lookup_string(mos_config, + ZPOOL_CONFIG_HOSTNAME); + + myhostid = zone_get_hostid(NULL); + + if (hostid != 0 && myhostid != 0 && hostid != myhostid) { + cmn_err(CE_WARN, "pool '%s' could not be " + "loaded as it was last accessed by " + "another system (host: %s hostid: 0x%llx). " + "See: http://illumos.org/msg/ZFS-8000-EY", + spa_name(spa), hostname, (u_longlong_t)hostid); + spa_load_failed(spa, "hostid verification failed: pool " + "last accessed by host: %s (hostid: 0x%llx)", + hostname, (u_longlong_t)hostid); + return (SET_ERROR(EBADF)); + } + } + + return (0); +} + +static int +spa_ld_parse_config(spa_t *spa, spa_import_type_t type) { int error = 0; - nvlist_t *nvtree = NULL; + nvlist_t *nvtree, *nvl, *config = spa->spa_config; int parse; vdev_t *rvd; + uint64_t pool_guid; + char *comment; + + /* + * Versioning wasn't explicitly added to the label until later, so if + * it's not present treat it as the initial version. + */ + if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, + &spa->spa_ubsync.ub_version) != 0) + spa->spa_ubsync.ub_version = SPA_VERSION_INITIAL; + + if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &pool_guid)) { + spa_load_failed(spa, "invalid config provided: '%s' missing", + ZPOOL_CONFIG_POOL_GUID); + return (SET_ERROR(EINVAL)); + } + + if ((spa->spa_load_state == SPA_LOAD_IMPORT || spa->spa_load_state == + SPA_LOAD_TRYIMPORT) && spa_guid_exists(pool_guid, 0)) { + spa_load_failed(spa, "a pool with guid %llu is already open", + (u_longlong_t)pool_guid); + return (SET_ERROR(EEXIST)); + } + + spa->spa_config_guid = pool_guid; + + nvlist_free(spa->spa_load_info); + spa->spa_load_info = fnvlist_alloc(); + + ASSERT(spa->spa_comment == NULL); + if (nvlist_lookup_string(config, ZPOOL_CONFIG_COMMENT, &comment) == 0) + spa->spa_comment = spa_strdup(comment); + + (void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG, + &spa->spa_config_txg); + + if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_SPLIT, &nvl) == 0) + spa->spa_config_splitting = fnvlist_dup(nvl); if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvtree)) { spa_load_failed(spa, "invalid config provided: '%s' missing", @@ -2287,9 +2319,6 @@ spa_ld_parse_config(spa_t *spa, uint64_t pool_guid, nvlist_t *config, return (SET_ERROR(EINVAL)); } - parse = (type == SPA_IMPORT_EXISTING ? - VDEV_ALLOC_LOAD : VDEV_ALLOC_SPLIT); - /* * Create "The Godfather" zio to hold all async IOs */ @@ -2307,6 +2336,8 @@ spa_ld_parse_config(spa_t *spa, uint64_t pool_guid, nvlist_t *config, * configuration requires knowing the version number. */ spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); + parse = (type == SPA_IMPORT_EXISTING ? + VDEV_ALLOC_LOAD : VDEV_ALLOC_SPLIT); error = spa_config_parse(spa, &rvd, nvtree, NULL, 0, parse); spa_config_exit(spa, SCL_ALL, FTAG); @@ -2327,71 +2358,105 @@ spa_ld_parse_config(spa_t *spa, uint64_t pool_guid, nvlist_t *config, return (0); } +/* + * Recursively open all vdevs in the vdev tree. This function is called twice: + * first with the untrusted config, then with the trusted config. + */ static int spa_ld_open_vdevs(spa_t *spa) { int error = 0; + /* + * spa_missing_tvds_allowed defines how many top-level vdevs can be + * missing/unopenable for the root vdev to be still considered openable. + */ + if (spa->spa_trust_config) { + spa->spa_missing_tvds_allowed = zfs_max_missing_tvds; + } else if (spa->spa_config_source == SPA_CONFIG_SRC_CACHEFILE) { + spa->spa_missing_tvds_allowed = zfs_max_missing_tvds_cachefile; + } else if (spa->spa_config_source == SPA_CONFIG_SRC_SCAN) { + spa->spa_missing_tvds_allowed = zfs_max_missing_tvds_scan; + } else { + spa->spa_missing_tvds_allowed = 0; + } + + spa->spa_missing_tvds_allowed = + MAX(zfs_max_missing_tvds, spa->spa_missing_tvds_allowed); + spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); error = vdev_open(spa->spa_root_vdev); spa_config_exit(spa, SCL_ALL, FTAG); + + if (spa->spa_missing_tvds != 0) { + spa_load_note(spa, "vdev tree has %lld missing top-level " + "vdevs.", (u_longlong_t)spa->spa_missing_tvds); + if (spa->spa_trust_config && (spa->spa_mode & FWRITE)) { + /* + * Although theoretically we could allow users to open + * incomplete pools in RW mode, we'd need to add a lot + * of extra logic (e.g. adjust pool space to account + * for missing vdevs). + * This limitation also prevents users from accidentally + * opening the pool in RW mode during data recovery and + * damaging it further. + */ + spa_load_note(spa, "pools with missing top-level " + "vdevs can only be opened in read-only mode."); + error = SET_ERROR(ENXIO); + } else { + spa_load_note(spa, "current settings allow for maximum " + "%lld missing top-level vdevs at this stage.", + (u_longlong_t)spa->spa_missing_tvds_allowed); + } + } if (error != 0) { spa_load_failed(spa, "unable to open vdev tree [error=%d]", error); } + if (spa->spa_missing_tvds != 0 || error != 0) + vdev_dbgmsg_print_tree(spa->spa_root_vdev, 2); return (error); } +/* + * We need to validate the vdev labels against the configuration that + * we have in hand. This function is called twice: first with an untrusted + * config, then with a trusted config. The validation is more strict when the + * config is trusted. + */ static int -spa_ld_validate_vdevs(spa_t *spa, spa_import_type_t type, - boolean_t trust_config) +spa_ld_validate_vdevs(spa_t *spa) { int error = 0; vdev_t *rvd = spa->spa_root_vdev; - /* - * We need to validate the vdev labels against the configuration that - * we have in hand, which is dependent on the setting of trust_config. - * If trust_config is true then we're validating the vdev labels based - * on that config. Otherwise, we're validating against the cached - * config (zpool.cache) that was read when we loaded the zfs module, and - * then later we will recursively call spa_load() and validate against - * the vdev config. - * - * If we're assembling a new pool that's been split off from an - * existing pool, the labels haven't yet been updated so we skip - * validation for now. - */ - if (type != SPA_IMPORT_ASSEMBLE) { - spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); - error = vdev_validate(rvd, trust_config); - spa_config_exit(spa, SCL_ALL, FTAG); + spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); + error = vdev_validate(rvd); + spa_config_exit(spa, SCL_ALL, FTAG); - if (error != 0) { - spa_load_failed(spa, "vdev_validate failed [error=%d]", - error); - return (error); - } + if (error != 0) { + spa_load_failed(spa, "vdev_validate failed [error=%d]", error); + return (error); + } - if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) { - spa_load_failed(spa, "cannot open vdev tree after " - "invalidating some vdevs"); - return (SET_ERROR(ENXIO)); - } + if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) { + spa_load_failed(spa, "cannot open vdev tree after invalidating " + "some vdevs"); + vdev_dbgmsg_print_tree(rvd, 2); + return (SET_ERROR(ENXIO)); } return (0); } static int -spa_ld_select_uberblock(spa_t *spa, nvlist_t *config, spa_import_type_t type, - boolean_t trust_config) +spa_ld_select_uberblock(spa_t *spa, spa_import_type_t type) { vdev_t *rvd = spa->spa_root_vdev; nvlist_t *label; uberblock_t *ub = &spa->spa_uberblock; - uint64_t children; /* * Find the best uberblock. @@ -2484,26 +2549,9 @@ spa_ld_select_uberblock(spa_t *spa, nvlist_t *config, spa_import_type_t type, nvlist_free(unsup_feat); } - /* - * If the vdev guid sum doesn't match the uberblock, we have an - * incomplete configuration. We first check to see if the pool - * is aware of the complete config (i.e ZPOOL_CONFIG_VDEV_CHILDREN). - * If it is, defer the vdev_guid_sum check till later so we - * can handle missing vdevs. - */ - if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VDEV_CHILDREN, - &children) != 0 && trust_config && type != SPA_IMPORT_ASSEMBLE && - rvd->vdev_guid_sum != ub->ub_guid_sum) { - spa_load_failed(spa, "guid sum in config doesn't match guid " - "sum in uberblock (%llu != %llu)", - (u_longlong_t)rvd->vdev_guid_sum, - (u_longlong_t)ub->ub_guid_sum); - return (spa_vdev_err(rvd, VDEV_AUX_BAD_GUID_SUM, ENXIO)); - } - if (type != SPA_IMPORT_ASSEMBLE && spa->spa_config_splitting) { spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); - spa_try_repair(spa, config); + spa_try_repair(spa, spa->spa_config); spa_config_exit(spa, SCL_ALL, FTAG); nvlist_free(spa->spa_config_splitting); spa->spa_config_splitting = NULL; @@ -2542,49 +2590,167 @@ spa_ld_open_rootbp(spa_t *spa) } static int -spa_ld_validate_config(spa_t *spa, spa_import_type_t type) +spa_ld_load_trusted_config(spa_t *spa, spa_import_type_t type, + boolean_t reloading) { - vdev_t *rvd = spa->spa_root_vdev; + vdev_t *mrvd, *rvd = spa->spa_root_vdev; + nvlist_t *nv, *mos_config, *policy; + int error = 0, copy_error; + uint64_t healthy_tvds, healthy_tvds_mos; + uint64_t mos_config_txg; if (spa_dir_prop(spa, DMU_POOL_CONFIG, &spa->spa_config_object, B_TRUE) != 0) return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); /* - * Validate the config, using the MOS config to fill in any - * information which might be missing. If we fail to validate - * the config then declare the pool unfit for use. If we're - * assembling a pool from a split, the log is not transferred - * over. + * If we're assembling a pool from a split, the config provided is + * already trusted so there is nothing to do. */ - if (type != SPA_IMPORT_ASSEMBLE) { - nvlist_t *mos_config; - if (load_nvlist(spa, spa->spa_config_object, &mos_config) - != 0) { - spa_load_failed(spa, "unable to retrieve MOS config"); - return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); - } + if (type == SPA_IMPORT_ASSEMBLE) + return (0); + + healthy_tvds = spa_healthy_core_tvds(spa); + + if (load_nvlist(spa, spa->spa_config_object, &mos_config) + != 0) { + spa_load_failed(spa, "unable to retrieve MOS config"); + return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); + } - if (!spa_config_valid(spa, mos_config)) { + /* + * If we are doing an open, pool owner wasn't verified yet, thus do + * the verification here. + */ + if (spa->spa_load_state == SPA_LOAD_OPEN) { + error = spa_verify_host(spa, mos_config); + if (error != 0) { nvlist_free(mos_config); - spa_load_failed(spa, "mismatch between config provided " - "and config stored in MOS"); - return (spa_vdev_err(rvd, VDEV_AUX_BAD_GUID_SUM, - ENXIO)); + return (error); } - nvlist_free(mos_config); + } + + nv = fnvlist_lookup_nvlist(mos_config, ZPOOL_CONFIG_VDEV_TREE); + + spa_config_enter(spa, SCL_ALL, FTAG, RW_WRITER); + /* + * Build a new vdev tree from the trusted config + */ + VERIFY(spa_config_parse(spa, &mrvd, nv, NULL, 0, VDEV_ALLOC_LOAD) == 0); + + /* + * Vdev paths in the MOS may be obsolete. If the untrusted config was + * obtained by scanning /dev/dsk, then it will have the right vdev + * paths. We update the trusted MOS config with this information. + * We first try to copy the paths with vdev_copy_path_strict, which + * succeeds only when both configs have exactly the same vdev tree. + * If that fails, we fall back to a more flexible method that has a + * best effort policy. + */ + copy_error = vdev_copy_path_strict(rvd, mrvd); + if (copy_error != 0 || spa_load_print_vdev_tree) { + spa_load_note(spa, "provided vdev tree:"); + vdev_dbgmsg_print_tree(rvd, 2); + spa_load_note(spa, "MOS vdev tree:"); + vdev_dbgmsg_print_tree(mrvd, 2); + } + if (copy_error != 0) { + spa_load_note(spa, "vdev_copy_path_strict failed, falling " + "back to vdev_copy_path_relaxed"); + vdev_copy_path_relaxed(rvd, mrvd); + } + + vdev_close(rvd); + vdev_free(rvd); + spa->spa_root_vdev = mrvd; + rvd = mrvd; + spa_config_exit(spa, SCL_ALL, FTAG); + + /* + * We will use spa_config if we decide to reload the spa or if spa_load + * fails and we rewind. We must thus regenerate the config using the + * MOS information with the updated paths. Rewind policy is an import + * setting and is not in the MOS. We copy it over to our new, trusted + * config. + */ + mos_config_txg = fnvlist_lookup_uint64(mos_config, + ZPOOL_CONFIG_POOL_TXG); + nvlist_free(mos_config); + mos_config = spa_config_generate(spa, NULL, mos_config_txg, B_FALSE); + if (nvlist_lookup_nvlist(spa->spa_config, ZPOOL_REWIND_POLICY, + &policy) == 0) + fnvlist_add_nvlist(mos_config, ZPOOL_REWIND_POLICY, policy); + spa_config_set(spa, mos_config); + spa->spa_config_source = SPA_CONFIG_SRC_MOS; + + /* + * Now that we got the config from the MOS, we should be more strict + * in checking blkptrs and can make assumptions about the consistency + * of the vdev tree. spa_trust_config must be set to true before opening + * vdevs in order for them to be writeable. + */ + spa->spa_trust_config = B_TRUE; + + /* + * Open and validate the new vdev tree + */ + error = spa_ld_open_vdevs(spa); + if (error != 0) + return (error); + + error = spa_ld_validate_vdevs(spa); + if (error != 0) + return (error); + + if (copy_error != 0 || spa_load_print_vdev_tree) { + spa_load_note(spa, "final vdev tree:"); + vdev_dbgmsg_print_tree(rvd, 2); + } + + if (spa->spa_load_state != SPA_LOAD_TRYIMPORT && + !spa->spa_extreme_rewind && zfs_max_missing_tvds == 0) { /* - * Now that we've validated the config, check the state of the - * root vdev. If it can't be opened, it indicates one or - * more toplevel vdevs are faulted. + * Sanity check to make sure that we are indeed loading the + * latest uberblock. If we missed SPA_SYNC_MIN_VDEVS tvds + * in the config provided and they happened to be the only ones + * to have the latest uberblock, we could involuntarily perform + * an extreme rewind. */ - if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) { - spa_load_failed(spa, "some top vdevs are unavailable"); - return (SET_ERROR(ENXIO)); + healthy_tvds_mos = spa_healthy_core_tvds(spa); + if (healthy_tvds_mos - healthy_tvds >= + SPA_SYNC_MIN_VDEVS) { + spa_load_note(spa, "config provided misses too many " + "top-level vdevs compared to MOS (%lld vs %lld). ", + (u_longlong_t)healthy_tvds, + (u_longlong_t)healthy_tvds_mos); + spa_load_note(spa, "vdev tree:"); + vdev_dbgmsg_print_tree(rvd, 2); + if (reloading) { + spa_load_failed(spa, "config was already " + "provided from MOS. Aborting."); + return (spa_vdev_err(rvd, + VDEV_AUX_CORRUPT_DATA, EIO)); + } + spa_load_note(spa, "spa must be reloaded using MOS " + "config"); + return (SET_ERROR(EAGAIN)); } } + error = spa_check_for_missing_logs(spa); + if (error != 0) + return (spa_vdev_err(rvd, VDEV_AUX_BAD_GUID_SUM, ENXIO)); + + if (rvd->vdev_guid_sum != spa->spa_uberblock.ub_guid_sum) { + spa_load_failed(spa, "uberblock guid sum doesn't match MOS " + "guid sum (%llu != %llu)", + (u_longlong_t)spa->spa_uberblock.ub_guid_sum, + (u_longlong_t)rvd->vdev_guid_sum); + return (spa_vdev_err(rvd, VDEV_AUX_BAD_GUID_SUM, + ENXIO)); + } + return (0); } @@ -2751,62 +2917,6 @@ spa_ld_load_special_directories(spa_t *spa) } static int -spa_ld_prepare_for_reload(spa_t *spa, int orig_mode) -{ - vdev_t *rvd = spa->spa_root_vdev; - - uint64_t hostid; - nvlist_t *policy = NULL; - nvlist_t *mos_config; - - if (load_nvlist(spa, spa->spa_config_object, &mos_config) != 0) { - spa_load_failed(spa, "unable to retrieve MOS config"); - return (spa_vdev_err(rvd, VDEV_AUX_CORRUPT_DATA, EIO)); - } - - if (!spa_is_root(spa) && nvlist_lookup_uint64(mos_config, - ZPOOL_CONFIG_HOSTID, &hostid) == 0) { - char *hostname; - unsigned long myhostid = 0; - - VERIFY(nvlist_lookup_string(mos_config, - ZPOOL_CONFIG_HOSTNAME, &hostname) == 0); - -#ifdef _KERNEL - myhostid = zone_get_hostid(NULL); -#else /* _KERNEL */ - /* - * We're emulating the system's hostid in userland, so - * we can't use zone_get_hostid(). - */ - (void) ddi_strtoul(hw_serial, NULL, 10, &myhostid); -#endif /* _KERNEL */ - if (hostid != 0 && myhostid != 0 && - hostid != myhostid) { - nvlist_free(mos_config); - cmn_err(CE_WARN, "pool '%s' could not be " - "loaded as it was last accessed by " - "another system (host: %s hostid: 0x%lx). " - "See: http://illumos.org/msg/ZFS-8000-EY", - spa_name(spa), hostname, - (unsigned long)hostid); - return (SET_ERROR(EBADF)); - } - } - if (nvlist_lookup_nvlist(spa->spa_config, - ZPOOL_REWIND_POLICY, &policy) == 0) - VERIFY(nvlist_add_nvlist(mos_config, - ZPOOL_REWIND_POLICY, policy) == 0); - - spa_config_set(spa, mos_config); - spa_unload(spa); - spa_deactivate(spa); - spa_activate(spa, orig_mode); - - return (0); -} - -static int spa_ld_get_props(spa_t *spa) { int error = 0; @@ -2933,6 +3043,19 @@ spa_ld_get_props(spa_t *spa) spa->spa_autoreplace = (autoreplace != 0); } + /* + * If we are importing a pool with missing top-level vdevs, + * we enforce that the pool doesn't panic or get suspended on + * error since the likelihood of missing data is extremely high. + */ + if (spa->spa_missing_tvds > 0 && + spa->spa_failmode != ZIO_FAILURE_MODE_CONTINUE && + spa->spa_load_state != SPA_LOAD_TRYIMPORT) { + spa_load_note(spa, "forcing failmode to 'continue' " + "as some top level vdevs are missing"); + spa->spa_failmode = ZIO_FAILURE_MODE_CONTINUE; + } + return (0); } @@ -3063,9 +3186,15 @@ spa_ld_verify_logs(spa_t *spa, spa_import_type_t type, char **ereport) if (type != SPA_IMPORT_ASSEMBLE && spa_writeable(spa)) { boolean_t missing = spa_check_logs(spa); if (missing) { - *ereport = FM_EREPORT_ZFS_LOG_REPLAY; - spa_load_failed(spa, "spa_check_logs failed"); - return (spa_vdev_err(rvd, VDEV_AUX_BAD_LOG, ENXIO)); + if (spa->spa_missing_tvds != 0) { + spa_load_note(spa, "spa_check_logs failed " + "so dropping the logs"); + } else { + *ereport = FM_EREPORT_ZFS_LOG_REPLAY; + spa_load_failed(spa, "spa_check_logs failed"); + return (spa_vdev_err(rvd, VDEV_AUX_BAD_LOG, + ENXIO)); + } } } @@ -3121,7 +3250,8 @@ spa_ld_claim_log_blocks(spa_t *spa) } static void -spa_ld_check_for_config_update(spa_t *spa, uint64_t config_cache_txg) +spa_ld_check_for_config_update(spa_t *spa, uint64_t config_cache_txg, + boolean_t reloading) { vdev_t *rvd = spa->spa_root_vdev; int need_update = B_FALSE; @@ -3133,7 +3263,7 @@ spa_ld_check_for_config_update(spa_t *spa, uint64_t config_cache_txg) * If this is a verbatim import, trust the current * in-core spa_config and update the disk labels. */ - if (config_cache_txg != spa->spa_config_txg || + if (reloading || config_cache_txg != spa->spa_config_txg || spa->spa_load_state == SPA_LOAD_IMPORT || spa->spa_load_state == SPA_LOAD_RECOVER || (spa->spa_import_flags & ZFS_IMPORT_VERBATIM)) @@ -3151,6 +3281,24 @@ spa_ld_check_for_config_update(spa_t *spa, uint64_t config_cache_txg) spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE); } +static void +spa_ld_prepare_for_reload(spa_t *spa) +{ + int mode = spa->spa_mode; + int async_suspended = spa->spa_async_suspended; + + spa_unload(spa); + spa_deactivate(spa); + spa_activate(spa, mode); + + /* + * We save the value of spa_async_suspended as it gets reset to 0 by + * spa_unload(). We want to restore it back to the original value before + * returning as we might be calling spa_async_resume() later. + */ + spa->spa_async_suspended = async_suspended; +} + /* * Load an existing storage pool, using the config provided. This config * describes which vdevs are part of the pool and is later validated against @@ -3158,32 +3306,35 @@ spa_ld_check_for_config_update(spa_t *spa, uint64_t config_cache_txg) * config stored in the MOS. */ static int -spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, - spa_load_state_t state, spa_import_type_t type, boolean_t trust_config, - char **ereport) +spa_load_impl(spa_t *spa, spa_import_type_t type, char **ereport, + boolean_t reloading) { int error = 0; - uint64_t config_cache_txg = spa->spa_config_txg; - int orig_mode = spa->spa_mode; boolean_t missing_feat_write = B_FALSE; ASSERT(MUTEX_HELD(&spa_namespace_lock)); - - spa->spa_load_state = state; - spa_load_note(spa, "LOADING"); + ASSERT(spa->spa_config_source != SPA_CONFIG_SRC_NONE); /* - * If this is an untrusted config, first access the pool in read-only - * mode. We will then retrieve a trusted copy of the config from the MOS - * and use it to reopen the pool in read-write mode. + * Never trust the config that is provided unless we are assembling + * a pool following a split. + * This means don't trust blkptrs and the vdev tree in general. This + * also effectively puts the spa in read-only mode since + * spa_writeable() checks for spa_trust_config to be true. + * We will later load a trusted config from the MOS. */ - if (!trust_config) - spa->spa_mode = FREAD; + if (type != SPA_IMPORT_ASSEMBLE) + spa->spa_trust_config = B_FALSE; + + if (reloading) + spa_load_note(spa, "RELOADING"); + else + spa_load_note(spa, "LOADING"); /* * Parse the config provided to create a vdev tree. */ - error = spa_ld_parse_config(spa, pool_guid, config, type); + error = spa_ld_parse_config(spa, type); if (error != 0) return (error); @@ -3201,10 +3352,15 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, /* * Read the label of each vdev and make sure that the GUIDs stored * there match the GUIDs in the config provided. + * If we're assembling a new pool that's been split off from an + * existing pool, the labels haven't yet been updated so we skip + * validation for now. */ - error = spa_ld_validate_vdevs(spa, type, trust_config); - if (error != 0) - return (error); + if (type != SPA_IMPORT_ASSEMBLE) { + error = spa_ld_validate_vdevs(spa); + if (error != 0) + return (error); + } /* * Read vdev labels to find the best uberblock (i.e. latest, unless @@ -3213,7 +3369,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, * label with the best uberblock and verify that our version of zfs * supports them all. */ - error = spa_ld_select_uberblock(spa, config, type, trust_config); + error = spa_ld_select_uberblock(spa, type); if (error != 0) return (error); @@ -3227,13 +3383,21 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, return (error); /* - * Retrieve the config stored in the MOS and use it to validate the - * config provided. Also extract some information from the MOS config - * to update our vdev tree. + * Retrieve the trusted config stored in the MOS and use it to create + * a new, exact version of the vdev tree, then reopen all vdevs. */ - error = spa_ld_validate_config(spa, type); - if (error != 0) + error = spa_ld_load_trusted_config(spa, type, reloading); + if (error == EAGAIN) { + VERIFY(!reloading); + /* + * Redo the loading process with the trusted config if it is + * too different from the untrusted config. + */ + spa_ld_prepare_for_reload(spa); + return (spa_load_impl(spa, type, ereport, B_TRUE)); + } else if (error != 0) { return (error); + } /* * Retrieve the mapping of indirect vdevs. Those vdevs were removed @@ -3264,19 +3428,6 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, return (error); /* - * If the config provided is not trusted, discard it and use the config - * from the MOS to reload the pool. - */ - if (!trust_config) { - error = spa_ld_prepare_for_reload(spa, orig_mode); - if (error != 0) - return (error); - - spa_load_note(spa, "RELOADING"); - return (spa_load(spa, state, SPA_IMPORT_EXISTING, B_TRUE)); - } - - /* * Retrieve pool properties from the MOS. */ error = spa_ld_get_props(spa); @@ -3312,7 +3463,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, return (error); if (missing_feat_write) { - ASSERT(state == SPA_LOAD_TRYIMPORT); + ASSERT(spa->spa_load_state == SPA_LOAD_TRYIMPORT); /* * At this point, we know that we can open the pool in @@ -3344,21 +3495,11 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, * pool. If we are importing the pool in read-write mode, a few * additional steps must be performed to finish the import. */ - if (spa_writeable(spa) && (state == SPA_LOAD_RECOVER || + if (spa_writeable(spa) && (spa->spa_load_state == SPA_LOAD_RECOVER || spa->spa_load_max_txg == UINT64_MAX)) { - ASSERT(state != SPA_LOAD_TRYIMPORT); + uint64_t config_cache_txg = spa->spa_config_txg; - /* - * We must check this before we start the sync thread, because - * we only want to start a condense thread for condense - * operations that were in progress when the pool was - * imported. Once we start syncing, spa_sync() could - * initiate a condense (and start a thread for it). In - * that case it would be wrong to start a second - * condense thread. - */ - boolean_t condense_in_progress = - (spa->spa_condensing_indirect != NULL); + ASSERT(spa->spa_load_state != SPA_LOAD_TRYIMPORT); /* * Traverse the ZIL and claim all blocks. @@ -3385,7 +3526,8 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, * next sync, we would update the config stored in vdev labels * and the cachefile (by default /etc/zfs/zpool.cache). */ - spa_ld_check_for_config_update(spa, config_cache_txg); + spa_ld_check_for_config_update(spa, config_cache_txg, + reloading); /* * Check all DTLs to see if anything needs resilvering. @@ -3411,15 +3553,9 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, */ dsl_pool_clean_tmp_userrefs(spa->spa_dsl_pool); - /* - * Note: unlike condensing, we don't need an analogous - * "removal_in_progress" dance because no other thread - * can start a removal while we hold the spa_namespace_lock. - */ spa_restart_removal(spa); - if (condense_in_progress) - spa_condense_indirect_restart(spa); + spa_spawn_aux_threads(spa); } spa_load_note(spa, "LOADED"); @@ -3428,7 +3564,7 @@ spa_load_impl(spa_t *spa, uint64_t pool_guid, nvlist_t *config, } static int -spa_load_retry(spa_t *spa, spa_load_state_t state, int trust_config) +spa_load_retry(spa_t *spa, spa_load_state_t state) { int mode = spa->spa_mode; @@ -3443,7 +3579,7 @@ spa_load_retry(spa_t *spa, spa_load_state_t state, int trust_config) spa_load_note(spa, "spa_load_retry: rewind, max txg: %llu", (u_longlong_t)spa->spa_load_max_txg); - return (spa_load(spa, state, SPA_IMPORT_EXISTING, trust_config)); + return (spa_load(spa, state, SPA_IMPORT_EXISTING)); } /* @@ -3454,8 +3590,8 @@ spa_load_retry(spa_t *spa, spa_load_state_t state, int trust_config) * spa_load(). */ static int -spa_load_best(spa_t *spa, spa_load_state_t state, int trust_config, - uint64_t max_request, int rewind_flags) +spa_load_best(spa_t *spa, spa_load_state_t state, uint64_t max_request, + int rewind_flags) { nvlist_t *loadinfo = NULL; nvlist_t *config = NULL; @@ -3472,8 +3608,7 @@ spa_load_best(spa_t *spa, spa_load_state_t state, int trust_config, spa->spa_extreme_rewind = B_TRUE; } - load_error = rewind_error = spa_load(spa, state, SPA_IMPORT_EXISTING, - trust_config); + load_error = rewind_error = spa_load(spa, state, SPA_IMPORT_EXISTING); if (load_error == 0) return (0); @@ -3514,7 +3649,7 @@ spa_load_best(spa_t *spa, spa_load_state_t state, int trust_config, spa->spa_uberblock.ub_txg <= spa->spa_load_max_txg) { if (spa->spa_load_max_txg < safe_rewind_txg) spa->spa_extreme_rewind = B_TRUE; - rewind_error = spa_load_retry(spa, state, trust_config); + rewind_error = spa_load_retry(spa, state); } spa->spa_extreme_rewind = B_FALSE; @@ -3593,9 +3728,10 @@ spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t *nvpolicy, if (state != SPA_LOAD_RECOVER) spa->spa_last_ubsync_txg = spa->spa_load_txg = 0; + spa->spa_config_source = SPA_CONFIG_SRC_CACHEFILE; zfs_dbgmsg("spa_open_common: opening %s", pool); - error = spa_load_best(spa, state, B_FALSE, policy.zrp_txg, + error = spa_load_best(spa, state, policy.zrp_txg, policy.zrp_request); if (error == EBADF) { @@ -4328,6 +4464,8 @@ spa_create(const char *pool, nvlist_t *nvroot, nvlist_t *props, */ txg_wait_synced(spa->spa_dsl_pool, txg); + spa_spawn_aux_threads(spa); + spa_write_cachefile(spa, B_FALSE, B_TRUE); spa_event_notify(spa, NULL, NULL, ESC_ZFS_POOL_CREATE); @@ -4616,18 +4754,16 @@ spa_import(const char *pool, nvlist_t *config, nvlist_t *props, uint64_t flags) if (policy.zrp_request & ZPOOL_DO_REWIND) state = SPA_LOAD_RECOVER; - /* - * Pass off the heavy lifting to spa_load(). Pass TRUE for trust_config - * because the user-supplied config is actually the one to trust when - * doing an import. - */ - if (state != SPA_LOAD_RECOVER) - spa->spa_last_ubsync_txg = spa->spa_load_txg = 0; + spa->spa_config_source = SPA_CONFIG_SRC_TRYIMPORT; - zfs_dbgmsg("spa_import: importing %s%s", pool, - (state == SPA_LOAD_RECOVER) ? " (RECOVERY MODE)" : ""); - error = spa_load_best(spa, state, B_TRUE, policy.zrp_txg, - policy.zrp_request); + if (state != SPA_LOAD_RECOVER) { + spa->spa_last_ubsync_txg = spa->spa_load_txg = 0; + zfs_dbgmsg("spa_import: importing %s", pool); + } else { + zfs_dbgmsg("spa_import: importing %s, max_txg=%lld " + "(RECOVERY MODE)", pool, (longlong_t)policy.zrp_txg); + } + error = spa_load_best(spa, state, policy.zrp_txg, policy.zrp_request); /* * Propagate anything learned while loading the pool and pass it @@ -4745,10 +4881,11 @@ nvlist_t * spa_tryimport(nvlist_t *tryconfig) { nvlist_t *config = NULL; - char *poolname; + char *poolname, *cachefile; spa_t *spa; uint64_t state; int error; + zpool_rewind_policy_t policy; if (nvlist_lookup_string(tryconfig, ZPOOL_CONFIG_POOL_NAME, &poolname)) return (NULL); @@ -4763,14 +4900,30 @@ spa_tryimport(nvlist_t *tryconfig) spa = spa_add(TRYIMPORT_NAME, tryconfig, NULL); spa_activate(spa, FREAD); - zfs_dbgmsg("spa_tryimport: importing %s", poolname); - /* - * Pass off the heavy lifting to spa_load(). - * Pass TRUE for trust_config because the user-supplied config - * is actually the one to trust when doing an import. + * Rewind pool if a max txg was provided. Note that even though we + * retrieve the complete rewind policy, only the rewind txg is relevant + * for tryimport. */ - error = spa_load(spa, SPA_LOAD_TRYIMPORT, SPA_IMPORT_EXISTING, B_TRUE); + zpool_get_rewind_policy(spa->spa_config, &policy); + if (policy.zrp_txg != UINT64_MAX) { + spa->spa_load_max_txg = policy.zrp_txg; + spa->spa_extreme_rewind = B_TRUE; + zfs_dbgmsg("spa_tryimport: importing %s, max_txg=%lld", + poolname, (longlong_t)policy.zrp_txg); + } else { + zfs_dbgmsg("spa_tryimport: importing %s", poolname); + } + + if (nvlist_lookup_string(tryconfig, ZPOOL_CONFIG_CACHEFILE, &cachefile) + == 0) { + zfs_dbgmsg("spa_tryimport: using cachefile '%s'", cachefile); + spa->spa_config_source = SPA_CONFIG_SRC_CACHEFILE; + } else { + spa->spa_config_source = SPA_CONFIG_SRC_SCAN; + } + + error = spa_load(spa, SPA_LOAD_TRYIMPORT, SPA_IMPORT_EXISTING); /* * If 'tryconfig' was at least parsable, return the current config. @@ -5775,8 +5928,10 @@ spa_vdev_split_mirror(spa_t *spa, char *newname, nvlist_t *config, spa_activate(newspa, spa_mode_global); spa_async_suspend(newspa); + newspa->spa_config_source = SPA_CONFIG_SRC_SPLIT; + /* create the new pool from the disks of the original pool */ - error = spa_load(newspa, SPA_LOAD_IMPORT, SPA_IMPORT_ASSEMBLE, B_TRUE); + error = spa_load(newspa, SPA_LOAD_IMPORT, SPA_IMPORT_ASSEMBLE); if (error) goto out; @@ -6250,12 +6405,15 @@ spa_async_suspend(spa_t *spa) { mutex_enter(&spa->spa_async_lock); spa->spa_async_suspended++; - while (spa->spa_async_thread != NULL || - spa->spa_condense_thread != NULL) + while (spa->spa_async_thread != NULL) cv_wait(&spa->spa_async_cv, &spa->spa_async_lock); mutex_exit(&spa->spa_async_lock); spa_vdev_remove_suspend(spa); + + zthr_t *condense_thread = spa->spa_condense_zthr; + if (condense_thread != NULL && zthr_isrunning(condense_thread)) + VERIFY0(zthr_cancel(condense_thread)); } void @@ -6266,6 +6424,10 @@ spa_async_resume(spa_t *spa) spa->spa_async_suspended--; mutex_exit(&spa->spa_async_lock); spa_restart_removal(spa); + + zthr_t *condense_thread = spa->spa_condense_zthr; + if (condense_thread != NULL && !zthr_isrunning(condense_thread)) + zthr_resume(condense_thread); } static boolean_t @@ -7079,7 +7241,7 @@ spa_sync(spa_t *spa, uint64_t txg) spa_config_enter(spa, SCL_STATE, FTAG, RW_READER); if (list_is_empty(&spa->spa_config_dirty_list)) { - vdev_t *svd[SPA_DVAS_PER_BP]; + vdev_t *svd[SPA_SYNC_MIN_VDEVS]; int svdcount = 0; int children = rvd->vdev_children; int c0 = spa_get_random(children); @@ -7090,7 +7252,7 @@ spa_sync(spa_t *spa, uint64_t txg) !vdev_is_concrete(vd)) continue; svd[svdcount++] = vd; - if (svdcount == SPA_DVAS_PER_BP) + if (svdcount == SPA_SYNC_MIN_VDEVS) break; } error = vdev_config_sync(svd, svdcount, txg); diff --git a/usr/src/uts/common/fs/zfs/spa_config.c b/usr/src/uts/common/fs/zfs/spa_config.c index e118317adb..1fe675337f 100644 --- a/usr/src/uts/common/fs/zfs/spa_config.c +++ b/usr/src/uts/common/fs/zfs/spa_config.c @@ -339,7 +339,8 @@ void spa_config_set(spa_t *spa, nvlist_t *config) { mutex_enter(&spa->spa_props_lock); - nvlist_free(spa->spa_config); + if (spa->spa_config != NULL && spa->spa_config != config) + nvlist_free(spa->spa_config); spa->spa_config = config; mutex_exit(&spa->spa_props_lock); } @@ -386,15 +387,8 @@ spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats) spa->spa_comment); } -#ifdef _KERNEL hostid = zone_get_hostid(NULL); -#else /* _KERNEL */ - /* - * We're emulating the system's hostid in userland, so we can't use - * zone_get_hostid(). - */ - (void) ddi_strtoul(hw_serial, NULL, 10, &hostid); -#endif /* _KERNEL */ + if (hostid != 0) { fnvlist_add_uint64(config, ZPOOL_CONFIG_HOSTID, hostid); } diff --git a/usr/src/uts/common/fs/zfs/spa_misc.c b/usr/src/uts/common/fs/zfs/spa_misc.c index 33857db7ac..e79664dd33 100644 --- a/usr/src/uts/common/fs/zfs/spa_misc.c +++ b/usr/src/uts/common/fs/zfs/spa_misc.c @@ -365,7 +365,8 @@ spa_load_failed(spa_t *spa, const char *fmt, ...) (void) vsnprintf(buf, sizeof (buf), fmt, adx); va_end(adx); - zfs_dbgmsg("spa_load(%s): FAILED: %s", spa->spa_name, buf); + zfs_dbgmsg("spa_load(%s, config %s): FAILED: %s", spa->spa_name, + spa->spa_trust_config ? "trusted" : "untrusted", buf); } /*PRINTFLIKE2*/ @@ -379,7 +380,8 @@ spa_load_note(spa_t *spa, const char *fmt, ...) (void) vsnprintf(buf, sizeof (buf), fmt, adx); va_end(adx); - zfs_dbgmsg("spa_load(%s): %s", spa->spa_name, buf); + zfs_dbgmsg("spa_load(%s, config %s): %s", spa->spa_name, + spa->spa_trust_config ? "trusted" : "untrusted", buf); } /* @@ -620,6 +622,7 @@ spa_add(const char *name, nvlist_t *config, const char *altroot) spa->spa_load_max_txg = UINT64_MAX; spa->spa_proc = &p0; spa->spa_proc_state = SPA_PROC_NONE; + spa->spa_trust_config = B_TRUE; hdlr.cyh_func = spa_deadman; hdlr.cyh_arg = spa; @@ -2013,7 +2016,7 @@ spa_is_root(spa_t *spa) boolean_t spa_writeable(spa_t *spa) { - return (!!(spa->spa_mode & FWRITE)); + return (!!(spa->spa_mode & FWRITE) && spa->spa_trust_config); } /* @@ -2161,3 +2164,21 @@ spa_get_last_removal_txg(spa_t *spa) return (ret); } + +boolean_t +spa_trust_config(spa_t *spa) +{ + return (spa->spa_trust_config); +} + +uint64_t +spa_missing_tvds_allowed(spa_t *spa) +{ + return (spa->spa_missing_tvds_allowed); +} + +void +spa_set_missing_tvds(spa_t *spa, uint64_t missing) +{ + spa->spa_missing_tvds = missing; +} diff --git a/usr/src/uts/common/fs/zfs/sys/spa.h b/usr/src/uts/common/fs/zfs/sys/spa.h index aff251b80e..d6d48ddfbf 100644 --- a/usr/src/uts/common/fs/zfs/sys/spa.h +++ b/usr/src/uts/common/fs/zfs/sys/spa.h @@ -322,6 +322,7 @@ typedef enum bp_embedded_type { #define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */ #define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */ +#define SPA_SYNC_MIN_VDEVS 3 /* min vdevs to update during sync */ /* * A block is a hole when it has either 1) never been written to, or @@ -836,11 +837,16 @@ extern boolean_t spa_writeable(spa_t *spa); extern boolean_t spa_has_pending_synctask(spa_t *spa); extern int spa_maxblocksize(spa_t *spa); extern void zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp); +extern boolean_t zfs_dva_valid(spa_t *spa, const dva_t *dva, + const blkptr_t *bp); typedef void (*spa_remap_cb_t)(uint64_t vdev, uint64_t offset, uint64_t size, void *arg); extern boolean_t spa_remap_blkptr(spa_t *spa, blkptr_t *bp, spa_remap_cb_t callback, void *arg); extern uint64_t spa_get_last_removal_txg(spa_t *spa); +extern boolean_t spa_trust_config(spa_t *spa); +extern uint64_t spa_missing_tvds_allowed(spa_t *spa); +extern void spa_set_missing_tvds(spa_t *spa, uint64_t missing); extern int spa_mode(spa_t *spa); extern uint64_t zfs_strtonum(const char *str, char **nptr); diff --git a/usr/src/uts/common/fs/zfs/sys/spa_impl.h b/usr/src/uts/common/fs/zfs/sys/spa_impl.h index 955568c05b..1e440a6767 100644 --- a/usr/src/uts/common/fs/zfs/sys/spa_impl.h +++ b/usr/src/uts/common/fs/zfs/sys/spa_impl.h @@ -43,6 +43,7 @@ #include <sys/bplist.h> #include <sys/bpobj.h> #include <sys/zfeature.h> +#include <sys/zthr.h> #include <zfeature_common.h> #ifdef __cplusplus @@ -181,6 +182,15 @@ typedef enum spa_all_vdev_zap_action { AVZ_ACTION_INITIALIZE } spa_avz_action_t; +typedef enum spa_config_source { + SPA_CONFIG_SRC_NONE = 0, + SPA_CONFIG_SRC_SCAN, /* scan of path (default: /dev/dsk) */ + SPA_CONFIG_SRC_CACHEFILE, /* any cachefile */ + SPA_CONFIG_SRC_TRYIMPORT, /* returned from call to tryimport */ + SPA_CONFIG_SRC_SPLIT, /* new pool in a pool split */ + SPA_CONFIG_SRC_MOS /* MOS, but not always from right txg */ +} spa_config_source_t; + struct spa { /* * Fields protected by spa_namespace_lock. @@ -199,6 +209,8 @@ struct spa { uint8_t spa_sync_on; /* sync threads are running */ spa_load_state_t spa_load_state; /* current load operation */ boolean_t spa_indirect_vdevs_loaded; /* mappings loaded? */ + boolean_t spa_trust_config; /* do we trust vdev tree? */ + spa_config_source_t spa_config_source; /* where config comes from? */ uint64_t spa_import_flags; /* import specific flags */ spa_taskqs_t spa_zio_taskq[ZIO_TYPES][ZIO_TASKQ_TYPES]; dsl_pool_t *spa_dsl_pool; @@ -259,13 +271,15 @@ struct spa { int spa_async_suspended; /* async tasks suspended */ kcondvar_t spa_async_cv; /* wait for thread_exit() */ uint16_t spa_async_tasks; /* async task mask */ + uint64_t spa_missing_tvds; /* unopenable tvds on load */ + uint64_t spa_missing_tvds_allowed; /* allow loading spa? */ spa_removing_phys_t spa_removing_phys; spa_vdev_removal_t *spa_vdev_removal; spa_condensing_indirect_phys_t spa_condensing_indirect_phys; spa_condensing_indirect_t *spa_condensing_indirect; - kthread_t *spa_condense_thread; /* thread doing condense. */ + zthr_t *spa_condense_zthr; /* zthr doing condense. */ char *spa_root; /* alternate root directory */ uint64_t spa_ena; /* spa-wide ereport ENA */ diff --git a/usr/src/uts/common/fs/zfs/sys/vdev.h b/usr/src/uts/common/fs/zfs/sys/vdev.h index 1297590eb3..91d4db62f9 100644 --- a/usr/src/uts/common/fs/zfs/sys/vdev.h +++ b/usr/src/uts/common/fs/zfs/sys/vdev.h @@ -48,10 +48,13 @@ typedef enum vdev_dtl_type { extern boolean_t zfs_nocacheflush; extern void vdev_dbgmsg(vdev_t *vd, const char *fmt, ...); +extern void vdev_dbgmsg_print_tree(vdev_t *, int); extern int vdev_open(vdev_t *); extern void vdev_open_children(vdev_t *); extern boolean_t vdev_uses_zvols(vdev_t *); -extern int vdev_validate(vdev_t *, boolean_t); +extern int vdev_validate(vdev_t *); +extern int vdev_copy_path_strict(vdev_t *, vdev_t *); +extern void vdev_copy_path_relaxed(vdev_t *, vdev_t *); extern void vdev_close(vdev_t *); extern int vdev_create(vdev_t *, uint64_t txg, boolean_t isreplace); extern void vdev_reopen(vdev_t *); @@ -99,6 +102,7 @@ extern void vdev_scan_stat_init(vdev_t *vd); extern void vdev_propagate_state(vdev_t *vd); extern void vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux); +extern boolean_t vdev_children_are_offline(vdev_t *vd); extern void vdev_space_update(vdev_t *vd, int64_t alloc_delta, int64_t defer_delta, int64_t space_delta); @@ -140,7 +144,8 @@ typedef enum vdev_config_flag { VDEV_CONFIG_SPARE = 1 << 0, VDEV_CONFIG_L2CACHE = 1 << 1, VDEV_CONFIG_REMOVING = 1 << 2, - VDEV_CONFIG_MOS = 1 << 3 + VDEV_CONFIG_MOS = 1 << 3, + VDEV_CONFIG_MISSING = 1 << 4 } vdev_config_flag_t; extern void vdev_top_config_generate(spa_t *spa, nvlist_t *config); diff --git a/usr/src/uts/common/fs/zfs/sys/vdev_impl.h b/usr/src/uts/common/fs/zfs/sys/vdev_impl.h index 12d8df93af..5035e6ab9d 100644 --- a/usr/src/uts/common/fs/zfs/sys/vdev_impl.h +++ b/usr/src/uts/common/fs/zfs/sys/vdev_impl.h @@ -406,7 +406,6 @@ extern void vdev_remove_parent(vdev_t *cvd); /* * vdev sync load and sync */ -extern void vdev_load_log_state(vdev_t *nvd, vdev_t *ovd); extern boolean_t vdev_log_state_valid(vdev_t *vd); extern int vdev_load(vdev_t *vd); extern int vdev_dtl_load(vdev_t *vd); diff --git a/usr/src/uts/common/fs/zfs/sys/vdev_removal.h b/usr/src/uts/common/fs/zfs/sys/vdev_removal.h index 5b1e3056be..45cf4d8ec5 100644 --- a/usr/src/uts/common/fs/zfs/sys/vdev_removal.h +++ b/usr/src/uts/common/fs/zfs/sys/vdev_removal.h @@ -76,7 +76,7 @@ extern int spa_remove_init(spa_t *); extern void spa_restart_removal(spa_t *); extern int spa_condense_init(spa_t *); extern void spa_condense_fini(spa_t *); -extern void spa_condense_indirect_restart(spa_t *); +extern void spa_start_indirect_condensing_thread(spa_t *); extern void spa_vdev_condense_suspend(spa_t *); extern int spa_vdev_remove(spa_t *, uint64_t, boolean_t); extern void free_from_removing_vdev(vdev_t *, uint64_t, uint64_t, uint64_t); diff --git a/usr/src/uts/common/fs/zfs/sys/zio.h b/usr/src/uts/common/fs/zfs/sys/zio.h index 48121d4c50..828cc2a92b 100644 --- a/usr/src/uts/common/fs/zfs/sys/zio.h +++ b/usr/src/uts/common/fs/zfs/sys/zio.h @@ -208,6 +208,9 @@ enum zio_flag { (((zio)->io_flags & ZIO_FLAG_VDEV_INHERIT) | \ ZIO_FLAG_DONT_PROPAGATE | ZIO_FLAG_CANFAIL) +#define ZIO_CHILD_BIT(x) (1 << (x)) +#define ZIO_CHILD_BIT_IS_SET(val, x) ((val) & (1 << (x))) + enum zio_child { ZIO_CHILD_VDEV = 0, ZIO_CHILD_GANG, @@ -216,6 +219,14 @@ enum zio_child { ZIO_CHILD_TYPES }; +#define ZIO_CHILD_VDEV_BIT ZIO_CHILD_BIT(ZIO_CHILD_VDEV) +#define ZIO_CHILD_GANG_BIT ZIO_CHILD_BIT(ZIO_CHILD_GANG) +#define ZIO_CHILD_DDT_BIT ZIO_CHILD_BIT(ZIO_CHILD_DDT) +#define ZIO_CHILD_LOGICAL_BIT ZIO_CHILD_BIT(ZIO_CHILD_LOGICAL) +#define ZIO_CHILD_ALL_BITS \ + (ZIO_CHILD_VDEV_BIT | ZIO_CHILD_GANG_BIT | \ + ZIO_CHILD_DDT_BIT | ZIO_CHILD_LOGICAL_BIT) + enum zio_wait_type { ZIO_WAIT_READY = 0, ZIO_WAIT_DONE, diff --git a/usr/src/uts/common/fs/zfs/sys/zthr.h b/usr/src/uts/common/fs/zfs/sys/zthr.h new file mode 100644 index 0000000000..6bfb6b6c0d --- /dev/null +++ b/usr/src/uts/common/fs/zfs/sys/zthr.h @@ -0,0 +1,52 @@ +/* + * CDDL HEADER START + * + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + * + * CDDL HEADER END + */ + + +/* + * Copyright (c) 2017 by Delphix. All rights reserved. + */ + +#ifndef _SYS_ZTHR_H +#define _SYS_ZTHR_H + +typedef struct zthr zthr_t; +typedef int (zthr_func_t)(void *, zthr_t *); +typedef boolean_t (zthr_checkfunc_t)(void *, zthr_t *); + +struct zthr { + kthread_t *zthr_thread; + kmutex_t zthr_lock; + kcondvar_t zthr_cv; + boolean_t zthr_cancel; + + zthr_checkfunc_t *zthr_checkfunc; + zthr_func_t *zthr_func; + void *zthr_arg; + int zthr_rc; +}; + +extern zthr_t *zthr_create(zthr_checkfunc_t checkfunc, + zthr_func_t *func, void *arg); +extern void zthr_exit(zthr_t *t, int rc); +extern void zthr_destroy(zthr_t *t); + +extern void zthr_wakeup(zthr_t *t); +extern int zthr_cancel(zthr_t *t); +extern void zthr_resume(zthr_t *t); + +extern boolean_t zthr_iscancelled(zthr_t *t); +extern boolean_t zthr_isrunning(zthr_t *t); + +#endif /* _SYS_ZTHR_H */ diff --git a/usr/src/uts/common/fs/zfs/vdev.c b/usr/src/uts/common/fs/zfs/vdev.c index 656008bf9e..73306aec85 100644 --- a/usr/src/uts/common/fs/zfs/vdev.c +++ b/usr/src/uts/common/fs/zfs/vdev.c @@ -77,6 +77,8 @@ int zfs_scrub_limit = 10; */ int metaslabs_per_vdev = 200; +boolean_t vdev_validate_skip = B_FALSE; + /*PRINTFLIKE2*/ void vdev_dbgmsg(vdev_t *vd, const char *fmt, ...) @@ -99,6 +101,57 @@ vdev_dbgmsg(vdev_t *vd, const char *fmt, ...) } } +void +vdev_dbgmsg_print_tree(vdev_t *vd, int indent) +{ + char state[20]; + + if (vd->vdev_ishole || vd->vdev_ops == &vdev_missing_ops) { + zfs_dbgmsg("%*svdev %u: %s", indent, "", vd->vdev_id, + vd->vdev_ops->vdev_op_type); + return; + } + + switch (vd->vdev_state) { + case VDEV_STATE_UNKNOWN: + (void) snprintf(state, sizeof (state), "unknown"); + break; + case VDEV_STATE_CLOSED: + (void) snprintf(state, sizeof (state), "closed"); + break; + case VDEV_STATE_OFFLINE: + (void) snprintf(state, sizeof (state), "offline"); + break; + case VDEV_STATE_REMOVED: + (void) snprintf(state, sizeof (state), "removed"); + break; + case VDEV_STATE_CANT_OPEN: + (void) snprintf(state, sizeof (state), "can't open"); + break; + case VDEV_STATE_FAULTED: + (void) snprintf(state, sizeof (state), "faulted"); + break; + case VDEV_STATE_DEGRADED: + (void) snprintf(state, sizeof (state), "degraded"); + break; + case VDEV_STATE_HEALTHY: + (void) snprintf(state, sizeof (state), "healthy"); + break; + default: + (void) snprintf(state, sizeof (state), "<state %u>", + (uint_t)vd->vdev_state); + } + + zfs_dbgmsg("%*svdev %u: %s%s, guid: %llu, path: %s, %s", indent, + "", vd->vdev_id, vd->vdev_ops->vdev_op_type, + vd->vdev_islog ? " (log)" : "", + (u_longlong_t)vd->vdev_guid, + vd->vdev_path ? vd->vdev_path : "N/A", state); + + for (uint64_t i = 0; i < vd->vdev_children; i++) + vdev_dbgmsg_print_tree(vd->vdev_child[i], indent + 2); +} + /* * Given a vdev type, return the appropriate ops vector. */ @@ -1287,8 +1340,13 @@ vdev_open(vdev_t *vd) vd->vdev_stat.vs_aux != VDEV_AUX_OPEN_FAILED) vd->vdev_removed = B_FALSE; - vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, - vd->vdev_stat.vs_aux); + if (vd->vdev_stat.vs_aux == VDEV_AUX_CHILDREN_OFFLINE) { + vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, + vd->vdev_stat.vs_aux); + } else { + vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, + vd->vdev_stat.vs_aux); + } return (error); } @@ -1453,29 +1511,29 @@ vdev_open(vdev_t *vd) /* * Called once the vdevs are all opened, this routine validates the label - * contents. This needs to be done before vdev_load() so that we don't + * contents. This needs to be done before vdev_load() so that we don't * inadvertently do repair I/Os to the wrong device. * - * If 'strict' is false ignore the spa guid check. This is necessary because - * if the machine crashed during a re-guid the new guid might have been written - * to all of the vdev labels, but not the cached config. The strict check - * will be performed when the pool is opened again using the mos config. - * * This function will only return failure if one of the vdevs indicates that it * has since been destroyed or exported. This is only possible if * /etc/zfs/zpool.cache was readonly at the time. Otherwise, the vdev state * will be updated but the function will return 0. */ int -vdev_validate(vdev_t *vd, boolean_t strict) +vdev_validate(vdev_t *vd) { spa_t *spa = vd->vdev_spa; nvlist_t *label; - uint64_t guid = 0, top_guid; + uint64_t guid = 0, aux_guid = 0, top_guid; uint64_t state; + nvlist_t *nvl; + uint64_t txg; - for (int c = 0; c < vd->vdev_children; c++) - if (vdev_validate(vd->vdev_child[c], strict) != 0) + if (vdev_validate_skip) + return (0); + + for (uint64_t c = 0; c < vd->vdev_children; c++) + if (vdev_validate(vd->vdev_child[c]) != 0) return (SET_ERROR(EBADF)); /* @@ -1483,115 +1541,276 @@ vdev_validate(vdev_t *vd, boolean_t strict) * any further validation. Otherwise, label I/O will fail and we will * overwrite the previous state. */ - if (vd->vdev_ops->vdev_op_leaf && vdev_readable(vd)) { - uint64_t aux_guid = 0; - nvlist_t *nvl; - uint64_t txg = spa_last_synced_txg(spa) != 0 ? - spa_last_synced_txg(spa) : -1ULL; + if (!vd->vdev_ops->vdev_op_leaf || !vdev_readable(vd)) + return (0); - if ((label = vdev_label_read_config(vd, txg)) == NULL) { - vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, - VDEV_AUX_BAD_LABEL); - vdev_dbgmsg(vd, "vdev_validate: failed reading config"); - return (0); - } + /* + * If we are performing an extreme rewind, we allow for a label that + * was modified at a point after the current txg. + */ + if (spa->spa_extreme_rewind || spa_last_synced_txg(spa) == 0) + txg = UINT64_MAX; + else + txg = spa_last_synced_txg(spa); - /* - * Determine if this vdev has been split off into another - * pool. If so, then refuse to open it. - */ - if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_SPLIT_GUID, - &aux_guid) == 0 && aux_guid == spa_guid(spa)) { - vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, - VDEV_AUX_SPLIT_POOL); - nvlist_free(label); - vdev_dbgmsg(vd, "vdev_validate: vdev split into other " - "pool"); - return (0); - } + if ((label = vdev_label_read_config(vd, txg)) == NULL) { + vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_BAD_LABEL); + vdev_dbgmsg(vd, "vdev_validate: failed reading config"); + return (0); + } - if (strict && (nvlist_lookup_uint64(label, - ZPOOL_CONFIG_POOL_GUID, &guid) != 0 || - guid != spa_guid(spa))) { - vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, - VDEV_AUX_CORRUPT_DATA); - nvlist_free(label); - vdev_dbgmsg(vd, "vdev_validate: vdev label pool_guid " - "doesn't match config (%llu != %llu)", - (u_longlong_t)guid, - (u_longlong_t)spa_guid(spa)); - return (0); - } + /* + * Determine if this vdev has been split off into another + * pool. If so, then refuse to open it. + */ + if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_SPLIT_GUID, + &aux_guid) == 0 && aux_guid == spa_guid(spa)) { + vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_SPLIT_POOL); + nvlist_free(label); + vdev_dbgmsg(vd, "vdev_validate: vdev split into other pool"); + return (0); + } - if (nvlist_lookup_nvlist(label, ZPOOL_CONFIG_VDEV_TREE, &nvl) - != 0 || nvlist_lookup_uint64(nvl, ZPOOL_CONFIG_ORIG_GUID, - &aux_guid) != 0) - aux_guid = 0; + if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_GUID, &guid) != 0) { + vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_CORRUPT_DATA); + nvlist_free(label); + vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", + ZPOOL_CONFIG_POOL_GUID); + return (0); + } - /* - * If this vdev just became a top-level vdev because its - * sibling was detached, it will have adopted the parent's - * vdev guid -- but the label may or may not be on disk yet. - * Fortunately, either version of the label will have the - * same top guid, so if we're a top-level vdev, we can - * safely compare to that instead. - * - * If we split this vdev off instead, then we also check the - * original pool's guid. We don't want to consider the vdev - * corrupt if it is partway through a split operation. - */ - if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID, - &guid) != 0 || - nvlist_lookup_uint64(label, ZPOOL_CONFIG_TOP_GUID, - &top_guid) != 0 || - ((vd->vdev_guid != guid && vd->vdev_guid != aux_guid) && - (vd->vdev_guid != top_guid || vd != vd->vdev_top))) { - vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, - VDEV_AUX_CORRUPT_DATA); - nvlist_free(label); - vdev_dbgmsg(vd, "vdev_validate: config guid doesn't " - "match label guid (%llu != %llu)", - (u_longlong_t)vd->vdev_guid, (u_longlong_t)guid); - return (0); + /* + * If config is not trusted then ignore the spa guid check. This is + * necessary because if the machine crashed during a re-guid the new + * guid might have been written to all of the vdev labels, but not the + * cached config. The check will be performed again once we have the + * trusted config from the MOS. + */ + if (spa->spa_trust_config && guid != spa_guid(spa)) { + vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_CORRUPT_DATA); + nvlist_free(label); + vdev_dbgmsg(vd, "vdev_validate: vdev label pool_guid doesn't " + "match config (%llu != %llu)", (u_longlong_t)guid, + (u_longlong_t)spa_guid(spa)); + return (0); + } + + if (nvlist_lookup_nvlist(label, ZPOOL_CONFIG_VDEV_TREE, &nvl) + != 0 || nvlist_lookup_uint64(nvl, ZPOOL_CONFIG_ORIG_GUID, + &aux_guid) != 0) + aux_guid = 0; + + if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID, &guid) != 0) { + vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_CORRUPT_DATA); + nvlist_free(label); + vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", + ZPOOL_CONFIG_GUID); + return (0); + } + + if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_TOP_GUID, &top_guid) + != 0) { + vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_CORRUPT_DATA); + nvlist_free(label); + vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", + ZPOOL_CONFIG_TOP_GUID); + return (0); + } + + /* + * If this vdev just became a top-level vdev because its sibling was + * detached, it will have adopted the parent's vdev guid -- but the + * label may or may not be on disk yet. Fortunately, either version + * of the label will have the same top guid, so if we're a top-level + * vdev, we can safely compare to that instead. + * However, if the config comes from a cachefile that failed to update + * after the detach, a top-level vdev will appear as a non top-level + * vdev in the config. Also relax the constraints if we perform an + * extreme rewind. + * + * If we split this vdev off instead, then we also check the + * original pool's guid. We don't want to consider the vdev + * corrupt if it is partway through a split operation. + */ + if (vd->vdev_guid != guid && vd->vdev_guid != aux_guid) { + boolean_t mismatch = B_FALSE; + if (spa->spa_trust_config && !spa->spa_extreme_rewind) { + if (vd != vd->vdev_top || vd->vdev_guid != top_guid) + mismatch = B_TRUE; + } else { + if (vd->vdev_guid != top_guid && + vd->vdev_top->vdev_guid != guid) + mismatch = B_TRUE; } - if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE, - &state) != 0) { + if (mismatch) { vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, VDEV_AUX_CORRUPT_DATA); nvlist_free(label); - vdev_dbgmsg(vd, "vdev_validate: '%s' missing", - ZPOOL_CONFIG_POOL_STATE); + vdev_dbgmsg(vd, "vdev_validate: config guid " + "doesn't match label guid"); + vdev_dbgmsg(vd, "CONFIG: guid %llu, top_guid %llu", + (u_longlong_t)vd->vdev_guid, + (u_longlong_t)vd->vdev_top->vdev_guid); + vdev_dbgmsg(vd, "LABEL: guid %llu, top_guid %llu, " + "aux_guid %llu", (u_longlong_t)guid, + (u_longlong_t)top_guid, (u_longlong_t)aux_guid); return (0); } + } + if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE, + &state) != 0) { + vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_CORRUPT_DATA); nvlist_free(label); + vdev_dbgmsg(vd, "vdev_validate: '%s' missing from label", + ZPOOL_CONFIG_POOL_STATE); + return (0); + } - /* - * If this is a verbatim import, no need to check the - * state of the pool. - */ - if (!(spa->spa_import_flags & ZFS_IMPORT_VERBATIM) && - spa_load_state(spa) == SPA_LOAD_OPEN && - state != POOL_STATE_ACTIVE) { - vdev_dbgmsg(vd, "vdev_validate: invalid pool state " - "(%llu) for spa %s", (u_longlong_t)state, - spa->spa_name); - return (SET_ERROR(EBADF)); + nvlist_free(label); + + /* + * If this is a verbatim import, no need to check the + * state of the pool. + */ + if (!(spa->spa_import_flags & ZFS_IMPORT_VERBATIM) && + spa_load_state(spa) == SPA_LOAD_OPEN && + state != POOL_STATE_ACTIVE) { + vdev_dbgmsg(vd, "vdev_validate: invalid pool state (%llu) " + "for spa %s", (u_longlong_t)state, spa->spa_name); + return (SET_ERROR(EBADF)); + } + + /* + * If we were able to open and validate a vdev that was + * previously marked permanently unavailable, clear that state + * now. + */ + if (vd->vdev_not_present) + vd->vdev_not_present = 0; + + return (0); +} + +static void +vdev_copy_path_impl(vdev_t *svd, vdev_t *dvd) +{ + if (svd->vdev_path != NULL && dvd->vdev_path != NULL) { + if (strcmp(svd->vdev_path, dvd->vdev_path) != 0) { + zfs_dbgmsg("vdev_copy_path: vdev %llu: path changed " + "from '%s' to '%s'", (u_longlong_t)dvd->vdev_guid, + dvd->vdev_path, svd->vdev_path); + spa_strfree(dvd->vdev_path); + dvd->vdev_path = spa_strdup(svd->vdev_path); } + } else if (svd->vdev_path != NULL) { + dvd->vdev_path = spa_strdup(svd->vdev_path); + zfs_dbgmsg("vdev_copy_path: vdev %llu: path set to '%s'", + (u_longlong_t)dvd->vdev_guid, dvd->vdev_path); + } +} - /* - * If we were able to open and validate a vdev that was - * previously marked permanently unavailable, clear that state - * now. - */ - if (vd->vdev_not_present) - vd->vdev_not_present = 0; +/* + * Recursively copy vdev paths from one vdev to another. Source and destination + * vdev trees must have same geometry otherwise return error. Intended to copy + * paths from userland config into MOS config. + */ +int +vdev_copy_path_strict(vdev_t *svd, vdev_t *dvd) +{ + if ((svd->vdev_ops == &vdev_missing_ops) || + (svd->vdev_ishole && dvd->vdev_ishole) || + (dvd->vdev_ops == &vdev_indirect_ops)) + return (0); + + if (svd->vdev_ops != dvd->vdev_ops) { + vdev_dbgmsg(svd, "vdev_copy_path: vdev type mismatch: %s != %s", + svd->vdev_ops->vdev_op_type, dvd->vdev_ops->vdev_op_type); + return (SET_ERROR(EINVAL)); + } + + if (svd->vdev_guid != dvd->vdev_guid) { + vdev_dbgmsg(svd, "vdev_copy_path: guids mismatch (%llu != " + "%llu)", (u_longlong_t)svd->vdev_guid, + (u_longlong_t)dvd->vdev_guid); + return (SET_ERROR(EINVAL)); + } + + if (svd->vdev_children != dvd->vdev_children) { + vdev_dbgmsg(svd, "vdev_copy_path: children count mismatch: " + "%llu != %llu", (u_longlong_t)svd->vdev_children, + (u_longlong_t)dvd->vdev_children); + return (SET_ERROR(EINVAL)); } + for (uint64_t i = 0; i < svd->vdev_children; i++) { + int error = vdev_copy_path_strict(svd->vdev_child[i], + dvd->vdev_child[i]); + if (error != 0) + return (error); + } + + if (svd->vdev_ops->vdev_op_leaf) + vdev_copy_path_impl(svd, dvd); + return (0); } +static void +vdev_copy_path_search(vdev_t *stvd, vdev_t *dvd) +{ + ASSERT(stvd->vdev_top == stvd); + ASSERT3U(stvd->vdev_id, ==, dvd->vdev_top->vdev_id); + + for (uint64_t i = 0; i < dvd->vdev_children; i++) { + vdev_copy_path_search(stvd, dvd->vdev_child[i]); + } + + if (!dvd->vdev_ops->vdev_op_leaf || !vdev_is_concrete(dvd)) + return; + + /* + * The idea here is that while a vdev can shift positions within + * a top vdev (when replacing, attaching mirror, etc.) it cannot + * step outside of it. + */ + vdev_t *vd = vdev_lookup_by_guid(stvd, dvd->vdev_guid); + + if (vd == NULL || vd->vdev_ops != dvd->vdev_ops) + return; + + ASSERT(vd->vdev_ops->vdev_op_leaf); + + vdev_copy_path_impl(vd, dvd); +} + +/* + * Recursively copy vdev paths from one root vdev to another. Source and + * destination vdev trees may differ in geometry. For each destination leaf + * vdev, search a vdev with the same guid and top vdev id in the source. + * Intended to copy paths from userland config into MOS config. + */ +void +vdev_copy_path_relaxed(vdev_t *srvd, vdev_t *drvd) +{ + uint64_t children = MIN(srvd->vdev_children, drvd->vdev_children); + ASSERT(srvd->vdev_ops == &vdev_root_ops); + ASSERT(drvd->vdev_ops == &vdev_root_ops); + + for (uint64_t i = 0; i < children; i++) { + vdev_copy_path_search(srvd->vdev_child[i], + drvd->vdev_child[i]); + } +} + /* * Close a virtual device. */ @@ -1687,7 +1906,7 @@ vdev_reopen(vdev_t *vd) !l2arc_vdev_present(vd)) l2arc_add_vdev(spa, vd); } else { - (void) vdev_validate(vd, B_TRUE); + (void) vdev_validate(vd); } /* @@ -3551,6 +3770,19 @@ vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux) vdev_propagate_state(vd->vdev_parent); } +boolean_t +vdev_children_are_offline(vdev_t *vd) +{ + ASSERT(!vd->vdev_ops->vdev_op_leaf); + + for (uint64_t i = 0; i < vd->vdev_children; i++) { + if (vd->vdev_child[i]->vdev_state != VDEV_STATE_OFFLINE) + return (B_FALSE); + } + + return (B_TRUE); +} + /* * Check the vdev configuration to ensure that it's capable of supporting * a root pool. We do not support partial configuration. @@ -3591,35 +3823,6 @@ vdev_is_concrete(vdev_t *vd) } /* - * Load the state from the original vdev tree (ovd) which - * we've retrieved from the MOS config object. If the original - * vdev was offline or faulted then we transfer that state to the - * device in the current vdev tree (nvd). - */ -void -vdev_load_log_state(vdev_t *nvd, vdev_t *ovd) -{ - spa_t *spa = nvd->vdev_spa; - - ASSERT(nvd->vdev_top->vdev_islog); - ASSERT(spa_config_held(spa, SCL_STATE_ALL, RW_WRITER) == SCL_STATE_ALL); - ASSERT3U(nvd->vdev_guid, ==, ovd->vdev_guid); - - for (int c = 0; c < nvd->vdev_children; c++) - vdev_load_log_state(nvd->vdev_child[c], ovd->vdev_child[c]); - - if (nvd->vdev_ops->vdev_op_leaf) { - /* - * Restore the persistent vdev state - */ - nvd->vdev_offline = ovd->vdev_offline; - nvd->vdev_faulted = ovd->vdev_faulted; - nvd->vdev_degraded = ovd->vdev_degraded; - nvd->vdev_removed = ovd->vdev_removed; - } -} - -/* * Determine if a log device has valid content. If the vdev was * removed or faulted in the MOS config then we know that * the content on the log device has already been written to the pool. diff --git a/usr/src/uts/common/fs/zfs/vdev_indirect.c b/usr/src/uts/common/fs/zfs/vdev_indirect.c index 1025c8090e..5c4ea02047 100644 --- a/usr/src/uts/common/fs/zfs/vdev_indirect.c +++ b/usr/src/uts/common/fs/zfs/vdev_indirect.c @@ -14,7 +14,7 @@ */ /* - * Copyright (c) 2014, 2015 by Delphix. All rights reserved. + * Copyright (c) 2014, 2017 by Delphix. All rights reserved. */ #include <sys/zfs_context.h> @@ -30,6 +30,8 @@ #include <sys/dmu_tx.h> #include <sys/dsl_synctask.h> #include <sys/zap.h> +#include <sys/abd.h> +#include <sys/zthr.h> /* * An indirect vdev corresponds to a vdev that has been removed. Since @@ -475,7 +477,7 @@ spa_condense_indirect_commit_entry(spa_t *spa, static void spa_condense_indirect_generate_new_mapping(vdev_t *vd, - uint32_t *obsolete_counts, uint64_t start_index) + uint32_t *obsolete_counts, uint64_t start_index, zthr_t *zthr) { spa_t *spa = vd->vdev_spa; uint64_t mapi = start_index; @@ -490,7 +492,15 @@ spa_condense_indirect_generate_new_mapping(vdev_t *vd, (u_longlong_t)vd->vdev_id, (u_longlong_t)mapi); - while (mapi < old_num_entries && !spa_shutting_down(spa)) { + while (mapi < old_num_entries) { + + if (zthr_iscancelled(zthr)) { + zfs_dbgmsg("pausing condense of vdev %llu " + "at index %llu", (u_longlong_t)vd->vdev_id, + (u_longlong_t)mapi); + break; + } + vdev_indirect_mapping_entry_phys_t *entry = &old_mapping->vim_entries[mapi]; uint64_t entry_size = DVA_GET_ASIZE(&entry->vimep_dst); @@ -508,18 +518,30 @@ spa_condense_indirect_generate_new_mapping(vdev_t *vd, mapi++; } - if (spa_shutting_down(spa)) { - zfs_dbgmsg("pausing condense of vdev %llu at index %llu", - (u_longlong_t)vd->vdev_id, - (u_longlong_t)mapi); - } } -static void -spa_condense_indirect_thread(void *arg) +/* ARGSUSED */ +static boolean_t +spa_condense_indirect_thread_check(void *arg, zthr_t *zthr) { - vdev_t *vd = arg; - spa_t *spa = vd->vdev_spa; + spa_t *spa = arg; + + return (spa->spa_condensing_indirect != NULL); +} + +/* ARGSUSED */ +static int +spa_condense_indirect_thread(void *arg, zthr_t *zthr) +{ + spa_t *spa = arg; + vdev_t *vd; + + ASSERT3P(spa->spa_condensing_indirect, !=, NULL); + spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER); + vd = vdev_lookup_top(spa, spa->spa_condensing_indirect_phys.scip_vdev); + ASSERT3P(vd, !=, NULL); + spa_config_exit(spa, SCL_VDEV, FTAG); + spa_condensing_indirect_t *sci = spa->spa_condensing_indirect; spa_condensing_indirect_phys_t *scip = &spa->spa_condensing_indirect_phys; @@ -593,25 +615,24 @@ spa_condense_indirect_thread(void *arg) } } - spa_condense_indirect_generate_new_mapping(vd, counts, start_index); + spa_condense_indirect_generate_new_mapping(vd, counts, + start_index, zthr); vdev_indirect_mapping_free_obsolete_counts(old_mapping, counts); /* - * We may have bailed early from generate_new_mapping(), if - * the spa is shutting down. In this case, do not complete - * the condense. + * If the zthr has received a cancellation signal while running + * in generate_new_mapping() or at any point after that, then bail + * early. We don't want to complete the condense if the spa is + * shutting down. */ - if (!spa_shutting_down(spa)) { - VERIFY0(dsl_sync_task(spa_name(spa), NULL, - spa_condense_indirect_complete_sync, sci, 0, - ZFS_SPACE_CHECK_NONE)); - } + if (zthr_iscancelled(zthr)) + return (0); + + VERIFY0(dsl_sync_task(spa_name(spa), NULL, + spa_condense_indirect_complete_sync, sci, 0, ZFS_SPACE_CHECK_NONE)); - mutex_enter(&spa->spa_async_lock); - spa->spa_condense_thread = NULL; - cv_broadcast(&spa->spa_async_cv); - mutex_exit(&spa->spa_async_lock); + return (0); } /* @@ -664,9 +685,7 @@ spa_condense_indirect_start_sync(vdev_t *vd, dmu_tx_t *tx) (u_longlong_t)scip->scip_prev_obsolete_sm_object, (u_longlong_t)scip->scip_next_mapping_object); - ASSERT3P(spa->spa_condense_thread, ==, NULL); - spa->spa_condense_thread = thread_create(NULL, 0, - spa_condense_indirect_thread, vd, 0, &p0, TS_RUN, minclsyspri); + zthr_wakeup(spa->spa_condense_zthr); } /* @@ -743,24 +762,12 @@ spa_condense_fini(spa_t *spa) } } -/* - * Restart the condense - called when the pool is opened. - */ void -spa_condense_indirect_restart(spa_t *spa) +spa_start_indirect_condensing_thread(spa_t *spa) { - vdev_t *vd; - ASSERT(spa->spa_condensing_indirect != NULL); - spa_config_enter(spa, SCL_VDEV, FTAG, RW_READER); - vd = vdev_lookup_top(spa, - spa->spa_condensing_indirect_phys.scip_vdev); - ASSERT(vd != NULL); - spa_config_exit(spa, SCL_VDEV, FTAG); - - ASSERT3P(spa->spa_condense_thread, ==, NULL); - spa->spa_condense_thread = thread_create(NULL, 0, - spa_condense_indirect_thread, vd, 0, &p0, TS_RUN, - minclsyspri); + ASSERT3P(spa->spa_condense_zthr, ==, NULL); + spa->spa_condense_zthr = zthr_create(spa_condense_indirect_thread_check, + spa_condense_indirect_thread, spa); } /* @@ -845,6 +852,57 @@ rs_alloc(vdev_t *vd, uint64_t offset, uint64_t asize, uint64_t split_offset) } /* + * Given an indirect vdev and an extent on that vdev, it duplicates the + * physical entries of the indirect mapping that correspond to the extent + * to a new array and returns a pointer to it. In addition, copied_entries + * is populated with the number of mapping entries that were duplicated. + * + * Note that the function assumes that the caller holds vdev_indirect_rwlock. + * This ensures that the mapping won't change due to condensing as we + * copy over its contents. + * + * Finally, since we are doing an allocation, it is up to the caller to + * free the array allocated in this function. + */ +vdev_indirect_mapping_entry_phys_t * +vdev_indirect_mapping_duplicate_adjacent_entries(vdev_t *vd, uint64_t offset, + uint64_t asize, uint64_t *copied_entries) +{ + vdev_indirect_mapping_entry_phys_t *duplicate_mappings = NULL; + vdev_indirect_mapping_t *vim = vd->vdev_indirect_mapping; + uint64_t entries = 0; + + ASSERT(RW_READ_HELD(&vd->vdev_indirect_rwlock)); + + vdev_indirect_mapping_entry_phys_t *first_mapping = + vdev_indirect_mapping_entry_for_offset(vim, offset); + ASSERT3P(first_mapping, !=, NULL); + + vdev_indirect_mapping_entry_phys_t *m = first_mapping; + while (asize > 0) { + uint64_t size = DVA_GET_ASIZE(&m->vimep_dst); + + ASSERT3U(offset, >=, DVA_MAPPING_GET_SRC_OFFSET(m)); + ASSERT3U(offset, <, DVA_MAPPING_GET_SRC_OFFSET(m) + size); + + uint64_t inner_offset = offset - DVA_MAPPING_GET_SRC_OFFSET(m); + uint64_t inner_size = MIN(asize, size - inner_offset); + + offset += inner_size; + asize -= inner_size; + entries++; + m++; + } + + size_t copy_length = entries * sizeof (*first_mapping); + duplicate_mappings = kmem_alloc(copy_length, KM_SLEEP); + bcopy(first_mapping, duplicate_mappings, copy_length); + *copied_entries = entries; + + return (duplicate_mappings); +} + +/* * Goes through the relevant indirect mappings until it hits a concrete vdev * and issues the callback. On the way to the concrete vdev, if any other * indirect vdevs are encountered, then the callback will also be called on @@ -884,24 +942,42 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, for (remap_segment_t *rs = rs_alloc(vd, offset, asize, 0); rs != NULL; rs = list_remove_head(&stack)) { vdev_t *v = rs->rs_vd; + uint64_t num_entries = 0; + + ASSERT(spa_config_held(spa, SCL_ALL, RW_READER) != 0); + ASSERT(rs->rs_asize > 0); /* - * Note: this can be called from open context - * (eg. zio_read()), so we need the rwlock to prevent - * the mapping from being changed by condensing. + * Note: As this function can be called from open context + * (e.g. zio_read()), we need the following rwlock to + * prevent the mapping from being changed by condensing. + * + * So we grab the lock and we make a copy of the entries + * that are relevant to the extent that we are working on. + * Once that is done, we drop the lock and iterate over + * our copy of the mapping. Once we are done with the with + * the remap segment and we free it, we also free our copy + * of the indirect mapping entries that are relevant to it. + * + * This way we don't need to wait until the function is + * finished with a segment, to condense it. In addition, we + * don't need a recursive rwlock for the case that a call to + * vdev_indirect_remap() needs to call itself (through the + * codepath of its callback) for the same vdev in the middle + * of its execution. */ rw_enter(&v->vdev_indirect_rwlock, RW_READER); vdev_indirect_mapping_t *vim = v->vdev_indirect_mapping; ASSERT3P(vim, !=, NULL); - ASSERT(spa_config_held(spa, SCL_ALL, RW_READER) != 0); - ASSERT(rs->rs_asize > 0); - vdev_indirect_mapping_entry_phys_t *mapping = - vdev_indirect_mapping_entry_for_offset(vim, rs->rs_offset); + vdev_indirect_mapping_duplicate_adjacent_entries(v, + rs->rs_offset, rs->rs_asize, &num_entries); ASSERT3P(mapping, !=, NULL); + ASSERT3U(num_entries, >, 0); + rw_exit(&v->vdev_indirect_rwlock); - while (rs->rs_asize > 0) { + for (uint64_t i = 0; i < num_entries; i++) { /* * Note: the vdev_indirect_mapping can not change * while we are running. It only changes while the @@ -910,20 +986,23 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, * function is only called for frees, which also only * happen from syncing context. */ + vdev_indirect_mapping_entry_phys_t *m = &mapping[i]; + + ASSERT3P(m, !=, NULL); + ASSERT3U(rs->rs_asize, >, 0); - uint64_t size = DVA_GET_ASIZE(&mapping->vimep_dst); - uint64_t dst_offset = - DVA_GET_OFFSET(&mapping->vimep_dst); - uint64_t dst_vdev = DVA_GET_VDEV(&mapping->vimep_dst); + uint64_t size = DVA_GET_ASIZE(&m->vimep_dst); + uint64_t dst_offset = DVA_GET_OFFSET(&m->vimep_dst); + uint64_t dst_vdev = DVA_GET_VDEV(&m->vimep_dst); ASSERT3U(rs->rs_offset, >=, - DVA_MAPPING_GET_SRC_OFFSET(mapping)); + DVA_MAPPING_GET_SRC_OFFSET(m)); ASSERT3U(rs->rs_offset, <, - DVA_MAPPING_GET_SRC_OFFSET(mapping) + size); + DVA_MAPPING_GET_SRC_OFFSET(m) + size); ASSERT3U(dst_vdev, !=, v->vdev_id); uint64_t inner_offset = rs->rs_offset - - DVA_MAPPING_GET_SRC_OFFSET(mapping); + DVA_MAPPING_GET_SRC_OFFSET(m); uint64_t inner_size = MIN(rs->rs_asize, size - inner_offset); @@ -964,10 +1043,10 @@ vdev_indirect_remap(vdev_t *vd, uint64_t offset, uint64_t asize, rs->rs_offset += inner_size; rs->rs_asize -= inner_size; rs->rs_split_offset += inner_size; - mapping++; } + VERIFY0(rs->rs_asize); - rw_exit(&v->vdev_indirect_rwlock); + kmem_free(mapping, num_entries * sizeof (*mapping)); kmem_free(rs, sizeof (remap_segment_t)); } list_destroy(&stack); diff --git a/usr/src/uts/common/fs/zfs/vdev_label.c b/usr/src/uts/common/fs/zfs/vdev_label.c index be3b89ee37..7ccc672437 100644 --- a/usr/src/uts/common/fs/zfs/vdev_label.c +++ b/usr/src/uts/common/fs/zfs/vdev_label.c @@ -265,7 +265,7 @@ vdev_config_generate(spa_t *spa, vdev_t *vd, boolean_t getstats, fnvlist_add_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK, vd->vdev_wholedisk); - if (vd->vdev_not_present) + if (vd->vdev_not_present && !(flags & VDEV_CONFIG_MISSING)) fnvlist_add_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, 1); if (vd->vdev_isspare) @@ -1062,6 +1062,11 @@ vdev_uberblock_load(vdev_t *rvd, uberblock_t *ub, nvlist_t **config) "txg %llu", spa->spa_name, (u_longlong_t)ub->ub_txg); *config = vdev_label_read_config(cb.ubl_vd, ub->ub_txg); + if (*config == NULL && spa->spa_extreme_rewind) { + vdev_dbgmsg(cb.ubl_vd, "failed to read label config. " + "Trying again without txg restrictions."); + *config = vdev_label_read_config(cb.ubl_vd, UINT64_MAX); + } if (*config == NULL) { vdev_dbgmsg(cb.ubl_vd, "failed to read label config"); } @@ -1088,7 +1093,7 @@ vdev_uberblock_sync_done(zio_t *zio) static void vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, int flags) { - for (int c = 0; c < vd->vdev_children; c++) + for (uint64_t c = 0; c < vd->vdev_children; c++) vdev_uberblock_sync(zio, ub, vd->vdev_child[c], flags); if (!vd->vdev_ops->vdev_op_leaf) diff --git a/usr/src/uts/common/fs/zfs/vdev_mirror.c b/usr/src/uts/common/fs/zfs/vdev_mirror.c index a2a4925942..9d181a874e 100644 --- a/usr/src/uts/common/fs/zfs/vdev_mirror.c +++ b/usr/src/uts/common/fs/zfs/vdev_mirror.c @@ -84,9 +84,32 @@ vdev_mirror_map_alloc(zio_t *zio) if (vd == NULL) { dva_t *dva = zio->io_bp->blk_dva; spa_t *spa = zio->io_spa; + dva_t dva_copy[SPA_DVAS_PER_BP]; c = BP_GET_NDVAS(zio->io_bp); + /* + * If we do not trust the pool config, some DVAs might be + * invalid or point to vdevs that do not exist. We skip them. + */ + if (!spa_trust_config(spa)) { + ASSERT3U(zio->io_type, ==, ZIO_TYPE_READ); + int j = 0; + for (int i = 0; i < c; i++) { + if (zfs_dva_valid(spa, &dva[i], zio->io_bp)) + dva_copy[j++] = dva[i]; + } + if (j == 0) { + zio->io_vsd = NULL; + zio->io_error = ENXIO; + return (NULL); + } + if (j < c) { + dva = dva_copy; + c = j; + } + } + mm = kmem_zalloc(offsetof(mirror_map_t, mm_child[c]), KM_SLEEP); mm->mm_children = c; mm->mm_resilvering = B_FALSE; @@ -201,7 +224,10 @@ vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, } if (numerrors == vd->vdev_children) { - vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS; + if (vdev_children_are_offline(vd)) + vd->vdev_stat.vs_aux = VDEV_AUX_CHILDREN_OFFLINE; + else + vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS; return (lasterror); } @@ -311,6 +337,13 @@ vdev_mirror_io_start(zio_t *zio) mm = vdev_mirror_map_alloc(zio); + if (mm == NULL) { + ASSERT(!spa_trust_config(zio->io_spa)); + ASSERT(zio->io_type == ZIO_TYPE_READ); + zio_execute(zio); + return; + } + if (zio->io_type == ZIO_TYPE_READ) { if ((zio->io_flags & ZIO_FLAG_SCRUB) && !mm->mm_resilvering) { /* @@ -381,6 +414,9 @@ vdev_mirror_io_done(zio_t *zio) int good_copies = 0; int unexpected_errors = 0; + if (mm == NULL) + return; + for (c = 0; c < mm->mm_children; c++) { mc = &mm->mm_child[c]; @@ -486,13 +522,19 @@ vdev_mirror_io_done(zio_t *zio) static void vdev_mirror_state_change(vdev_t *vd, int faulted, int degraded) { - if (faulted == vd->vdev_children) - vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, - VDEV_AUX_NO_REPLICAS); - else if (degraded + faulted != 0) + if (faulted == vd->vdev_children) { + if (vdev_children_are_offline(vd)) { + vdev_set_state(vd, B_FALSE, VDEV_STATE_OFFLINE, + VDEV_AUX_CHILDREN_OFFLINE); + } else { + vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, + VDEV_AUX_NO_REPLICAS); + } + } else if (degraded + faulted != 0) { vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, VDEV_AUX_NONE); - else + } else { vdev_set_state(vd, B_FALSE, VDEV_STATE_HEALTHY, VDEV_AUX_NONE); + } } vdev_ops_t vdev_mirror_ops = { diff --git a/usr/src/uts/common/fs/zfs/vdev_root.c b/usr/src/uts/common/fs/zfs/vdev_root.c index 6971b942f0..b3433c2424 100644 --- a/usr/src/uts/common/fs/zfs/vdev_root.c +++ b/usr/src/uts/common/fs/zfs/vdev_root.c @@ -37,6 +37,23 @@ * Virtual device vector for the pool's root vdev. */ +static uint64_t +vdev_root_core_tvds(vdev_t *vd) +{ + uint64_t tvds = 0; + + for (uint64_t c = 0; c < vd->vdev_children; c++) { + vdev_t *cvd = vd->vdev_child[c]; + + if (!cvd->vdev_ishole && !cvd->vdev_islog && + cvd->vdev_ops != &vdev_indirect_ops) { + tvds++; + } + } + + return (tvds); +} + /* * We should be able to tolerate one failure with absolutely no damage * to our metadata. Two failures will take out space maps, a bunch of @@ -46,17 +63,28 @@ * probably fine. Adding bean counters during alloc/free can make this * future guesswork more accurate. */ -static int -too_many_errors(vdev_t *vd, int numerrors) +static boolean_t +too_many_errors(vdev_t *vd, uint64_t numerrors) { - ASSERT3U(numerrors, <=, vd->vdev_children); - return (numerrors > 0); + uint64_t tvds; + + if (numerrors == 0) + return (B_FALSE); + + tvds = vdev_root_core_tvds(vd); + ASSERT3U(numerrors, <=, tvds); + + if (numerrors == tvds) + return (B_TRUE); + + return (numerrors > spa_missing_tvds_allowed(vd->vdev_spa)); } static int vdev_root_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, uint64_t *ashift) { + spa_t *spa = vd->vdev_spa; int lasterror = 0; int numerrors = 0; @@ -76,6 +104,9 @@ vdev_root_open(vdev_t *vd, uint64_t *asize, uint64_t *max_asize, } } + if (spa_load_state(spa) != SPA_LOAD_NONE) + spa_set_missing_tvds(spa, numerrors); + if (too_many_errors(vd, numerrors)) { vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS; return (lasterror); @@ -101,7 +132,7 @@ vdev_root_state_change(vdev_t *vd, int faulted, int degraded) if (too_many_errors(vd, faulted)) { vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN, VDEV_AUX_NO_REPLICAS); - } else if (degraded) { + } else if (degraded || faulted) { vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, VDEV_AUX_NONE); } else { vdev_set_state(vd, B_FALSE, VDEV_STATE_HEALTHY, VDEV_AUX_NONE); diff --git a/usr/src/uts/common/fs/zfs/zio.c b/usr/src/uts/common/fs/zfs/zio.c index 7bde5a8391..29cdf08d52 100644 --- a/usr/src/uts/common/fs/zfs/zio.c +++ b/usr/src/uts/common/fs/zfs/zio.c @@ -444,21 +444,26 @@ zio_remove_child(zio_t *pio, zio_t *cio, zio_link_t *zl) } static boolean_t -zio_wait_for_children(zio_t *zio, enum zio_child child, enum zio_wait_type wait) +zio_wait_for_children(zio_t *zio, uint8_t childbits, enum zio_wait_type wait) { - uint64_t *countp = &zio->io_children[child][wait]; boolean_t waiting = B_FALSE; mutex_enter(&zio->io_lock); ASSERT(zio->io_stall == NULL); - if (*countp != 0) { - zio->io_stage >>= 1; - ASSERT3U(zio->io_stage, !=, ZIO_STAGE_OPEN); - zio->io_stall = countp; - waiting = B_TRUE; + for (int c = 0; c < ZIO_CHILD_TYPES; c++) { + if (!(ZIO_CHILD_BIT_IS_SET(childbits, c))) + continue; + + uint64_t *countp = &zio->io_children[c][wait]; + if (*countp != 0) { + zio->io_stage >>= 1; + ASSERT3U(zio->io_stage, !=, ZIO_STAGE_OPEN); + zio->io_stall = countp; + waiting = B_TRUE; + break; + } } mutex_exit(&zio->io_lock); - return (waiting); } @@ -693,6 +698,13 @@ zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp) } /* + * Do not verify individual DVAs if the config is not trusted. This + * will be done once the zio is executed in vdev_mirror_map_alloc. + */ + if (!spa->spa_trust_config) + return; + + /* * Pool-specific checks. * * Note: it would be nice to verify that the blk_birth and @@ -741,6 +753,36 @@ zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp) } } +boolean_t +zfs_dva_valid(spa_t *spa, const dva_t *dva, const blkptr_t *bp) +{ + uint64_t vdevid = DVA_GET_VDEV(dva); + + if (vdevid >= spa->spa_root_vdev->vdev_children) + return (B_FALSE); + + vdev_t *vd = spa->spa_root_vdev->vdev_child[vdevid]; + if (vd == NULL) + return (B_FALSE); + + if (vd->vdev_ops == &vdev_hole_ops) + return (B_FALSE); + + if (vd->vdev_ops == &vdev_missing_ops) { + return (B_FALSE); + } + + uint64_t offset = DVA_GET_OFFSET(dva); + uint64_t asize = DVA_GET_ASIZE(dva); + + if (BP_IS_GANG(bp)) + asize = vdev_psize_to_asize(vd, SPA_GANGBLOCKSIZE); + if (offset + asize > vd->vdev_asize) + return (B_FALSE); + + return (B_TRUE); +} + zio_t * zio_read(zio_t *pio, spa_t *spa, const blkptr_t *bp, abd_t *data, uint64_t size, zio_done_func_t *done, void *private, @@ -1267,9 +1309,10 @@ zio_write_compress(zio_t *zio) * If our children haven't all reached the ready stage, * wait for them and then repeat this pipeline stage. */ - if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_READY) || - zio_wait_for_children(zio, ZIO_CHILD_LOGICAL, ZIO_WAIT_READY)) + if (zio_wait_for_children(zio, ZIO_CHILD_LOGICAL_BIT | + ZIO_CHILD_GANG_BIT, ZIO_WAIT_READY)) { return (ZIO_PIPELINE_STOP); + } if (!IO_IS_ALLOCATING(zio)) return (ZIO_PIPELINE_CONTINUE); @@ -2112,8 +2155,9 @@ zio_gang_issue(zio_t *zio) { blkptr_t *bp = zio->io_bp; - if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE)) + if (zio_wait_for_children(zio, ZIO_CHILD_GANG_BIT, ZIO_WAIT_DONE)) { return (ZIO_PIPELINE_STOP); + } ASSERT(BP_IS_GANG(bp) && zio->io_gang_leader == zio); ASSERT(zio->io_child_type > ZIO_CHILD_GANG); @@ -2434,8 +2478,9 @@ zio_ddt_read_done(zio_t *zio) { blkptr_t *bp = zio->io_bp; - if (zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_DONE)) + if (zio_wait_for_children(zio, ZIO_CHILD_DDT_BIT, ZIO_WAIT_DONE)) { return (ZIO_PIPELINE_STOP); + } ASSERT(BP_GET_DEDUP(bp)); ASSERT(BP_GET_PSIZE(bp) == zio->io_size); @@ -3038,10 +3083,14 @@ zio_vdev_io_start(zio_t *zio) } ASSERT3P(zio->io_logical, !=, zio); - if (zio->io_type == ZIO_TYPE_WRITE && zio->io_vd->vdev_removing) { - ASSERT(zio->io_flags & - (ZIO_FLAG_PHYSICAL | ZIO_FLAG_SELF_HEAL | - ZIO_FLAG_INDUCE_DAMAGE)); + if (zio->io_type == ZIO_TYPE_WRITE) { + ASSERT(spa->spa_trust_config); + + if (zio->io_vd->vdev_removing) { + ASSERT(zio->io_flags & + (ZIO_FLAG_PHYSICAL | ZIO_FLAG_SELF_HEAL | + ZIO_FLAG_INDUCE_DAMAGE)); + } } /* @@ -3146,8 +3195,9 @@ zio_vdev_io_done(zio_t *zio) vdev_ops_t *ops = vd ? vd->vdev_ops : &vdev_mirror_ops; boolean_t unexpected_error = B_FALSE; - if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE)) + if (zio_wait_for_children(zio, ZIO_CHILD_VDEV_BIT, ZIO_WAIT_DONE)) { return (ZIO_PIPELINE_STOP); + } ASSERT(zio->io_type == ZIO_TYPE_READ || zio->io_type == ZIO_TYPE_WRITE); @@ -3213,8 +3263,9 @@ zio_vdev_io_assess(zio_t *zio) { vdev_t *vd = zio->io_vd; - if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE)) + if (zio_wait_for_children(zio, ZIO_CHILD_VDEV_BIT, ZIO_WAIT_DONE)) { return (ZIO_PIPELINE_STOP); + } if (vd == NULL && !(zio->io_flags & ZIO_FLAG_CONFIG_WRITER)) spa_config_exit(zio->io_spa, SCL_ZIO, zio); @@ -3429,9 +3480,10 @@ zio_ready(zio_t *zio) zio_t *pio, *pio_next; zio_link_t *zl = NULL; - if (zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_READY) || - zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_READY)) + if (zio_wait_for_children(zio, ZIO_CHILD_GANG_BIT | ZIO_CHILD_DDT_BIT, + ZIO_WAIT_READY)) { return (ZIO_PIPELINE_STOP); + } if (zio->io_ready) { ASSERT(IO_IS_ALLOCATING(zio)); @@ -3571,11 +3623,9 @@ zio_done(zio_t *zio) * If our children haven't all completed, * wait for them and then repeat this pipeline stage. */ - if (zio_wait_for_children(zio, ZIO_CHILD_VDEV, ZIO_WAIT_DONE) || - zio_wait_for_children(zio, ZIO_CHILD_GANG, ZIO_WAIT_DONE) || - zio_wait_for_children(zio, ZIO_CHILD_DDT, ZIO_WAIT_DONE) || - zio_wait_for_children(zio, ZIO_CHILD_LOGICAL, ZIO_WAIT_DONE)) + if (zio_wait_for_children(zio, ZIO_CHILD_ALL_BITS, ZIO_WAIT_DONE)) { return (ZIO_PIPELINE_STOP); + } /* * If the allocation throttle is enabled, then update the accounting. diff --git a/usr/src/uts/common/fs/zfs/zthr.c b/usr/src/uts/common/fs/zfs/zthr.c new file mode 100644 index 0000000000..9beb7e128f --- /dev/null +++ b/usr/src/uts/common/fs/zfs/zthr.c @@ -0,0 +1,319 @@ +/* + * CDDL HEADER START + * + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + * + * CDDL HEADER END + */ + +/* + * Copyright (c) 2017 by Delphix. All rights reserved. + */ + +/* + * ZTHR Infrastructure + * =================== + * + * ZTHR threads are used for isolated operations that span multiple txgs + * within a SPA. They generally exist from SPA creation/loading and until + * the SPA is exported/destroyed. The ideal requirements for an operation + * to be modeled with a zthr are the following: + * + * 1] The operation needs to run over multiple txgs. + * 2] There is be a single point of reference in memory or on disk that + * indicates whether the operation should run/is running or is + * stopped. + * + * If the operation satisfies the above then the following rules guarantee + * a certain level of correctness: + * + * 1] Any thread EXCEPT the zthr changes the work indicator from stopped + * to running but not the opposite. + * 2] Only the zthr can change the work indicator from running to stopped + * (e.g. when it is done) but not the opposite. + * + * This way a normal zthr cycle should go like this: + * + * 1] An external thread changes the work indicator from stopped to + * running and wakes up the zthr. + * 2] The zthr wakes up, checks the indicator and starts working. + * 3] When the zthr is done, it changes the indicator to stopped, allowing + * a new cycle to start. + * + * == ZTHR creation + * + * Every zthr needs three inputs to start running: + * + * 1] A user-defined checker function (checkfunc) that decides whether + * the zthr should start working or go to sleep. The function should + * return TRUE when the zthr needs to work or FALSE to let it sleep, + * and should adhere to the following signature: + * boolean_t checkfunc_name(void *args, zthr_t *t); + * + * 2] A user-defined ZTHR function (func) which the zthr executes when + * it is not sleeping. The function should adhere to the following + * signature type: + * int func_name(void *args, zthr_t *t); + * + * 3] A void args pointer that will be passed to checkfunc and func + * implicitly by the infrastructure. + * + * The reason why the above API needs two different functions, + * instead of one that both checks and does the work, has to do with + * the zthr's internal lock (zthr_lock) and the allowed cancellation + * windows. We want to hold the zthr_lock while running checkfunc + * but not while running func. This way the zthr can be cancelled + * while doing work and not while checking for work. + * + * To start a zthr: + * zthr_t *zthr_pointer = zthr_create(checkfunc, func, args); + * + * After that you should be able to wakeup, cancel, and resume the + * zthr from another thread using zthr_pointer. + * + * NOTE: ZTHR threads could potentially wake up spuriously and the + * user should take this into account when writing a checkfunc. + * [see ZTHR state transitions] + * + * == ZTHR cancellation + * + * ZTHR threads must be cancelled when their SPA is being exported + * or when they need to be paused so they don't interfere with other + * operations. + * + * To cancel a zthr: + * zthr_cancel(zthr_pointer); + * + * To resume it: + * zthr_resume(zthr_pointer); + * + * A zthr will implicitly check if it has received a cancellation + * signal every time func returns and everytime it wakes up [see ZTHR + * state transitions below]. + * + * At times, waiting for the zthr's func to finish its job may take + * time. This may be very time-consuming for some operations that + * need to cancel the SPA's zthrs (e.g spa_export). For this scenario + * the user can explicitly make their ZTHR function aware of incoming + * cancellation signals using zthr_iscancelled(). A common pattern for + * that looks like this: + * + * int + * func_name(void *args, zthr_t *t) + * { + * ... <unpack args> ... + * while (!work_done && !zthr_iscancelled(t)) { + * ... <do more work> ... + * } + * return (0); + * } + * + * == ZTHR exit + * + * For the rare cases where the zthr wants to stop running voluntarily + * while running its ZTHR function (func), we provide zthr_exit(). + * When a zthr has voluntarily stopped running, it can be resumed with + * zthr_resume(), just like it would if it was cancelled by some other + * thread. + * + * == ZTHR cleanup + * + * Cancelling a zthr doesn't clean up its metadata (internal locks, + * function pointers to func and checkfunc, etc..). This is because + * we want to keep them around in case we want to resume the execution + * of the zthr later. Similarly for zthrs that exit themselves. + * + * To completely cleanup a zthr, cancel it first to ensure that it + * is not running and then use zthr_destroy(). + * + * == ZTHR state transitions + * + * zthr creation + * + + * | + * | woke up + * | +--------------+ sleep + * | | ^ + * | | | + * | | | FALSE + * | | | + * v v FALSE + + * cancelled? +---------> checkfunc? + * + ^ + + * | | | + * | | | TRUE + * | | | + * | | func returned v + * | +---------------+ func + * | + * | TRUE + * | + * v + * zthr stopped running + * + */ + +#include <sys/zfs_context.h> +#include <sys/zthr.h> + +void +zthr_exit(zthr_t *t, int rc) +{ + ASSERT3P(t->zthr_thread, ==, curthread); + mutex_enter(&t->zthr_lock); + t->zthr_thread = NULL; + t->zthr_rc = rc; + cv_broadcast(&t->zthr_cv); + mutex_exit(&t->zthr_lock); + thread_exit(); +} + +static void +zthr_procedure(void *arg) +{ + zthr_t *t = arg; + int rc = 0; + + mutex_enter(&t->zthr_lock); + while (!t->zthr_cancel) { + if (t->zthr_checkfunc(t->zthr_arg, t)) { + mutex_exit(&t->zthr_lock); + rc = t->zthr_func(t->zthr_arg, t); + mutex_enter(&t->zthr_lock); + } else { + /* go to sleep */ + cv_wait(&t->zthr_cv, &t->zthr_lock); + } + } + mutex_exit(&t->zthr_lock); + + zthr_exit(t, rc); +} + +zthr_t * +zthr_create(zthr_checkfunc_t *checkfunc, zthr_func_t *func, void *arg) +{ + zthr_t *t = kmem_zalloc(sizeof (*t), KM_SLEEP); + mutex_init(&t->zthr_lock, NULL, MUTEX_DEFAULT, NULL); + cv_init(&t->zthr_cv, NULL, CV_DEFAULT, NULL); + + mutex_enter(&t->zthr_lock); + t->zthr_checkfunc = checkfunc; + t->zthr_func = func; + t->zthr_arg = arg; + + t->zthr_thread = thread_create(NULL, 0, zthr_procedure, t, + 0, &p0, TS_RUN, minclsyspri); + mutex_exit(&t->zthr_lock); + + return (t); +} + +void +zthr_destroy(zthr_t *t) +{ + VERIFY3P(t->zthr_thread, ==, NULL); + mutex_destroy(&t->zthr_lock); + cv_destroy(&t->zthr_cv); + kmem_free(t, sizeof (*t)); +} + +/* + * Note: If the zthr is not sleeping and misses the wakeup + * (e.g it is running its ZTHR function), it will check if + * there is work to do before going to sleep using its checker + * function [see ZTHR state transition in ZTHR block comment]. + * Thus, missing the wakeup still yields the expected behavior. + */ +void +zthr_wakeup(zthr_t *t) +{ + ASSERT3P(t->zthr_thread, !=, NULL); + + mutex_enter(&t->zthr_lock); + cv_broadcast(&t->zthr_cv); + mutex_exit(&t->zthr_lock); +} + +/* + * Note: If the zthr is not running (e.g. has been cancelled + * already), this is a no-op. + */ +int +zthr_cancel(zthr_t *t) +{ + int rc = 0; + + mutex_enter(&t->zthr_lock); + + /* broadcast in case the zthr is sleeping */ + cv_broadcast(&t->zthr_cv); + + t->zthr_cancel = B_TRUE; + while (t->zthr_thread != NULL) + cv_wait(&t->zthr_cv, &t->zthr_lock); + t->zthr_cancel = B_FALSE; + rc = t->zthr_rc; + mutex_exit(&t->zthr_lock); + + return (rc); +} + +void +zthr_resume(zthr_t *t) +{ + ASSERT3P(t->zthr_thread, ==, NULL); + + mutex_enter(&t->zthr_lock); + + ASSERT3P(&t->zthr_checkfunc, !=, NULL); + ASSERT3P(&t->zthr_func, !=, NULL); + ASSERT(!t->zthr_cancel); + + t->zthr_thread = thread_create(NULL, 0, zthr_procedure, t, + 0, &p0, TS_RUN, minclsyspri); + + mutex_exit(&t->zthr_lock); +} + +/* + * This function is intended to be used by the zthr itself + * to check if another thread has signal it to stop running. + * + * returns TRUE if we are in the middle of trying to cancel + * this thread. + * + * returns FALSE otherwise. + */ +boolean_t +zthr_iscancelled(zthr_t *t) +{ + boolean_t cancelled; + + ASSERT3P(t->zthr_thread, ==, curthread); + + mutex_enter(&t->zthr_lock); + cancelled = t->zthr_cancel; + mutex_exit(&t->zthr_lock); + + return (cancelled); +} + +boolean_t +zthr_isrunning(zthr_t *t) +{ + boolean_t running; + + mutex_enter(&t->zthr_lock); + running = (t->zthr_thread != NULL); + mutex_exit(&t->zthr_lock); + + return (running); +} diff --git a/usr/src/uts/common/sys/fs/zfs.h b/usr/src/uts/common/sys/fs/zfs.h index b37fa81211..5d3bf831fc 100644 --- a/usr/src/uts/common/sys/fs/zfs.h +++ b/usr/src/uts/common/sys/fs/zfs.h @@ -578,6 +578,7 @@ typedef struct zpool_rewind_policy { #define ZPOOL_CONFIG_VDEV_TOP_ZAP "com.delphix:vdev_zap_top" #define ZPOOL_CONFIG_VDEV_LEAF_ZAP "com.delphix:vdev_zap_leaf" #define ZPOOL_CONFIG_HAS_PER_VDEV_ZAPS "com.delphix:has_per_vdev_zaps" +#define ZPOOL_CONFIG_CACHEFILE "cachefile" /* not stored on disk */ /* * The persistent vdev state is stored as separate values rather than a single * 'vdev_state' entry. This is because a device can be in multiple states, such @@ -678,7 +679,8 @@ typedef enum vdev_aux { VDEV_AUX_IO_FAILURE, /* experienced I/O failure */ VDEV_AUX_BAD_LOG, /* cannot read log chain(s) */ VDEV_AUX_EXTERNAL, /* external diagnosis */ - VDEV_AUX_SPLIT_POOL /* vdev was split off into another pool */ + VDEV_AUX_SPLIT_POOL, /* vdev was split off into another pool */ + VDEV_AUX_CHILDREN_OFFLINE /* all children are offline */ } vdev_aux_t; /* diff --git a/usr/src/uts/common/sys/vfs.h b/usr/src/uts/common/sys/vfs.h index 76f8214d8c..3ae530ed22 100644 --- a/usr/src/uts/common/sys/vfs.h +++ b/usr/src/uts/common/sys/vfs.h @@ -22,7 +22,7 @@ /* * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2016 Toomas Soome <tsoome@me.com> - * Copyright (c) 2016 by Delphix. All rights reserved. + * Copyright (c) 2016, 2017 by Delphix. All rights reserved. * Copyright 2016 Nexenta Systems, Inc. */ @@ -416,6 +416,7 @@ enum { #define VSW_XID 0x40 /* file system supports extended ids */ #define VSW_CANLOFI 0x80 /* file system supports lofi mounts */ #define VSW_ZMOUNT 0x100 /* file system always allowed in a zone */ +#define VSW_MOUNTDEV 0x200 /* file system is mounted via device path */ #define VSW_INSTALLED 0x8000 /* this vsw is associated with a file system */ |