diff options
| author | George Wilson <george.wilson@delphix.com> | 2018-03-09 21:05:20 -0500 |
|---|---|---|
| committer | Prakash Surya <prakash.surya@delphix.com> | 2018-04-25 15:29:05 -0700 |
| commit | 094e47e980b0796b94b1b8f51f462a64d246e516 (patch) | |
| tree | 4f35dc339d9435a2a8a52f927e877e74371dcd42 /usr/src/lib/libzfs_core | |
| parent | 5850749aaf781e7f284cedc8429eb16adf367802 (diff) | |
| download | illumos-joyent-094e47e980b0796b94b1b8f51f462a64d246e516.tar.gz | |
9102 zfs should be able to initialize storage devices
Reviewed by: John Wren Kennedy <john.kennedy@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
Diffstat (limited to 'usr/src/lib/libzfs_core')
| -rw-r--r-- | usr/src/lib/libzfs_core/common/libzfs_core.c | 37 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_core/common/libzfs_core.h | 4 | ||||
| -rw-r--r-- | usr/src/lib/libzfs_core/common/mapfile-vers | 7 |
3 files changed, 48 insertions, 0 deletions
diff --git a/usr/src/lib/libzfs_core/common/libzfs_core.c b/usr/src/lib/libzfs_core/common/libzfs_core.c index d09304fbbb..ac25820c61 100644 --- a/usr/src/lib/libzfs_core/common/libzfs_core.c +++ b/usr/src/lib/libzfs_core/common/libzfs_core.c @@ -1038,3 +1038,40 @@ lzc_channel_program_nosync(const char *pool, const char *program, return (lzc_channel_program_impl(pool, program, B_FALSE, timeout, memlimit, argnvl, outnvl)); } + +/* + * Changes initializing state. + * + * vdevs should be a list of (<key>, guid) where guid is a uint64 vdev GUID. + * The key is ignored. + * + * If there are errors related to vdev arguments, per-vdev errors are returned + * in an nvlist with the key "vdevs". Each error is a (guid, errno) pair where + * guid is stringified with PRIu64, and errno is one of the following as + * an int64_t: + * - ENODEV if the device was not found + * - EINVAL if the devices is not a leaf or is not concrete (e.g. missing) + * - EROFS if the device is not writeable + * - EBUSY start requested but the device is already being initialized + * - ESRCH cancel/suspend requested but device is not being initialized + * + * If the errlist is empty, then return value will be: + * - EINVAL if one or more arguments was invalid + * - Other spa_open failures + * - 0 if the operation succeeded + */ +int +lzc_initialize(const char *poolname, pool_initialize_func_t cmd_type, + nvlist_t *vdevs, nvlist_t **errlist) +{ + int error; + nvlist_t *args = fnvlist_alloc(); + fnvlist_add_uint64(args, ZPOOL_INITIALIZE_COMMAND, (uint64_t)cmd_type); + fnvlist_add_nvlist(args, ZPOOL_INITIALIZE_VDEVS, vdevs); + + error = lzc_ioctl(ZFS_IOC_POOL_INITIALIZE, poolname, args, errlist); + + fnvlist_free(args); + + return (error); +} diff --git a/usr/src/lib/libzfs_core/common/libzfs_core.h b/usr/src/lib/libzfs_core/common/libzfs_core.h index 8c6743f503..d4a9a49cc1 100644 --- a/usr/src/lib/libzfs_core/common/libzfs_core.h +++ b/usr/src/lib/libzfs_core/common/libzfs_core.h @@ -31,6 +31,8 @@ #include <libnvpair.h> #include <sys/param.h> #include <sys/types.h> +#include <sys/fs/zfs.h> + #ifdef __cplusplus extern "C" { @@ -56,6 +58,8 @@ int lzc_destroy_snaps(nvlist_t *, boolean_t, nvlist_t **); int lzc_bookmark(nvlist_t *, nvlist_t **); int lzc_get_bookmarks(const char *, nvlist_t *, nvlist_t **); int lzc_destroy_bookmarks(nvlist_t *, nvlist_t **); +int lzc_initialize(const char *, pool_initialize_func_t, nvlist_t *, + nvlist_t **); int lzc_snaprange_space(const char *, const char *, uint64_t *); diff --git a/usr/src/lib/libzfs_core/common/mapfile-vers b/usr/src/lib/libzfs_core/common/mapfile-vers index 7f63f041b6..588eb76e97 100644 --- a/usr/src/lib/libzfs_core/common/mapfile-vers +++ b/usr/src/lib/libzfs_core/common/mapfile-vers @@ -37,6 +37,13 @@ $mapfile_version 2 +SYMBOL_VERSION ILLUMOS_0.3 { + global: + + lzc_initialize; +} ILLUMOS_0.1; + + SYMBOL_VERSION ILLUMOS_0.2 { global: |
