mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Add libzutil for libzfs or libzpool consumers
Adds a libzutil for utility functions that are common to libzfs and libzpool consumers (most of what was in libzfs_import.c). This removes the need for utilities to link against both libzpool and libzfs. Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Don Brady <don.brady@delphix.com> Closes #8050
This commit is contained in:
committed by
Brian Behlendorf
parent
6644e5bb6e
commit
e89f1295d4
@@ -36,6 +36,7 @@
|
||||
#include <thread_pool.h>
|
||||
|
||||
#include <libzfs.h>
|
||||
#include <libzutil.h>
|
||||
#include <sys/zfs_context.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
|
||||
+41
-4
@@ -64,6 +64,7 @@
|
||||
#include <math.h>
|
||||
|
||||
#include <libzfs.h>
|
||||
#include <libzutil.h>
|
||||
|
||||
#include "zpool_util.h"
|
||||
#include "zfs_comutil.h"
|
||||
@@ -2533,6 +2534,40 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts,
|
||||
return (ret);
|
||||
}
|
||||
|
||||
typedef struct target_exists_args {
|
||||
const char *poolname;
|
||||
uint64_t poolguid;
|
||||
} target_exists_args_t;
|
||||
|
||||
static int
|
||||
name_or_guid_exists(zpool_handle_t *zhp, void *data)
|
||||
{
|
||||
target_exists_args_t *args = data;
|
||||
nvlist_t *config = zpool_get_config(zhp, NULL);
|
||||
int found = 0;
|
||||
|
||||
if (config == NULL)
|
||||
return (0);
|
||||
|
||||
if (args->poolname != NULL) {
|
||||
char *pool_name;
|
||||
|
||||
verify(nvlist_lookup_string(config, ZPOOL_CONFIG_POOL_NAME,
|
||||
&pool_name) == 0);
|
||||
if (strcmp(pool_name, args->poolname) == 0)
|
||||
found = 1;
|
||||
} else {
|
||||
uint64_t pool_guid;
|
||||
|
||||
verify(nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID,
|
||||
&pool_guid) == 0);
|
||||
if (pool_guid == args->poolguid)
|
||||
found = 1;
|
||||
}
|
||||
zpool_close(zhp);
|
||||
|
||||
return (found);
|
||||
}
|
||||
/*
|
||||
* zpool checkpoint <pool>
|
||||
* checkpoint --discard <pool>
|
||||
@@ -2685,6 +2720,7 @@ zpool_do_import(int argc, char **argv)
|
||||
boolean_t do_rewind = B_FALSE;
|
||||
boolean_t xtreme_rewind = B_FALSE;
|
||||
boolean_t do_scan = B_FALSE;
|
||||
boolean_t pool_exists = B_FALSE;
|
||||
uint64_t pool_state, txg = -1ULL;
|
||||
char *cachefile = NULL;
|
||||
importargs_t idata = { 0 };
|
||||
@@ -2892,7 +2928,8 @@ zpool_do_import(int argc, char **argv)
|
||||
/*
|
||||
* User specified a name or guid. Ensure it's unique.
|
||||
*/
|
||||
idata.unique = B_TRUE;
|
||||
target_exists_args_t search = {searchname, searchguid};
|
||||
pool_exists = zpool_iter(g_zfs, name_or_guid_exists, &search);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2928,9 +2965,9 @@ zpool_do_import(int argc, char **argv)
|
||||
idata.scan = do_scan;
|
||||
idata.policy = policy;
|
||||
|
||||
pools = zpool_search_import(g_zfs, &idata);
|
||||
pools = zpool_search_import(g_zfs, &idata, &libzfs_config_ops);
|
||||
|
||||
if (pools != NULL && idata.exists &&
|
||||
if (pools != NULL && pool_exists &&
|
||||
(argc == 1 || strcmp(argv[0], argv[1]) == 0)) {
|
||||
(void) fprintf(stderr, gettext("cannot import '%s': "
|
||||
"a pool with that name already exists\n"),
|
||||
@@ -2939,7 +2976,7 @@ zpool_do_import(int argc, char **argv)
|
||||
"<pool | id> <newpool>' to give it a new name\n"),
|
||||
"zpool import");
|
||||
err = 1;
|
||||
} else if (pools == NULL && idata.exists) {
|
||||
} else if (pools == NULL && pool_exists) {
|
||||
(void) fprintf(stderr, gettext("cannot import '%s': "
|
||||
"a pool with that name is already created/imported,\n"),
|
||||
argv[0]);
|
||||
|
||||
@@ -69,6 +69,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <libintl.h>
|
||||
#include <libnvpair.h>
|
||||
#include <libzutil.h>
|
||||
#include <limits.h>
|
||||
#include <sys/spa.h>
|
||||
#include <scsi/scsi.h>
|
||||
|
||||
Reference in New Issue
Block a user