aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd/zfs/zfs_main.c13
-rw-r--r--module/zfs/zfs_ioctl.c17
2 files changed, 21 insertions, 9 deletions
diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c
index 3f54985b9..cea421238 100644
--- a/cmd/zfs/zfs_main.c
+++ b/cmd/zfs/zfs_main.c
@@ -649,6 +649,11 @@ zfs_do_clone(int argc, char **argv)
if (ret == 0) {
zfs_handle_t *clone;
+ if (log_history) {
+ (void) zpool_log_history(g_zfs, history_str);
+ log_history = B_FALSE;
+ }
+
clone = zfs_open(g_zfs, argv[1], ZFS_TYPE_DATASET);
if (clone != NULL) {
if (zfs_get_type(clone) != ZFS_TYPE_VOLUME)
@@ -828,6 +833,11 @@ zfs_do_create(int argc, char **argv)
if (zfs_create(g_zfs, argv[0], type, props) != 0)
goto error;
+ if (log_history) {
+ (void) zpool_log_history(g_zfs, history_str);
+ log_history = B_FALSE;
+ }
+
if ((zhp = zfs_open(g_zfs, argv[0], ZFS_TYPE_DATASET)) == NULL)
goto error;
@@ -6481,11 +6491,12 @@ main(int argc, char **argv)
usage(B_FALSE);
ret = 1;
}
- libzfs_fini(g_zfs);
if (ret == 0 && log_history)
(void) zpool_log_history(g_zfs, history_str);
+ libzfs_fini(g_zfs);
+
/*
* The 'ZFS_ABORT' environment variable causes us to dump core on exit
* for the purposes of running ::findleaks.
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c
index bf212dee8..a061978dc 100644
--- a/module/zfs/zfs_ioctl.c
+++ b/module/zfs/zfs_ioctl.c
@@ -5558,9 +5558,9 @@ zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg)
{
zfs_cmd_t *zc;
uint_t vecnum;
- int error, rc, len, flag = 0;
+ int error, rc, len = 0, flag = 0;
const zfs_ioc_vec_t *vec;
- char *saved_poolname;
+ char *saved_poolname = NULL;
nvlist_t *innvl = NULL;
vecnum = cmd - ZFS_IOC_FIRST;
@@ -5576,7 +5576,6 @@ zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg)
return (-SET_ERROR(EINVAL));
zc = kmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP | KM_NODEBUG);
- saved_poolname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
error = ddi_copyin((void *)arg, zc, sizeof (zfs_cmd_t), flag);
if (error != 0) {
@@ -5626,9 +5625,9 @@ zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg)
goto out;
/* legacy ioctls can modify zc_name */
- (void) strlcpy(saved_poolname, zc->zc_name, sizeof (saved_poolname));
- len = strcspn(saved_poolname, "/@") + 1;
- saved_poolname[len] = '\0';
+ len = strcspn(zc->zc_name, "/@#") + 1;
+ saved_poolname = kmem_alloc(len, KM_SLEEP);
+ (void) strlcpy(saved_poolname, zc->zc_name, len);
if (vec->zvec_func != NULL) {
nvlist_t *outnvl;
@@ -5693,10 +5692,12 @@ out:
char *s = tsd_get(zfs_allow_log_key);
if (s != NULL)
strfree(s);
- (void) tsd_set(zfs_allow_log_key, strdup(saved_poolname));
+ (void) tsd_set(zfs_allow_log_key, saved_poolname);
+ } else {
+ if (saved_poolname != NULL)
+ kmem_free(saved_poolname, len);
}
- kmem_free(saved_poolname, MAXNAMELEN);
kmem_free(zc, sizeof (zfs_cmd_t));
return (-error);
}