Print this page
6536 zfs send: want a way to disable sending of free records
Reviewed by: Alexander Stetsenko <astetsenko@racktopsystems.com>
Reviewed by: Kim Shrier <kshrier@racktopsystems.com>


   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  25  * Copyright 2012 Milan Jurik. All rights reserved.
  26  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  27  * Copyright (c) 2013 Steven Hartland.  All rights reserved.
  28  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.

  29  */
  30 
  31 #include <assert.h>
  32 #include <ctype.h>
  33 #include <errno.h>
  34 #include <libgen.h>
  35 #include <libintl.h>
  36 #include <libuutil.h>
  37 #include <libnvpair.h>
  38 #include <locale.h>
  39 #include <stddef.h>
  40 #include <stdio.h>
  41 #include <stdlib.h>
  42 #include <strings.h>
  43 #include <unistd.h>
  44 #include <fcntl.h>
  45 #include <zone.h>
  46 #include <grp.h>
  47 #include <pwd.h>
  48 #include <signal.h>


 242                     "[filesystem|volume|snapshot] ...\n"));
 243         case HELP_MOUNT:
 244                 return (gettext("\tmount\n"
 245                     "\tmount [-vO] [-o opts] <-a | filesystem>\n"));
 246         case HELP_PROMOTE:
 247                 return (gettext("\tpromote <clone-filesystem>\n"));
 248         case HELP_RECEIVE:
 249                 return (gettext("\treceive [-vnsFu] <filesystem|volume|"
 250                     "snapshot>\n"
 251                     "\treceive [-vnsFu] [-o origin=<snapshot>] [-d | -e] "
 252                     "<filesystem>\n"
 253                     "\treceive -A <filesystem|volume>\n"));
 254         case HELP_RENAME:
 255                 return (gettext("\trename [-f] <filesystem|volume|snapshot> "
 256                     "<filesystem|volume|snapshot>\n"
 257                     "\trename [-f] -p <filesystem|volume> <filesystem|volume>\n"
 258                     "\trename -r <snapshot> <snapshot>\n"));
 259         case HELP_ROLLBACK:
 260                 return (gettext("\trollback [-rRf] <snapshot>\n"));
 261         case HELP_SEND:
 262                 return (gettext("\tsend [-DnPpRvLe] [-[iI] snapshot] "
 263                     "<snapshot>\n"
 264                     "\tsend [-Le] [-i snapshot|bookmark] "
 265                     "<filesystem|volume|snapshot>\n"
 266                     "\tsend [-nvPe] -t <receive_resume_token>\n"));
 267         case HELP_SET:
 268                 return (gettext("\tset <property=value> ... "
 269                     "<filesystem|volume|snapshot> ...\n"));
 270         case HELP_SHARE:
 271                 return (gettext("\tshare <-a | filesystem>\n"));
 272         case HELP_SNAPSHOT:
 273                 return (gettext("\tsnapshot [-r] [-o property=value] ... "
 274                     "<filesystem|volume>@<snap> ...\n"));
 275         case HELP_UNMOUNT:
 276                 return (gettext("\tunmount [-f] "
 277                     "<-a | filesystem|mountpoint>\n"));
 278         case HELP_UNSHARE:
 279                 return (gettext("\tunshare "
 280                     "<-a | filesystem|mountpoint>\n"));
 281         case HELP_ALLOW:
 282                 return (gettext("\tallow <filesystem|volume>\n"
 283                     "\tallow [-ldug] "
 284                     "<\"everyone\"|user|group>[,...] <perm|@setname>[,...]\n"


3670         return (-1);
3671 }
3672 
3673 /*
3674  * Send a backup stream to stdout.
3675  */
3676 static int
3677 zfs_do_send(int argc, char **argv)
3678 {
3679         char *fromname = NULL;
3680         char *toname = NULL;
3681         char *resume_token = NULL;
3682         char *cp;
3683         zfs_handle_t *zhp;
3684         sendflags_t flags = { 0 };
3685         int c, err;
3686         nvlist_t *dbgnv = NULL;
3687         boolean_t extraverbose = B_FALSE;
3688 
3689         /* check options */
3690         while ((c = getopt(argc, argv, ":i:I:RDpvnPLet:")) != -1) {
3691                 switch (c) {
3692                 case 'i':
3693                         if (fromname)
3694                                 usage(B_FALSE);
3695                         fromname = optarg;
3696                         break;
3697                 case 'I':
3698                         if (fromname)
3699                                 usage(B_FALSE);
3700                         fromname = optarg;
3701                         flags.doall = B_TRUE;
3702                         break;
3703                 case 'R':
3704                         flags.replicate = B_TRUE;
3705                         break;
3706                 case 'p':
3707                         flags.props = B_TRUE;
3708                         break;
3709                 case 'P':
3710                         flags.parsable = B_TRUE;


3713                 case 'v':
3714                         if (flags.verbose)
3715                                 extraverbose = B_TRUE;
3716                         flags.verbose = B_TRUE;
3717                         flags.progress = B_TRUE;
3718                         break;
3719                 case 'D':
3720                         flags.dedup = B_TRUE;
3721                         break;
3722                 case 'n':
3723                         flags.dryrun = B_TRUE;
3724                         break;
3725                 case 'L':
3726                         flags.largeblock = B_TRUE;
3727                         break;
3728                 case 'e':
3729                         flags.embed_data = B_TRUE;
3730                         break;
3731                 case 't':
3732                         resume_token = optarg;



3733                         break;
3734                 case ':':
3735                         (void) fprintf(stderr, gettext("missing argument for "
3736                             "'%c' option\n"), optopt);
3737                         usage(B_FALSE);
3738                         break;
3739                 case '?':
3740                         (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3741                             optopt);
3742                         usage(B_FALSE);
3743                 }
3744         }
3745 
3746         argc -= optind;
3747         argv += optind;
3748 
3749         if (resume_token != NULL) {
3750                 if (fromname != NULL || flags.replicate || flags.props ||
3751                     flags.dedup) {
3752                         (void) fprintf(stderr,




   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  24  * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  25  * Copyright 2012 Milan Jurik. All rights reserved.
  26  * Copyright (c) 2012, Joyent, Inc. All rights reserved.
  27  * Copyright (c) 2013 Steven Hartland.  All rights reserved.
  28  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
  29  * Copyright 2015 RackTop Systems.
  30  */
  31 
  32 #include <assert.h>
  33 #include <ctype.h>
  34 #include <errno.h>
  35 #include <libgen.h>
  36 #include <libintl.h>
  37 #include <libuutil.h>
  38 #include <libnvpair.h>
  39 #include <locale.h>
  40 #include <stddef.h>
  41 #include <stdio.h>
  42 #include <stdlib.h>
  43 #include <strings.h>
  44 #include <unistd.h>
  45 #include <fcntl.h>
  46 #include <zone.h>
  47 #include <grp.h>
  48 #include <pwd.h>
  49 #include <signal.h>


 243                     "[filesystem|volume|snapshot] ...\n"));
 244         case HELP_MOUNT:
 245                 return (gettext("\tmount\n"
 246                     "\tmount [-vO] [-o opts] <-a | filesystem>\n"));
 247         case HELP_PROMOTE:
 248                 return (gettext("\tpromote <clone-filesystem>\n"));
 249         case HELP_RECEIVE:
 250                 return (gettext("\treceive [-vnsFu] <filesystem|volume|"
 251                     "snapshot>\n"
 252                     "\treceive [-vnsFu] [-o origin=<snapshot>] [-d | -e] "
 253                     "<filesystem>\n"
 254                     "\treceive -A <filesystem|volume>\n"));
 255         case HELP_RENAME:
 256                 return (gettext("\trename [-f] <filesystem|volume|snapshot> "
 257                     "<filesystem|volume|snapshot>\n"
 258                     "\trename [-f] -p <filesystem|volume> <filesystem|volume>\n"
 259                     "\trename -r <snapshot> <snapshot>\n"));
 260         case HELP_ROLLBACK:
 261                 return (gettext("\trollback [-rRf] <snapshot>\n"));
 262         case HELP_SEND:
 263                 return (gettext("\tsend [-DnPpRvLeF] [-[iI] snapshot] "
 264                     "<snapshot>\n"
 265                     "\tsend [-LeF] [-i snapshot|bookmark] "
 266                     "<filesystem|volume|snapshot>\n"
 267                     "\tsend [-nvPe] -t <receive_resume_token>\n"));
 268         case HELP_SET:
 269                 return (gettext("\tset <property=value> ... "
 270                     "<filesystem|volume|snapshot> ...\n"));
 271         case HELP_SHARE:
 272                 return (gettext("\tshare <-a | filesystem>\n"));
 273         case HELP_SNAPSHOT:
 274                 return (gettext("\tsnapshot [-r] [-o property=value] ... "
 275                     "<filesystem|volume>@<snap> ...\n"));
 276         case HELP_UNMOUNT:
 277                 return (gettext("\tunmount [-f] "
 278                     "<-a | filesystem|mountpoint>\n"));
 279         case HELP_UNSHARE:
 280                 return (gettext("\tunshare "
 281                     "<-a | filesystem|mountpoint>\n"));
 282         case HELP_ALLOW:
 283                 return (gettext("\tallow <filesystem|volume>\n"
 284                     "\tallow [-ldug] "
 285                     "<\"everyone\"|user|group>[,...] <perm|@setname>[,...]\n"


3671         return (-1);
3672 }
3673 
3674 /*
3675  * Send a backup stream to stdout.
3676  */
3677 static int
3678 zfs_do_send(int argc, char **argv)
3679 {
3680         char *fromname = NULL;
3681         char *toname = NULL;
3682         char *resume_token = NULL;
3683         char *cp;
3684         zfs_handle_t *zhp;
3685         sendflags_t flags = { 0 };
3686         int c, err;
3687         nvlist_t *dbgnv = NULL;
3688         boolean_t extraverbose = B_FALSE;
3689 
3690         /* check options */
3691         while ((c = getopt(argc, argv, ":i:I:RDpvnPLet:F")) != -1) {
3692                 switch (c) {
3693                 case 'i':
3694                         if (fromname)
3695                                 usage(B_FALSE);
3696                         fromname = optarg;
3697                         break;
3698                 case 'I':
3699                         if (fromname)
3700                                 usage(B_FALSE);
3701                         fromname = optarg;
3702                         flags.doall = B_TRUE;
3703                         break;
3704                 case 'R':
3705                         flags.replicate = B_TRUE;
3706                         break;
3707                 case 'p':
3708                         flags.props = B_TRUE;
3709                         break;
3710                 case 'P':
3711                         flags.parsable = B_TRUE;


3714                 case 'v':
3715                         if (flags.verbose)
3716                                 extraverbose = B_TRUE;
3717                         flags.verbose = B_TRUE;
3718                         flags.progress = B_TRUE;
3719                         break;
3720                 case 'D':
3721                         flags.dedup = B_TRUE;
3722                         break;
3723                 case 'n':
3724                         flags.dryrun = B_TRUE;
3725                         break;
3726                 case 'L':
3727                         flags.largeblock = B_TRUE;
3728                         break;
3729                 case 'e':
3730                         flags.embed_data = B_TRUE;
3731                         break;
3732                 case 't':
3733                         resume_token = optarg;
3734                         break;
3735                 case 'F':
3736                         flags.skip_free = B_TRUE;
3737                         break;
3738                 case ':':
3739                         (void) fprintf(stderr, gettext("missing argument for "
3740                             "'%c' option\n"), optopt);
3741                         usage(B_FALSE);
3742                         break;
3743                 case '?':
3744                         (void) fprintf(stderr, gettext("invalid option '%c'\n"),
3745                             optopt);
3746                         usage(B_FALSE);
3747                 }
3748         }
3749 
3750         argc -= optind;
3751         argv += optind;
3752 
3753         if (resume_token != NULL) {
3754                 if (fromname != NULL || flags.replicate || flags.props ||
3755                     flags.dedup) {
3756                         (void) fprintf(stderr,