svn commit: r329781 - vendor-sys/illumos/dist/uts/common/fs/zfs vendor/illumos/dist/lib/libzfs/common

Alexander Motin mav at FreeBSD.org
Thu Feb 22 01:30:04 UTC 2018


Author: mav
Date: Thu Feb 22 01:30:03 2018
New Revision: 329781
URL: https://svnweb.freebsd.org/changeset/base/329781

Log:
  8942 zfs promote .../%recv should be an error
  
  illumos/illumos-gate at add927f8c8d101e16c23eb9cd270be4fd7edf7d5
  
  Reported on the ZFSonLinux https://github.com/zfsonlinux/zfs/issues/4843,
  fixed by https://github.com/zfsonlinux/zfs/pull/6339:
  
  If we are in the middle of an incremental zfs receive, the child .../%recv
  will exist. If you concurrently run zfs promote .../%recv, it will "work",
  but then zfs gets confused. For example, there's no obvious way to destroy
  the containing filesystem (because it is now a clone of its invisible child).
  
  Attempting to do this promote should be an error. We could fix this by
  having zfs_ioc_promote() check if zc_name contains a %, similar to
  zfs_ioc_rename().
  
  Reviewed by: Paul Dagnelie <pcd at delphix.com>
  Reviewed by: Matthew Ahrens <mahrens at delphix.com>
  Approved by: Dan McDonald <danmcd at joyent.com>
  Author: loli10K <ezomori.nozomu at gmail.com>

Modified:
  vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c

Changes in other areas also in this revision:
Modified:
  vendor/illumos/dist/lib/libzfs/common/libzfs_dataset.c

Modified: vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c
==============================================================================
--- vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c	Thu Feb 22 01:25:28 2018	(r329780)
+++ vendor-sys/illumos/dist/uts/common/fs/zfs/zfs_ioctl.c	Thu Feb 22 01:30:03 2018	(r329781)
@@ -3758,9 +3758,12 @@ zfs_ioc_rename(zfs_cmd_t *zc)
 	boolean_t recursive = zc->zc_cookie & 1;
 	char *at;
 
+	/* "zfs rename" from and to ...%recv datasets should both fail */
+	zc->zc_name[sizeof (zc->zc_name) - 1] = '\0';
 	zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
-	if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
-	    strchr(zc->zc_value, '%'))
+	if (dataset_namecheck(zc->zc_name, NULL, NULL) != 0 ||
+	    dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
+	    strchr(zc->zc_name, '%') || strchr(zc->zc_value, '%'))
 		return (SET_ERROR(EINVAL));
 
 	at = strchr(zc->zc_name, '@');
@@ -4782,6 +4785,11 @@ zfs_ioc_promote(zfs_cmd_t *zc)
 	char origin[ZFS_MAX_DATASET_NAME_LEN];
 	char *cp;
 	int error;
+
+	zc->zc_name[sizeof (zc->zc_name) - 1] = '\0';
+	if (dataset_namecheck(zc->zc_name, NULL, NULL) != 0 ||
+	    strchr(zc->zc_name, '%'))
+		return (SET_ERROR(EINVAL));
 
 	error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
 	if (error != 0)


More information about the svn-src-all mailing list