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 <behlendorf1@llnl.gov> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Reviewed-by: Akash B <akash-b@hpe.com> Signed-off-by: Ameer Hamza <ahamza@ixsystems.com> Closes #16071
This commit is contained in:
parent
a72751a342
commit
23a489a411
|
@ -89,6 +89,7 @@
|
||||||
|
|
||||||
#include <libnvpair.h>
|
#include <libnvpair.h>
|
||||||
#include <libzutil.h>
|
#include <libzutil.h>
|
||||||
|
#include <libzfs_core.h>
|
||||||
|
|
||||||
#include <libzdb.h>
|
#include <libzdb.h>
|
||||||
|
|
||||||
|
@ -8924,6 +8925,9 @@ main(int argc, char **argv)
|
||||||
boolean_t target_is_spa = B_TRUE, dataset_lookup = B_FALSE;
|
boolean_t target_is_spa = B_TRUE, dataset_lookup = B_FALSE;
|
||||||
nvlist_t *cfg = NULL;
|
nvlist_t *cfg = NULL;
|
||||||
struct sigaction action;
|
struct sigaction action;
|
||||||
|
boolean_t force_import = B_FALSE;
|
||||||
|
boolean_t config_path_console = B_FALSE;
|
||||||
|
char pbuf[MAXPATHLEN];
|
||||||
|
|
||||||
dprintf_setup(&argc, argv);
|
dprintf_setup(&argc, argv);
|
||||||
|
|
||||||
|
@ -9094,6 +9098,7 @@ main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'U':
|
case 'U':
|
||||||
|
config_path_console = B_TRUE;
|
||||||
spa_config_path = optarg;
|
spa_config_path = optarg;
|
||||||
if (spa_config_path[0] != '/') {
|
if (spa_config_path[0] != '/') {
|
||||||
(void) fprintf(stderr,
|
(void) fprintf(stderr,
|
||||||
|
@ -9153,9 +9158,6 @@ main(int argc, char **argv)
|
||||||
*/
|
*/
|
||||||
spa_mode_readable_spacemaps = B_TRUE;
|
spa_mode_readable_spacemaps = B_TRUE;
|
||||||
|
|
||||||
kernel_init(SPA_MODE_READ);
|
|
||||||
kernel_init_done = B_TRUE;
|
|
||||||
|
|
||||||
if (dump_all)
|
if (dump_all)
|
||||||
verbose = MAX(verbose, 1);
|
verbose = MAX(verbose, 1);
|
||||||
|
|
||||||
|
@ -9174,6 +9176,53 @@ main(int argc, char **argv)
|
||||||
if (argc < 2 && dump_opt['R'])
|
if (argc < 2 && dump_opt['R'])
|
||||||
usage();
|
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 (dump_opt['E']) {
|
||||||
if (argc != 1)
|
if (argc != 1)
|
||||||
usage();
|
usage();
|
||||||
|
@ -9210,7 +9259,6 @@ main(int argc, char **argv)
|
||||||
fatal("internal error: %s", strerror(ENOMEM));
|
fatal("internal error: %s", strerror(ENOMEM));
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
target = argv[0];
|
|
||||||
|
|
||||||
if (strpbrk(target, "/@") != NULL) {
|
if (strpbrk(target, "/@") != NULL) {
|
||||||
size_t targetlen;
|
size_t targetlen;
|
||||||
|
@ -9256,9 +9304,17 @@ main(int argc, char **argv)
|
||||||
target_pool = target;
|
target_pool = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dump_opt['e']) {
|
if (dump_opt['e'] || force_import) {
|
||||||
importargs_t args = { 0 };
|
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.paths = nsearch;
|
||||||
args.path = searchdirs;
|
args.path = searchdirs;
|
||||||
args.can_be_active = B_TRUE;
|
args.can_be_active = B_TRUE;
|
||||||
|
|
|
@ -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_hold(nvlist_t *, int, nvlist_t **);
|
||||||
_LIBZFS_CORE_H int lzc_release(nvlist_t *, 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_holds(const char *, nvlist_t **);
|
||||||
|
_LIBZFS_CORE_H int lzc_get_props(const char *, nvlist_t **);
|
||||||
|
|
||||||
enum lzc_send_flags {
|
enum lzc_send_flags {
|
||||||
LZC_SEND_FLAG_EMBED_DATA = 1 << 0,
|
LZC_SEND_FLAG_EMBED_DATA = 1 << 0,
|
||||||
|
|
|
@ -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_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_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_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_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_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'/>
|
<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'/>
|
<parameter type-id='857bb57e' name='holdsp'/>
|
||||||
<return type-id='95e97e5e'/>
|
<return type-id='95e97e5e'/>
|
||||||
</function-decl>
|
</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'>
|
<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='2e711a2a' name='func'/>
|
||||||
<parameter type-id='95e97e5e' name='orig_fd'/>
|
<parameter type-id='95e97e5e' name='orig_fd'/>
|
||||||
|
|
|
@ -596,6 +596,12 @@ lzc_get_holds(const char *snapname, nvlist_t **holdsp)
|
||||||
return (lzc_ioctl(ZFS_IOC_GET_HOLDS, snapname, NULL, 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
|
static unsigned int
|
||||||
max_pipe_buffer(int infd)
|
max_pipe_buffer(int infd)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue