Print this page
2882 implement libzfs_core
2883 changing "canmount" property to "on" should not always remount dataset
2900 "zfs snapshot" should be able to create multiple, arbitrary snapshots at once
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Chris Siden <christopher.siden@delphix.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Bill Pijewski <wdp@joyent.com>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
*** 32,41 ****
--- 32,42 ----
#include <libintl.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
+ #include <libgen.h>
#include <sys/efi_partition.h>
#include <sys/vtoc.h>
#include <sys/zfs_ioctl.h>
#include <dlfcn.h>
*** 1203,1213 ****
/*
* Destroy the given pool. It is up to the caller to ensure that there are no
* datasets left in the pool.
*/
int
! zpool_destroy(zpool_handle_t *zhp)
{
zfs_cmd_t zc = { 0 };
zfs_handle_t *zfp = NULL;
libzfs_handle_t *hdl = zhp->zpool_hdl;
char msg[1024];
--- 1204,1214 ----
/*
* Destroy the given pool. It is up to the caller to ensure that there are no
* datasets left in the pool.
*/
int
! zpool_destroy(zpool_handle_t *zhp, const char *log_str)
{
zfs_cmd_t zc = { 0 };
zfs_handle_t *zfp = NULL;
libzfs_handle_t *hdl = zhp->zpool_hdl;
char msg[1024];
*** 1215,1224 ****
--- 1216,1226 ----
if (zhp->zpool_state == POOL_STATE_ACTIVE &&
(zfp = zfs_open(hdl, zhp->zpool_name, ZFS_TYPE_FILESYSTEM)) == NULL)
return (-1);
(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
+ zc.zc_history = (uint64_t)(uintptr_t)log_str;
if (zfs_ioctl(hdl, ZFS_IOC_POOL_DESTROY, &zc) != 0) {
(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
"cannot destroy '%s'"), zhp->zpool_name);
*** 1369,1390 ****
/*
* Exports the pool from the system. The caller must ensure that there are no
* mounted datasets in the pool.
*/
! int
! zpool_export_common(zpool_handle_t *zhp, boolean_t force, boolean_t hardforce)
{
zfs_cmd_t zc = { 0 };
char msg[1024];
(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
"cannot export '%s'"), zhp->zpool_name);
(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
zc.zc_cookie = force;
zc.zc_guid = hardforce;
if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_EXPORT, &zc) != 0) {
switch (errno) {
case EXDEV:
zfs_error_aux(zhp->zpool_hdl, dgettext(TEXT_DOMAIN,
--- 1371,1394 ----
/*
* Exports the pool from the system. The caller must ensure that there are no
* mounted datasets in the pool.
*/
! static int
! zpool_export_common(zpool_handle_t *zhp, boolean_t force, boolean_t hardforce,
! const char *log_str)
{
zfs_cmd_t zc = { 0 };
char msg[1024];
(void) snprintf(msg, sizeof (msg), dgettext(TEXT_DOMAIN,
"cannot export '%s'"), zhp->zpool_name);
(void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
zc.zc_cookie = force;
zc.zc_guid = hardforce;
+ zc.zc_history = (uint64_t)(uintptr_t)log_str;
if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_EXPORT, &zc) != 0) {
switch (errno) {
case EXDEV:
zfs_error_aux(zhp->zpool_hdl, dgettext(TEXT_DOMAIN,
*** 1402,1420 ****
return (0);
}
int
! zpool_export(zpool_handle_t *zhp, boolean_t force)
{
! return (zpool_export_common(zhp, force, B_FALSE));
}
int
! zpool_export_force(zpool_handle_t *zhp)
{
! return (zpool_export_common(zhp, B_TRUE, B_TRUE));
}
static void
zpool_rewind_exclaim(libzfs_handle_t *hdl, const char *name, boolean_t dryrun,
nvlist_t *config)
--- 1406,1424 ----
return (0);
}
int
! zpool_export(zpool_handle_t *zhp, boolean_t force, const char *log_str)
{
! return (zpool_export_common(zhp, force, B_FALSE, log_str));
}
int
! zpool_export_force(zpool_handle_t *zhp, const char *log_str)
{
! return (zpool_export_common(zhp, B_TRUE, B_TRUE, log_str));
}
static void
zpool_rewind_exclaim(libzfs_handle_t *hdl, const char *name, boolean_t dryrun,
nvlist_t *config)
*** 3572,3615 ****
zhp->zpool_name));
return (0);
}
void
! zpool_set_history_str(const char *subcommand, int argc, char **argv,
! char *history_str)
{
! int i;
!
! (void) strlcpy(history_str, subcommand, HIS_MAX_RECORD_LEN);
! for (i = 1; i < argc; i++) {
! if (strlen(history_str) + 1 + strlen(argv[i]) >
! HIS_MAX_RECORD_LEN)
! break;
! (void) strlcat(history_str, " ", HIS_MAX_RECORD_LEN);
! (void) strlcat(history_str, argv[i], HIS_MAX_RECORD_LEN);
}
}
- /*
- * Stage command history for logging.
- */
int
! zpool_stage_history(libzfs_handle_t *hdl, const char *history_str)
{
! if (history_str == NULL)
! return (EINVAL);
!
! if (strlen(history_str) > HIS_MAX_RECORD_LEN)
! return (EINVAL);
!
! if (hdl->libzfs_log_str != NULL)
! free(hdl->libzfs_log_str);
!
! if ((hdl->libzfs_log_str = strdup(history_str)) == NULL)
! return (no_memory(hdl));
! return (0);
}
/*
* Perform ioctl to get some command history of a pool.
*
--- 3576,3609 ----
zhp->zpool_name));
return (0);
}
void
! zfs_save_arguments(int argc, char **argv, char *string, int len)
{
! (void) strlcpy(string, basename(argv[0]), len);
! for (int i = 1; i < argc; i++) {
! (void) strlcat(string, " ", len);
! (void) strlcat(string, argv[i], len);
}
}
int
! zpool_log_history(libzfs_handle_t *hdl, const char *message)
{
! zfs_cmd_t zc = { 0 };
! nvlist_t *args;
! int err;
! args = fnvlist_alloc();
! fnvlist_add_string(args, "message", message);
! err = zcmd_write_src_nvlist(hdl, &zc, args);
! if (err == 0)
! err = ioctl(hdl->libzfs_fd, ZFS_IOC_LOG_HISTORY, &zc);
! nvlist_free(args);
! zcmd_free_nvlists(&zc);
! return (err);
}
/*
* Perform ioctl to get some command history of a pool.
*