FreeBSD/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
/*
 * zpool split [-n] [-o prop=val] ...
 *		[-o mntopt] ...
 *		[-R altroot] <pool> <newpool> [<device> ...]
 *
 *	-n	Do not split the pool, but display the resulting layout if
 *		it were to be split.
 *	-o	Set property=value, or set mount options.
 *	-R	Mount the split-off pool under an alternate root.
 *
 * Splits the named pool and gives it the new pool name.  Devices to be split
 * off may be listed, provided that no more than one device is specified
 * per top-level vdev mirror.  The newly split pool is left in an exported
 * state unless -R is specified.
 *
 * Restrictions: the top-level of the pool pool must only be made up of
 * mirrors; all devices in the pool must be healthy; no device may be
 * undergoing a resilvering operation.
 */
zpool split [-n] [-o prop=val]
[-o mntopt]
[-R altroot]   [ ...]

-n      Do not split the pool, but display the resulting layout if
it were to be split.
-o      Set property=value, or set mount options.
-R      Mount the split-off pool under an alternate root.

Splits the named pool and gives it the new pool name.  Devices to be split
off may be listed, provided that no more than one device is specified
per top-level vdev mirror.  The newly split pool is left in an exported
state unless -R is specified.

the top-level of the pool pool must only be made up of
mirrors; all devices in the pool must be healthy; no device may be
undergoing a resilvering operation.
zpool split [ - n ] [ - o prop = val ] [ - o mntopt ] [ - R altroot ] [ ... ] - n Do not split the pool but display the resulting layout if it were to be split . - o Set property = value or set mount options . - R Mount the split - off pool under an alternate root . Splits the named pool and gives it the new pool name . Devices to be split off may be listed provided that no more than one device is specified per top - level vdev mirror . The newly split pool is left in an exported state unless - R is specified . the top - level of the pool pool must only be made up of mirrors ; all devices in the pool must be healthy ; no device may be undergoing a resilvering operation .
int
zpool_do_split(int argc, char **argv)
{
	char *srcpool, *newpool, *propval;
	char *mntopts = NULL;
	splitflags_t flags;
	int c, ret = 0;
	zpool_handle_t *zhp;
	nvlist_t *config, *props = NULL;
	flags.dryrun = B_FALSE;
	flags.import = B_FALSE;
	while ((c = getopt(argc, argv, ":R:no:")) != -1) {
		switch (c) {
		case 'R':
			flags.import = B_TRUE;
			if (add_prop_list(
			    zpool_prop_to_name(ZPOOL_PROP_ALTROOT), optarg,
			    &props, B_TRUE) != 0) {
				nvlist_free(props);
				usage(B_FALSE);
			}
			break;
		case 'n':
			flags.dryrun = B_TRUE;
			break;
		case 'o':
			if ((propval = strchr(optarg, '=')) != NULL) {
				*propval = '\0';
				propval++;
				if (add_prop_list(optarg, propval,
				    &props, B_TRUE) != 0) {
					nvlist_free(props);
					usage(B_FALSE);
				}
			} else {
				mntopts = optarg;
			}
			break;
		case ':':
			(void) fprintf(stderr, gettext("missing argument for "
			    "'%c' option\n"), optopt);
			usage(B_FALSE);
			break;
		case '?':
			(void) fprintf(stderr, gettext("invalid option '%c'\n"),
			    optopt);
			usage(B_FALSE);
			break;
		}
	}
	if (!flags.import && mntopts != NULL) {
		(void) fprintf(stderr, gettext("setting mntopts is only "
		    "valid when importing the pool\n"));
		usage(B_FALSE);
	}
	argc -= optind;
	argv += optind;
	if (argc < 1) {
		(void) fprintf(stderr, gettext("Missing pool name\n"));
		usage(B_FALSE);
	}
	if (argc < 2) {
		(void) fprintf(stderr, gettext("Missing new pool name\n"));
		usage(B_FALSE);
	}
	srcpool = argv[0];
	newpool = argv[1];
	argc -= 2;
	argv += 2;
	if ((zhp = zpool_open(g_zfs, srcpool)) == NULL)
		return (1);
	config = split_mirror_vdev(zhp, newpool, props, flags, argc, argv);
	if (config == NULL) {
		ret = 1;
	} else {
		if (flags.dryrun) {
			(void) printf(gettext("would create '%s' with the "
			    "following layout:\n\n"), newpool);
			print_vdev_tree(NULL, newpool, config, 0, B_FALSE);
		}
		nvlist_free(config);
	}
	zpool_close(zhp);
	if (ret != 0 || flags.dryrun || !flags.import)
		return (ret);
	if ((zhp = zpool_open_canfail(g_zfs, newpool)) == NULL)
		return (1);
	if (zpool_get_state(zhp) != POOL_STATE_UNAVAIL &&
	    zpool_enable_datasets(zhp, mntopts, 0) != 0) {
		ret = 1;
		(void) fprintf(stderr, gettext("Split was successful, but "
		    "the datasets could not all be mounted\n"));
		(void) fprintf(stderr, gettext("Try doing '%s' with a "
		    "different altroot\n"), "zpool import");
	}
	zpool_close(zhp);
	return (ret);
}
int zpool_do_split ( int argc , char * * argv ) { char * srcpool , * newpool , * propval ; char * mntopts = NULL ; splitflags_t flags ; int c , ret = 0 ; zpool_handle_t * zhp ; nvlist_t * config , * props = NULL ; flags . dryrun = B_FALSE ; flags . import = B_FALSE ; while ( ( c = getopt ( argc , argv , " " ) ) != -1 ) { switch ( c ) { case ' ' : flags . import = B_TRUE ; if ( add_prop_list ( zpool_prop_to_name ( ZPOOL_PROP_ALTROOT ) , optarg , & props , B_TRUE ) != 0 ) { nvlist_free ( props ) ; usage ( B_FALSE ) ; } break ; case ' ' : flags . dryrun = B_TRUE ; break ; case ' ' : if ( ( propval = strchr ( optarg , ' ' ) ) != NULL ) { * propval = ' \0 ' ; propval ++ ; if ( add_prop_list ( optarg , propval , & props , B_TRUE ) != 0 ) { nvlist_free ( props ) ; usage ( B_FALSE ) ; } } else { mntopts = optarg ; } break ; case ' ' : ( void ) fprintf ( stderr , gettext ( " " " \n " ) , optopt ) ; usage ( B_FALSE ) ; break ; case ' ' : ( void ) fprintf ( stderr , gettext ( " \n " ) , optopt ) ; usage ( B_FALSE ) ; break ; } } if ( ! flags . import && mntopts != NULL ) { ( void ) fprintf ( stderr , gettext ( " " " \n " ) ) ; usage ( B_FALSE ) ; } argc -= optind ; argv += optind ; if ( argc < 1 ) { ( void ) fprintf ( stderr , gettext ( " \n " ) ) ; usage ( B_FALSE ) ; } if ( argc < 2 ) { ( void ) fprintf ( stderr , gettext ( " \n " ) ) ; usage ( B_FALSE ) ; } srcpool = argv [ 0 ] ; newpool = argv [ 1 ] ; argc -= 2 ; argv += 2 ; if ( ( zhp = zpool_open ( g_zfs , srcpool ) ) == NULL ) return ( 1 ) ; config = split_mirror_vdev ( zhp , newpool , props , flags , argc , argv ) ; if ( config == NULL ) { ret = 1 ; } else { if ( flags . dryrun ) { ( void ) printf ( gettext ( " " " \n \n " ) , newpool ) ; print_vdev_tree ( NULL , newpool , config , 0 , B_FALSE ) ; } nvlist_free ( config ) ; } zpool_close ( zhp ) ; if ( ret != 0 || flags . dryrun || ! flags . import ) return ( ret ) ; if ( ( zhp = zpool_open_canfail ( g_zfs , newpool ) ) == NULL ) return ( 1 ) ; if ( zpool_get_state ( zhp ) != POOL_STATE_UNAVAIL && zpool_enable_datasets ( zhp , mntopts , 0 ) != 0 ) { ret = 1 ; ( void ) fprintf ( stderr , gettext ( " " " \n " ) ) ; ( void ) fprintf ( stderr , gettext ( " " " \n " ) , " " ) ; } zpool_close ( zhp ) ; return ( ret ) ; }
zpool split [-n] [-o prop=val] ...
              [-o mntopt] ...
              [-R altroot] <pool> <newpool> [<device> ...]
zpool split [ - n ] [ - o prop = val ] ... [ - o mntopt ] ... [ - R altroot ] <pool > <newpool > [ <device > ... ]
/* check options */ /*
	 * The split was successful. Now we need to open the new
	 * pool and import it.
	 */