-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rescan enclosure sysfs path on import
When you create a pool, zfs writes vd->vdev_enc_sysfs_path with the enclosure sysfs path to the fault LEDs, like: vdev_enc_sysfs_path = /sys/class/enclosure/0:0:1:0/SLOT8 However, this enclosure path doesn't get updated on successive imports even if enclosure path to the disk changes. This patch fixes the issue. The largest part of this patch is moving for_each_vdev_vdev() and associated function from zpool_iter.c to libzfs_internal. This was needed to make those functions visible to the cache import codepath for sysfs path re-scan. libzfs_internal is for code that is used by both the libraries and the cmd/ code, but that we don't want to export with the ABI. Signed-off-by: Tony Hutter <hutter2@llnl.gov> Fixes: #11950
- Loading branch information
1 parent
b9ec4a1
commit 6e99ea8
Showing
18 changed files
with
238 additions
and
92 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
#ifndef _LIBZUTIL_INTERNAL | ||
#define _LIBZUTIL_INTERNAL | ||
|
||
#include <libzfs.h> | ||
|
||
/* Vdev list functions */ | ||
typedef int (*pool_vdev_iter_f)(zpool_handle_t *, nvlist_t *, void *); | ||
extern int for_each_vdev(zpool_handle_t *zhp, pool_vdev_iter_f func, | ||
void *data); | ||
extern int for_each_vdev_in_nvlist(nvlist_t *nvroot, pool_vdev_iter_f func, | ||
void *data); | ||
|
||
/* Only used by libzfs_config.c */ | ||
nvlist_t * | ||
zpool_get_config_impl(zpool_handle_t *zhp, nvlist_t **oldconfig); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# | ||
# libzfs_internal is library that contains functions that are common to both | ||
# userspace code (like zpool_main.c) and to the libraries themselves, but | ||
# are not exported as in the ABI. | ||
# | ||
include $(top_srcdir)/config/Rules.am | ||
|
||
DEFAULT_INCLUDES += -I$(srcdir) -I$(top_srcdir)/lib/libzfs | ||
|
||
lib_LTLIBRARIES = libzfs_internal.la | ||
|
||
dist_libzfs_internal_la_SOURCES = \ | ||
libzfs_internal.c | ||
|
||
libzfs_internal_la_LIBADD = \ | ||
$(abs_top_builddir)/lib/libnvpair/libnvpair.la | ||
|
||
include $(top_srcdir)/config/CppCheck.am |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
#include <sys/fs/zfs.h> | ||
#include <libzutil.h> | ||
#include <libzfs.h> | ||
#include <libzfs_impl.h> | ||
#include <libzfs_internal.h> | ||
|
||
/* | ||
* We want to call zpool_get_config() in this file, but that requires linking | ||
* against libzfs... which requires this file as a dependency. We can't | ||
* just move zpool_get_config() to this file, since zpool_get_config() is part | ||
* of the ABI, and wouldn't get exposed here. | ||
* | ||
* To get around this, we add the zpool_get_config_impl() dummy function which | ||
* we can call directly in this file, and then update zpool_get_config() to | ||
* call zpool_get_config_impl(). | ||
*/ | ||
nvlist_t * | ||
zpool_get_config_impl(zpool_handle_t *zhp, nvlist_t **oldconfig) | ||
{ | ||
if (oldconfig) | ||
*oldconfig = zhp->zpool_old_config; | ||
return (zhp->zpool_config); | ||
} | ||
|
||
static int | ||
for_each_vdev_cb(zpool_handle_t *zhp, nvlist_t *nv, pool_vdev_iter_f func, | ||
void *data) | ||
{ | ||
nvlist_t **child; | ||
uint_t c, children; | ||
int ret = 0; | ||
int i; | ||
char *type; | ||
|
||
const char *list[] = { | ||
ZPOOL_CONFIG_SPARES, | ||
ZPOOL_CONFIG_L2CACHE, | ||
ZPOOL_CONFIG_CHILDREN | ||
}; | ||
|
||
for (i = 0; i < ARRAY_SIZE(list); i++) { | ||
if (nvlist_lookup_nvlist_array(nv, list[i], &child, | ||
&children) == 0) { | ||
for (c = 0; c < children; c++) { | ||
uint64_t ishole = 0; | ||
|
||
(void) nvlist_lookup_uint64(child[c], | ||
ZPOOL_CONFIG_IS_HOLE, &ishole); | ||
|
||
if (ishole) | ||
continue; | ||
|
||
ret |= for_each_vdev_cb(zhp, child[c], func, | ||
data); | ||
} | ||
} | ||
} | ||
|
||
if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0) | ||
return (ret); | ||
|
||
/* Don't run our function on root vdevs */ | ||
if (strcmp(type, VDEV_TYPE_ROOT) != 0) { | ||
ret |= func(zhp, nv, data); | ||
} | ||
|
||
return (ret); | ||
} | ||
|
||
/* | ||
* This is the equivalent of for_each_pool() for vdevs. It iterates through | ||
* all vdevs in the pool, ignoring root vdevs and holes, calling func() on | ||
* each one. | ||
* | ||
* @zhp: Zpool handle | ||
* @func: Function to call on each vdev | ||
* @data: Custom data to pass to the function | ||
*/ | ||
int | ||
for_each_vdev(zpool_handle_t *zhp, pool_vdev_iter_f func, void *data) | ||
{ | ||
nvlist_t *config, *nvroot = NULL; | ||
|
||
if ((config = zpool_get_config_impl(zhp, NULL)) != NULL) { | ||
verify(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, | ||
&nvroot) == 0); | ||
} | ||
return (for_each_vdev_cb(zhp, nvroot, func, data)); | ||
} | ||
|
||
/* | ||
* Given an ZPOOL_CONFIG_VDEV_TREE nvpair, iterate over all the vdevs, calling | ||
* func() for each one. func() is passed the vdev's nvlist and an optional | ||
* user-defined 'data' pointer. | ||
*/ | ||
int | ||
for_each_vdev_in_nvlist(nvlist_t *nvroot, pool_vdev_iter_f func, void *data) | ||
{ | ||
return (for_each_vdev_cb(NULL, nvroot, func, data)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -247,3 +247,8 @@ zfs_dev_flush(int fd __unused) | |
{ | ||
return (0); | ||
} | ||
|
||
void | ||
update_vdevs_config_dev_sysfs_path(nvlist_t *config) | ||
{ | ||
} |
Oops, something went wrong.