diff options
author | David Quigley <[email protected]> | 2017-09-18 18:06:40 -0600 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2017-09-18 17:06:40 -0700 |
commit | a9a2bf71520ffb5668c9204db5c7df0445dc912a (patch) | |
tree | e0f60e10e5ae4d751b6792e05de771037a91bc9b /cmd/zed | |
parent | ea49beba66106dcb272b43323fad147df1df13fd (diff) |
Remove FRU and LIBTOPO Support
FRU and LIBTOPO support are illumos only features that will not be ported to
Linux and make the code more complicated than necessary. This commit
makes way for further cleanups of the zed/FMA code.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: David Quigley <[email protected]>
Closes #6641
Diffstat (limited to 'cmd/zed')
-rw-r--r-- | cmd/zed/agents/zfs_diagnosis.c | 63 | ||||
-rw-r--r-- | cmd/zed/agents/zfs_retire.c | 152 |
2 files changed, 10 insertions, 205 deletions
diff --git a/cmd/zed/agents/zfs_diagnosis.c b/cmd/zed/agents/zfs_diagnosis.c index 704873499..49e3e1660 100644 --- a/cmd/zed/agents/zfs_diagnosis.c +++ b/cmd/zed/agents/zfs_diagnosis.c @@ -377,11 +377,6 @@ zfs_case_solve(fmd_hdl_t *hdl, zfs_case_t *zcp, const char *faultname, nvlist_t *detector, *fault; boolean_t serialize; nvlist_t *fru = NULL; -#ifdef HAVE_LIBTOPO - nvlist_t *fmri; - topo_hdl_t *thp; - int err; -#endif fmd_hdl_debug(hdl, "solving fault '%s'", faultname); /* @@ -400,64 +395,6 @@ zfs_case_solve(fmd_hdl_t *hdl, zfs_case_t *zcp, const char *faultname, zcp->zc_data.zc_vdev_guid); } -#ifdef HAVE_LIBTOPO - /* - * We also want to make sure that the detector (pool or vdev) properly - * reflects the diagnosed state, when the fault corresponds to internal - * ZFS state (i.e. not checksum or I/O error-induced). Otherwise, a - * device which was unavailable early in boot (because the driver/file - * wasn't available) and is now healthy will be mis-diagnosed. - */ - if (!fmd_nvl_fmri_present(hdl, detector) || - (checkunusable && !fmd_nvl_fmri_unusable(hdl, detector))) { - fmd_case_close(hdl, zcp->zc_case); - nvlist_free(detector); - return; - } - - - fru = NULL; - if (zcp->zc_fru != NULL && - (thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION)) != NULL) { - /* - * If the vdev had an associated FRU, then get the FRU nvlist - * from the topo handle and use that in the suspect list. We - * explicitly lookup the FRU because the fmri reported from the - * kernel may not have up to date details about the disk itself - * (serial, part, etc). - */ - if (topo_fmri_str2nvl(thp, zcp->zc_fru, &fmri, &err) == 0) { - libzfs_handle_t *zhdl = fmd_hdl_getspecific(hdl); - - /* - * If the disk is part of the system chassis, but the - * FRU indicates a different chassis ID than our - * current system, then ignore the error. This - * indicates that the device was part of another - * cluster head, and for obvious reasons cannot be - * imported on this system. - */ - if (libzfs_fru_notself(zhdl, zcp->zc_fru)) { - fmd_case_close(hdl, zcp->zc_case); - nvlist_free(fmri); - fmd_hdl_topo_rele(hdl, thp); - nvlist_free(detector); - return; - } - - /* - * If the device is no longer present on the system, or - * topo_fmri_fru() fails for other reasons, then fall - * back to the fmri specified in the vdev. - */ - if (topo_fmri_fru(thp, fmri, &fru, &err) != 0) - fru = fmd_nvl_dup(hdl, fmri, FMD_SLEEP); - nvlist_free(fmri); - } - - fmd_hdl_topo_rele(hdl, thp); - } -#endif fault = fmd_nvl_create_fault(hdl, faultname, 100, detector, fru, detector); fmd_case_add_suspect(hdl, zcp->zc_case, fault); diff --git a/cmd/zed/agents/zfs_retire.c b/cmd/zed/agents/zfs_retire.c index c1349fb30..f69c583f0 100644 --- a/cmd/zed/agents/zfs_retire.c +++ b/cmd/zed/agents/zfs_retire.c @@ -71,7 +71,6 @@ zfs_retire_clear_data(fmd_hdl_t *hdl, zfs_retire_data_t *zdp) */ typedef struct find_cbdata { uint64_t cb_guid; - const char *cb_fru; zpool_handle_t *cb_zhp; nvlist_t *cb_vdev; } find_cbdata_t; @@ -95,26 +94,18 @@ find_pool(zpool_handle_t *zhp, void *data) * Find a vdev within a tree with a matching GUID. */ static nvlist_t * -find_vdev(libzfs_handle_t *zhdl, nvlist_t *nv, const char *search_fru, - uint64_t search_guid) +find_vdev(libzfs_handle_t *zhdl, nvlist_t *nv, uint64_t search_guid) { uint64_t guid; nvlist_t **child; uint_t c, children; nvlist_t *ret; - char *fru; - - if (search_fru != NULL) { - if (nvlist_lookup_string(nv, ZPOOL_CONFIG_FRU, &fru) == 0 && - libzfs_fru_compare(zhdl, fru, search_fru)) - return (nv); - } else { - if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 && - guid == search_guid) { - fmd_hdl_debug(fmd_module_hdl("zfs-retire"), - "matched vdev %llu", guid); - return (nv); - } + + if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) == 0 && + guid == search_guid) { + fmd_hdl_debug(fmd_module_hdl("zfs-retire"), + "matched vdev %llu", guid); + return (nv); } if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN, @@ -122,8 +113,7 @@ find_vdev(libzfs_handle_t *zhdl, nvlist_t *nv, const char *search_fru, return (NULL); for (c = 0; c < children; c++) { - if ((ret = find_vdev(zhdl, child[c], search_fru, - search_guid)) != NULL) + if ((ret = find_vdev(zhdl, child[c], search_guid)) != NULL) return (ret); } @@ -132,8 +122,7 @@ find_vdev(libzfs_handle_t *zhdl, nvlist_t *nv, const char *search_fru, return (NULL); for (c = 0; c < children; c++) { - if ((ret = find_vdev(zhdl, child[c], search_fru, - search_guid)) != NULL) + if ((ret = find_vdev(zhdl, child[c], search_guid)) != NULL) return (ret); } @@ -167,8 +156,7 @@ find_by_guid(libzfs_handle_t *zhdl, uint64_t pool_guid, uint64_t vdev_guid, } if (vdev_guid != 0) { - if ((*vdevp = find_vdev(zhdl, nvroot, NULL, - vdev_guid)) == NULL) { + if ((*vdevp = find_vdev(zhdl, nvroot, vdev_guid)) == NULL) { zpool_close(zhp); return (NULL); } @@ -177,49 +165,6 @@ find_by_guid(libzfs_handle_t *zhdl, uint64_t pool_guid, uint64_t vdev_guid, return (zhp); } -#ifdef HAVE_LIBTOPO -static int -search_pool(zpool_handle_t *zhp, void *data) -{ - find_cbdata_t *cbp = data; - nvlist_t *config; - nvlist_t *nvroot; - - config = zpool_get_config(zhp, NULL); - if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, - &nvroot) != 0) { - zpool_close(zhp); - return (0); - } - - if ((cbp->cb_vdev = find_vdev(zpool_get_handle(zhp), nvroot, - cbp->cb_fru, 0)) != NULL) { - cbp->cb_zhp = zhp; - return (1); - } - - zpool_close(zhp); - return (0); -} - -/* - * Given a FRU FMRI, find the matching pool and vdev. - */ -static zpool_handle_t * -find_by_fru(libzfs_handle_t *zhdl, const char *fru, nvlist_t **vdevp) -{ - find_cbdata_t cb; - - cb.cb_fru = fru; - cb.cb_zhp = NULL; - if (zpool_iter(zhdl, search_pool, &cb) != 1) - return (NULL); - - *vdevp = cb.cb_vdev; - return (cb.cb_zhp); -} -#endif /* HAVE_LIBTOPO */ - /* * Given a vdev, attempt to replace it with every known spare until one * succeeds. @@ -289,10 +234,6 @@ zfs_vdev_repair(fmd_hdl_t *hdl, nvlist_t *nvl) zfs_retire_data_t *zdp = fmd_hdl_getspecific(hdl); zfs_retire_repaired_t *zrp; uint64_t pool_guid, vdev_guid; -#ifdef HAVE_LIBTOPO - nvlist_t *asru; -#endif - if (nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_ZFS_POOL_GUID, &pool_guid) != 0 || nvlist_lookup_uint64(nvl, FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID, &vdev_guid) != 0) @@ -315,47 +256,6 @@ zfs_vdev_repair(fmd_hdl_t *hdl, nvlist_t *nvl) return; } -#ifdef HAVE_LIBTOPO - asru = fmd_nvl_alloc(hdl, FMD_SLEEP); - - (void) nvlist_add_uint8(asru, FM_VERSION, ZFS_SCHEME_VERSION0); - (void) nvlist_add_string(asru, FM_FMRI_SCHEME, FM_FMRI_SCHEME_ZFS); - (void) nvlist_add_uint64(asru, FM_FMRI_ZFS_POOL, pool_guid); - (void) nvlist_add_uint64(asru, FM_FMRI_ZFS_VDEV, vdev_guid); - - /* - * We explicitly check for the unusable state here to make sure we - * aren't responding to a transient state change. As part of opening a - * vdev, it's possible to see the 'statechange' event, only to be - * followed by a vdev failure later. If we don't check the current - * state of the vdev (or pool) before marking it repaired, then we risk - * generating spurious repair events followed immediately by the same - * diagnosis. - * - * This assumes that the ZFS scheme code associated unusable (i.e. - * isolated) with its own definition of faulty state. In the case of a - * DEGRADED leaf vdev (due to checksum errors), this is not the case. - * This works, however, because the transient state change is not - * posted in this case. This could be made more explicit by not - * relying on the scheme's unusable callback and instead directly - * checking the vdev state, where we could correctly account for - * DEGRADED state. - */ - if (!fmd_nvl_fmri_unusable(hdl, asru) && fmd_nvl_fmri_has_fault(hdl, - asru, FMD_HAS_FAULT_ASRU, NULL)) { - topo_hdl_t *thp; - char *fmri = NULL; - int err; - - thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION); - if (topo_fmri_nvl2str(thp, asru, &fmri, &err) == 0) - (void) fmd_repair_asru(hdl, fmri); - fmd_hdl_topo_rele(hdl, thp); - - topo_hdl_strfree(thp, fmri); - } - nvlist_free(asru); -#endif zrp = fmd_hdl_alloc(hdl, sizeof (zfs_retire_repaired_t), FMD_SLEEP); zrp->zrr_next = zdp->zrd_repaired; zrp->zrr_pool = pool_guid; @@ -477,39 +377,7 @@ zfs_retire_recv(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, } if (is_disk) { -#ifdef HAVE_LIBTOPO - /* - * This is a disk fault. Lookup the FRU, convert it to - * an FMRI string, and attempt to find a matching vdev. - */ - if (nvlist_lookup_nvlist(fault, FM_FAULT_FRU, - &fru) != 0 || - nvlist_lookup_string(fru, FM_FMRI_SCHEME, - &scheme) != 0) - continue; - - if (strcmp(scheme, FM_FMRI_SCHEME_HC) != 0) - continue; - - thp = fmd_hdl_topo_hold(hdl, TOPO_VERSION); - if (topo_fmri_nvl2str(thp, fru, &fmri, &err) != 0) { - fmd_hdl_topo_rele(hdl, thp); - continue; - } - - zhp = find_by_fru(zhdl, fmri, &vdev); - topo_hdl_strfree(thp, fmri); - fmd_hdl_topo_rele(hdl, thp); - - if (zhp == NULL) - continue; - - (void) nvlist_lookup_uint64(vdev, - ZPOOL_CONFIG_GUID, &vdev_guid); - aux = VDEV_AUX_EXTERNAL; -#else continue; -#endif } else { /* * This is a ZFS fault. Lookup the resource, and |