aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmeer Hamza <[email protected]>2024-06-04 04:28:43 +0500
committerGitHub <[email protected]>2024-06-03 16:28:43 -0700
commit23a489a41167890cdd227366a5f950170df8cc9b (patch)
tree83f29e0c940e9aa2af780f401d8bc1b1a33f833e
parenta72751a34265492efc115bb6a773e961bb9be82d (diff)
zdb: detect cachefile automatically otherwise force import
If a pool is created with the cache file located in a non-default path /etc/default/zpool.cache, removed, or the cachefile property is set to none, zdb fails to show the pool unless we specify the cache file or use the -e option. This PR automates this process. Reviewed-by: Brian Behlendorf <[email protected]> Reviewed-by: Alexander Motin <[email protected]> Reviewed-by: Akash B <[email protected]> Signed-off-by: Ameer Hamza <[email protected]> Closes #16071
-rw-r--r--cmd/zdb/zdb.c66
-rw-r--r--include/libzfs_core.h1
-rw-r--r--lib/libzfs_core/libzfs_core.abi6
-rw-r--r--lib/libzfs_core/libzfs_core.c6
4 files changed, 74 insertions, 5 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
index 704fcf442..2a3d58d77 100644
--- a/cmd/zdb/zdb.c
+++ b/cmd/zdb/zdb.c
@@ -89,6 +89,7 @@
#include <libnvpair.h>
#include <libzutil.h>
+#include <libzfs_core.h>
#include <libzdb.h>
@@ -8924,6 +8925,9 @@ main(int argc, char **argv)
boolean_t target_is_spa = B_TRUE, dataset_lookup = B_FALSE;
nvlist_t *cfg = NULL;
struct sigaction action;
+ boolean_t force_import = B_FALSE;
+ boolean_t config_path_console = B_FALSE;
+ char pbuf[MAXPATHLEN];
dprintf_setup(&argc, argv);
@@ -9094,6 +9098,7 @@ main(int argc, char **argv)
}
break;
case 'U':
+ config_path_console = B_TRUE;
spa_config_path = optarg;
if (spa_config_path[0] != '/') {
(void) fprintf(stderr,
@@ -9153,9 +9158,6 @@ main(int argc, char **argv)
*/
spa_mode_readable_spacemaps = B_TRUE;
- kernel_init(SPA_MODE_READ);
- kernel_init_done = B_TRUE;
-
if (dump_all)
verbose = MAX(verbose, 1);
@@ -9174,6 +9176,53 @@ main(int argc, char **argv)
if (argc < 2 && dump_opt['R'])
usage();
+ target = argv[0];
+
+ /*
+ * Automate cachefile
+ */
+ if (!spa_config_path_env && !config_path_console && target &&
+ libzfs_core_init() == 0) {
+ char *pname = strdup(target);
+ const char *value;
+ nvlist_t *pnvl;
+ nvlist_t *vnvl;
+
+ if (strpbrk(pname, "/@") != NULL)
+ *strpbrk(pname, "/@") = '\0';
+
+ if (pname && lzc_get_props(pname, &pnvl) == 0) {
+ if (nvlist_lookup_nvlist(pnvl, "cachefile",
+ &vnvl) == 0) {
+ value = fnvlist_lookup_string(vnvl,
+ ZPROP_VALUE);
+ } else {
+ value = "-";
+ }
+ strlcpy(pbuf, value, sizeof (pbuf));
+ if (pbuf[0] != '\0') {
+ if (pbuf[0] == '/') {
+ if (access(pbuf, F_OK) == 0)
+ spa_config_path = pbuf;
+ else
+ force_import = B_TRUE;
+ } else if ((strcmp(pbuf, "-") == 0 &&
+ access(ZPOOL_CACHE, F_OK) != 0) ||
+ strcmp(pbuf, "none") == 0) {
+ force_import = B_TRUE;
+ }
+ }
+ nvlist_free(vnvl);
+ }
+
+ free(pname);
+ nvlist_free(pnvl);
+ libzfs_core_fini();
+ }
+
+ kernel_init(SPA_MODE_READ);
+ kernel_init_done = B_TRUE;
+
if (dump_opt['E']) {
if (argc != 1)
usage();
@@ -9210,7 +9259,6 @@ main(int argc, char **argv)
fatal("internal error: %s", strerror(ENOMEM));
error = 0;
- target = argv[0];
if (strpbrk(target, "/@") != NULL) {
size_t targetlen;
@@ -9256,9 +9304,17 @@ main(int argc, char **argv)
target_pool = target;
}
- if (dump_opt['e']) {
+ if (dump_opt['e'] || force_import) {
importargs_t args = { 0 };
+ /*
+ * If path is not provided, search in /dev
+ */
+ if (searchdirs == NULL) {
+ searchdirs = umem_alloc(sizeof (char *), UMEM_NOFAIL);
+ searchdirs[nsearch++] = (char *)ZFS_DEVDIR;
+ }
+
args.paths = nsearch;
args.path = searchdirs;
args.can_be_active = B_TRUE;
diff --git a/include/libzfs_core.h b/include/libzfs_core.h
index 867c18b9c..b2fd97372 100644
--- a/include/libzfs_core.h
+++ b/include/libzfs_core.h
@@ -77,6 +77,7 @@ _LIBZFS_CORE_H int lzc_snaprange_space(const char *, const char *, uint64_t *);
_LIBZFS_CORE_H int lzc_hold(nvlist_t *, int, nvlist_t **);
_LIBZFS_CORE_H int lzc_release(nvlist_t *, nvlist_t **);
_LIBZFS_CORE_H int lzc_get_holds(const char *, nvlist_t **);
+_LIBZFS_CORE_H int lzc_get_props(const char *, nvlist_t **);
enum lzc_send_flags {
LZC_SEND_FLAG_EMBED_DATA = 1 << 0,
diff --git a/lib/libzfs_core/libzfs_core.abi b/lib/libzfs_core/libzfs_core.abi
index cf9d6bddc..c20698580 100644
--- a/lib/libzfs_core/libzfs_core.abi
+++ b/lib/libzfs_core/libzfs_core.abi
@@ -168,6 +168,7 @@
<elf-symbol name='lzc_get_bookmarks' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='lzc_get_bootenv' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='lzc_get_holds' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+ <elf-symbol name='lzc_get_props' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='lzc_get_vdev_prop' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='lzc_hold' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='lzc_initialize' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -2694,6 +2695,11 @@
<parameter type-id='857bb57e' name='holdsp'/>
<return type-id='95e97e5e'/>
</function-decl>
+ <function-decl name='lzc_get_props' mangled-name='lzc_get_props' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_get_props'>
+ <parameter type-id='80f4b756' name='poolname'/>
+ <parameter type-id='857bb57e' name='props'/>
+ <return type-id='95e97e5e'/>
+ </function-decl>
<function-decl name='lzc_send_wrapper' mangled-name='lzc_send_wrapper' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzc_send_wrapper'>
<parameter type-id='2e711a2a' name='func'/>
<parameter type-id='95e97e5e' name='orig_fd'/>
diff --git a/lib/libzfs_core/libzfs_core.c b/lib/libzfs_core/libzfs_core.c
index 01d803e21..070f8c1be 100644
--- a/lib/libzfs_core/libzfs_core.c
+++ b/lib/libzfs_core/libzfs_core.c
@@ -596,6 +596,12 @@ lzc_get_holds(const char *snapname, nvlist_t **holdsp)
return (lzc_ioctl(ZFS_IOC_GET_HOLDS, snapname, NULL, holdsp));
}
+int
+lzc_get_props(const char *poolname, nvlist_t **props)
+{
+ return (lzc_ioctl(ZFS_IOC_POOL_GET_PROPS, poolname, NULL, props));
+}
+
static unsigned int
max_pipe_buffer(int infd)
{