Print this page
NEX-16219 pool import performance regression due to repeated libshare initialization
Reviewd by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-15937 zpool import performance degradation in filesystem sharing
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-15937 zpool import performance degradation in filesystem sharing
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-5728 Autosync Destination retention policy not being honoured
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
5984 zfs clone should not mount the clone if canmount == noauto
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Justin Gibbs <gibbs@scsiguy.com>
Reviewed by: Richard Elling <Richard.Elling@richardelling.com>
Approved by: Matthew Ahrens <mahrens@delphix.com>
6298 zfs_create_008_neg and zpool_create_023_neg need to be updated for large block support
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: John Kennedy <john.kennedy@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
2605 want to resume interrupted zfs send
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Xin Li <delphij@freebsd.org>
Reviewed by: Arne Jansen <sensille@gmx.net>
Approved by: Dan McDonald <danmcd@omniti.com>
NEX-4582 update wrc test cases for allow to use write back cache per tree of datasets
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
5960 zfs recv should prefetch indirect blocks
5925 zfs receive -o origin=
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
5745 zfs set allows only one dataset property to be set at a time
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Bayard Bell <buffer.g.overflow@gmail.com>
Reviewed by: Richard PALO <richard@NetBSD.org>
Reviewed by: Steven Hartland <killing@multiplay.co.uk>
Approved by: Rich Lowe <richlowe@richlowe.net>
NEX-4476 WRC: Allow to use write back cache per tree of datasets
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
Revert "NEX-4476 WRC: Allow to use write back cache per tree of datasets"
This reverts commit fe97b74444278a6f36fec93179133641296312da.
NEX-4476 WRC: Allow to use write back cache per tree of datasets
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
NEX-3669 Faults for fans that don't exist
Reviewed by: Jeffry Molanus <jeffry.molanus@nexenta.com>
NEX-3891 Hide the snapshots that belong to in-kernel autosnap-service
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Alek Pinchuk <alek@nexenta.com>
NEX-3558 KRRP Integration
NEX-1456 Part 2, port FreeBSD patch - new zfs recv options support
4206 history_003_pos relies on exact size of history log and entries
4207 history_008_pos depends on obsolete internal history log message
4208 Typo in zfs_main.c: "posxiuser"
4209 Populate zfstest with the remainder of the STF tests
Reviewed by: Sonu Pillai <sonu.pillai@delphix.com>
Reviewed by: Will Guyette <will.guyette@delphix.com>
Reviewed by: Eric Diven <eric.diven@delphix.com>
Reviewed by: Christopher Siden <christopher.siden@delphix.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
SUP-642 Regression leading to AD usernames not being displayed... (fix lint)
SUP-642 Regression leading to AD usernames not being displayed by zfs userspace command.
re #8279 rb3915 need a mechanism to notify NMS about ZFS config changes (Opened code)
Bug 10481 - cstyle/lint cleanup
Bug 10481 - Dry run option in 'zfs send' isn't the same as in NexentaStor 3.1

*** 26,36 **** * Copyright (c) 2012, Joyent, Inc. All rights reserved. * Copyright (c) 2011-2012 Pawel Jakub Dawidek. All rights reserved. * Copyright (c) 2013 Steven Hartland. All rights reserved. * Copyright (c) 2014 Integros [integros.com] * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>. ! * Copyright 2016 Nexenta Systems, Inc. */ #include <assert.h> #include <ctype.h> #include <errno.h> --- 26,36 ---- * Copyright (c) 2012, Joyent, Inc. All rights reserved. * Copyright (c) 2011-2012 Pawel Jakub Dawidek. All rights reserved. * Copyright (c) 2013 Steven Hartland. All rights reserved. * Copyright (c) 2014 Integros [integros.com] * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>. ! * Copyright 2018 Nexenta Systems, Inc. */ #include <assert.h> #include <ctype.h> #include <errno.h>
*** 105,115 **** static int zfs_do_hold(int argc, char **argv); static int zfs_do_holds(int argc, char **argv); static int zfs_do_release(int argc, char **argv); static int zfs_do_diff(int argc, char **argv); static int zfs_do_bookmark(int argc, char **argv); - static int zfs_do_remap(int argc, char **argv); static int zfs_do_channel_program(int argc, char **argv); /* * Enable a reasonable set of defaults for libumem debugging on DEBUG builds. */ --- 105,114 ----
*** 153,163 **** HELP_GROUPSPACE, HELP_HOLD, HELP_HOLDS, HELP_RELEASE, HELP_DIFF, - HELP_REMAP, HELP_BOOKMARK, HELP_CHANNEL_PROGRAM, } zfs_help_t; typedef struct zfs_command { --- 152,161 ----
*** 210,220 **** { NULL }, { "hold", zfs_do_hold, HELP_HOLD }, { "holds", zfs_do_holds, HELP_HOLDS }, { "release", zfs_do_release, HELP_RELEASE }, { "diff", zfs_do_diff, HELP_DIFF }, - { "remap", zfs_do_remap, HELP_REMAP }, }; #define NCOMMAND (sizeof (command_table) / sizeof (command_table[0])) zfs_command_t *current_command; --- 208,217 ----
*** 249,279 **** return (gettext("\tupgrade [-v]\n" "\tupgrade [-r] [-V version] <-a | filesystem ...>\n")); case HELP_LIST: return (gettext("\tlist [-Hp] [-r|-d max] [-o property[,...]] " "[-s property]...\n\t [-S property]... [-t type[,...]] " ! "[filesystem|volume|snapshot] ...\n")); case HELP_MOUNT: return (gettext("\tmount\n" "\tmount [-vO] [-o opts] <-a | filesystem>\n")); case HELP_PROMOTE: return (gettext("\tpromote <clone-filesystem>\n")); case HELP_RECEIVE: ! return (gettext("\treceive [-vnsFu] <filesystem|volume|" "snapshot>\n" ! "\treceive [-vnsFu] [-o origin=<snapshot>] [-d | -e] " ! "<filesystem>\n" "\treceive -A <filesystem|volume>\n")); case HELP_RENAME: return (gettext("\trename [-f] <filesystem|volume|snapshot> " "<filesystem|volume|snapshot>\n" "\trename [-f] -p <filesystem|volume> <filesystem|volume>\n" "\trename -r <snapshot> <snapshot>\n")); case HELP_ROLLBACK: return (gettext("\trollback [-rRf] <snapshot>\n")); case HELP_SEND: ! return (gettext("\tsend [-DnPpRvLec] [-[iI] snapshot] " "<snapshot>\n" "\tsend [-Le] [-i snapshot|bookmark] " "<filesystem|volume|snapshot>\n" "\tsend [-nvPe] -t <receive_resume_token>\n")); case HELP_SET: --- 246,277 ---- return (gettext("\tupgrade [-v]\n" "\tupgrade [-r] [-V version] <-a | filesystem ...>\n")); case HELP_LIST: return (gettext("\tlist [-Hp] [-r|-d max] [-o property[,...]] " "[-s property]...\n\t [-S property]... [-t type[,...]] " ! "[filesystem|volume|snapshot|autosnapshot] ...\n")); case HELP_MOUNT: return (gettext("\tmount\n" "\tmount [-vO] [-o opts] <-a | filesystem>\n")); case HELP_PROMOTE: return (gettext("\tpromote <clone-filesystem>\n")); case HELP_RECEIVE: ! return (gettext("\treceive [-vnsFKu] <filesystem|volume|" "snapshot>\n" ! "\treceive [-vnsFKu] [-d |-e] [-o <property=value>]... " ! "[-x <property>]... [-l <filesystem|volume>] ... " ! "<filesystem|volume|snapshot>\n" "\treceive -A <filesystem|volume>\n")); case HELP_RENAME: return (gettext("\trename [-f] <filesystem|volume|snapshot> " "<filesystem|volume|snapshot>\n" "\trename [-f] -p <filesystem|volume> <filesystem|volume>\n" "\trename -r <snapshot> <snapshot>\n")); case HELP_ROLLBACK: return (gettext("\trollback [-rRf] <snapshot>\n")); case HELP_SEND: ! return (gettext("\tsend [-DnPpRvLesc] [-[iI] snapshot] " "<snapshot>\n" "\tsend [-Le] [-i snapshot|bookmark] " "<filesystem|volume|snapshot>\n" "\tsend [-nvPe] -t <receive_resume_token>\n")); case HELP_SET:
*** 327,338 **** case HELP_RELEASE: return (gettext("\trelease [-r] <tag> <snapshot> ...\n")); case HELP_DIFF: return (gettext("\tdiff [-FHt] <snapshot> " "[snapshot|filesystem]\n")); - case HELP_REMAP: - return (gettext("\tremap <filesystem | volume>\n")); case HELP_BOOKMARK: return (gettext("\tbookmark <snapshot> <bookmark>\n")); case HELP_CHANNEL_PROGRAM: return (gettext("\tprogram [-n] [-t <instruction limit>] " "[-m <memory limit (b)>] <pool> <program file> " --- 325,334 ----
*** 509,518 **** --- 505,527 ---- exit(requested ? 0 : 2); } /* + * Add parameter to the list if it's not in there already + */ + static void + add_unique_option(nvlist_t *props, char *propname) + { + if (nvlist_lookup_string(props, propname, NULL) != 0) { + if (nvlist_add_boolean(props, propname) != 0) { + nomem(); + } + } + } + + /* * Take a property=value argument string and add it to the given nvlist. * Modifies the argument inplace. */ static int parseprop(nvlist_t *props, char *propname)
*** 543,553 **** int depth; depth = (int)strtol(opt, &tmp, 0); if (*tmp) { (void) fprintf(stderr, ! gettext("%s is not an integer\n"), optarg); usage(B_FALSE); } if (depth < 0) { (void) fprintf(stderr, gettext("Depth can not be negative.\n")); --- 552,562 ---- int depth; depth = (int)strtol(opt, &tmp, 0); if (*tmp) { (void) fprintf(stderr, ! gettext("%s is not an integer\n"), opt); usage(B_FALSE); } if (depth < 0) { (void) fprintf(stderr, gettext("Depth can not be negative.\n"));
*** 1074,1084 **** * We batch up all contiguous snapshots (even of different * filesystems) and destroy them with one ioctl. We can't * simply do all snap deletions and then all fs deletions, * because we must delete a clone before its origin. */ ! if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT) { fnvlist_add_boolean(cb->cb_batchedsnaps, name); } else { int error = zfs_destroy_snaps_nvl(g_zfs, cb->cb_batchedsnaps, B_FALSE); fnvlist_free(cb->cb_batchedsnaps); --- 1083,1094 ---- * We batch up all contiguous snapshots (even of different * filesystems) and destroy them with one ioctl. We can't * simply do all snap deletions and then all fs deletions, * because we must delete a clone before its origin. */ ! if (zfs_get_type(zhp) == ZFS_TYPE_SNAPSHOT || ! zfs_get_type(zhp) == ZFS_TYPE_AUTOSNAP) { fnvlist_add_boolean(cb->cb_batchedsnaps, name); } else { int error = zfs_destroy_snaps_nvl(g_zfs, cb->cb_batchedsnaps, B_FALSE); fnvlist_free(cb->cb_batchedsnaps);
*** 1236,1245 **** --- 1246,1269 ---- } return (0); } static int + unmount_callback(zfs_handle_t *zhp, void *arg) + { + destroy_cbdata_t *cb = arg; + int err = 0; + + if (zfs_is_mounted(zhp, NULL)) + err = zfs_unmount(zhp, NULL, cb->cb_force ? MS_FORCE : 0); + + zfs_close(zhp); + + return (err); + } + + static int zfs_do_destroy(int argc, char **argv) { destroy_cbdata_t cb = { 0 }; int rv = 0; int err = 0;
*** 1404,1414 **** --- 1428,1490 ---- if ((zhp = zfs_open(g_zfs, argv[0], type)) == NULL) return (1); cb.cb_target = zhp; + err = zfs_check_krrp(g_zfs, argv[0]); + /* + * ENOTSUP means that autosnaper doesn't handle this dataset + * and the basic detruction can be used. + */ + if (err != ENOTSUP) { + rv = 1; + if (!cb.cb_recurse || !cb.cb_doclones) { + (void) fprintf(stderr, + gettext("cannot destroy '%s': " + "dataset under autosnap can be destroyed " + "with -R only\n"), zfs_get_name(zhp)); + } else if (err == ECHILD) { + (void) fprintf(stderr, + gettext("cannot destroy '%s': " + "dataset has children under krrp\n"), + zfs_get_name(zhp)); + } else if (err == EBUSY) { + (void) fprintf(stderr, + gettext("cannot destroy '%s': " + "dataset is root of a krrp task\n"), + zfs_get_name(zhp)); + } else if (err && err != EUSERS) { + (void) fprintf(stderr, + gettext("cannot destroy '%s': " + "unexpected error : %d\n"), + zfs_get_name(zhp), err); + } else { + /* + * err == 0 || err == EUSERS means the ds can + * be destroyed with atomical destroy + */ + err = zfs_iter_dependents(zhp, B_FALSE, + unmount_callback, &cb); + if (!err) { + err = unmount_callback( + zfs_handle_dup(zhp), &cb); + } + if (!err) { + err = zfs_destroy_atomically( + zhp, B_TRUE); + } + + if (!err) + rv = 0; + } + goto out; + } + + err = 0; + + /* * Perform an explicit check for pools before going any further. */ if (!cb.cb_recurse && strchr(zfs_get_name(zhp), '/') == NULL && zfs_get_type(zhp) == ZFS_TYPE_FILESYSTEM) { (void) fprintf(stderr, gettext("cannot destroy '%s': "
*** 2077,2086 **** --- 2153,2163 ---- * be doing ioctls to different pools. We need * to log this history once to each pool, and bypass * the normal history logging that happens in main(). */ (void) zpool_log_history(g_zfs, history_str); + verify(zpool_stage_history(g_zfs, history_str) == 0); log_history = B_FALSE; } if (zfs_prop_set(zhp, "version", verstr) == 0) cb->cb_numupgraded++; else
*** 3124,3134 **** types_specified = B_TRUE; flags &= ~ZFS_ITER_PROP_LISTSNAPS; while (*optarg != '\0') { static char *type_subopts[] = { "filesystem", "volume", "snapshot", "snap", "bookmark", ! "all", NULL }; switch (getsubopt(&optarg, type_subopts, &value)) { case 0: types |= ZFS_TYPE_FILESYSTEM; --- 3201,3211 ---- types_specified = B_TRUE; flags &= ~ZFS_ITER_PROP_LISTSNAPS; while (*optarg != '\0') { static char *type_subopts[] = { "filesystem", "volume", "snapshot", "snap", "bookmark", ! "all", "autosnapshot", NULL }; switch (getsubopt(&optarg, type_subopts, &value)) { case 0: types |= ZFS_TYPE_FILESYSTEM;
*** 3143,3154 **** case 4: types |= ZFS_TYPE_BOOKMARK; break; case 5: types = ZFS_TYPE_DATASET | ! ZFS_TYPE_BOOKMARK; break; default: (void) fprintf(stderr, gettext("invalid type '%s'\n"), value); usage(B_FALSE); --- 3220,3235 ---- case 4: types |= ZFS_TYPE_BOOKMARK; break; case 5: types = ZFS_TYPE_DATASET | ! ZFS_TYPE_BOOKMARK | ! ZFS_TYPE_AUTOSNAP; break; + case 6: + types |= ZFS_TYPE_AUTOSNAP; + break; default: (void) fprintf(stderr, gettext("invalid type '%s'\n"), value); usage(B_FALSE);
*** 3744,3754 **** {"compressed", no_argument, NULL, 'c'}, {0, 0, 0, 0} }; /* check options */ ! while ((c = getopt_long(argc, argv, ":i:I:RbDpvnPLet:c", long_options, NULL)) != -1) { switch (c) { case 'i': if (fromname) usage(B_FALSE); --- 3825,3835 ---- {"compressed", no_argument, NULL, 'c'}, {0, 0, 0, 0} }; /* check options */ ! while ((c = getopt_long(argc, argv, ":i:I:RbDpvnPLest:c", long_options, NULL)) != -1) { switch (c) { case 'i': if (fromname) usage(B_FALSE);
*** 3786,3795 **** --- 3867,3879 ---- flags.largeblock = B_TRUE; break; case 'e': flags.embed_data = B_TRUE; break; + case 's': + flags.sendsize = B_TRUE; + break; case 't': resume_token = optarg; break; case 'c': flags.compress = B_TRUE;
*** 3860,3870 **** (void) fprintf(stderr, gettext("too many arguments\n")); usage(B_FALSE); } } ! if (!flags.dryrun && isatty(STDOUT_FILENO)) { (void) fprintf(stderr, gettext("Error: Stream can not be written to a terminal.\n" "You must redirect standard output.\n")); return (1); } --- 3944,3964 ---- (void) fprintf(stderr, gettext("too many arguments\n")); usage(B_FALSE); } } ! if (flags.sendsize) { ! int fd = open("/dev/null", O_WRONLY|O_LARGEFILE); ! if (fd < 0) { ! perror("failed to open /dev/null"); ! return (1); ! } ! if ((dup2(fd, STDOUT_FILENO)) < 0) { ! perror("failed to dup2(/dev/null,STDOUT_FILENO)"); ! return (1); ! } ! } else if (!flags.dryrun && isatty(STDOUT_FILENO)) { (void) fprintf(stderr, gettext("Error: Stream can not be written to a terminal.\n" "You must redirect standard output.\n")); return (1); }
*** 3985,4035 **** */ static int zfs_do_receive(int argc, char **argv) { int c, err = 0; recvflags_t flags = { 0 }; boolean_t abort_resumable = B_FALSE; ! nvlist_t *props; ! nvpair_t *nvp = NULL; ! ! if (nvlist_alloc(&props, NV_UNIQUE_NAME, 0) != 0) nomem(); /* check options */ ! while ((c = getopt(argc, argv, ":o:denuvFsA")) != -1) { switch (c) { case 'o': ! if (parseprop(props, optarg) != 0) ! return (1); break; case 'd': flags.isprefix = B_TRUE; break; case 'e': flags.isprefix = B_TRUE; flags.istail = B_TRUE; break; case 'n': flags.dryrun = B_TRUE; break; case 'u': flags.nomount = B_TRUE; break; case 'v': flags.verbose = B_TRUE; break; case 's': flags.resumable = B_TRUE; break; case 'F': flags.force = B_TRUE; break; case 'A': abort_resumable = B_TRUE; break; case ':': (void) fprintf(stderr, gettext("missing argument for " "'%c' option\n"), optopt); usage(B_FALSE); break; --- 4079,4140 ---- */ static int zfs_do_receive(int argc, char **argv) { int c, err = 0; + nvlist_t *exprops, *limitds; recvflags_t flags = { 0 }; boolean_t abort_resumable = B_FALSE; ! if (nvlist_alloc(&exprops, NV_UNIQUE_NAME, 0) != 0) nomem(); + if (nvlist_alloc(&limitds, NV_UNIQUE_NAME, 0) != 0) + nomem(); /* check options */ ! while ((c = getopt(argc, argv, ":del:no:uvx:FsAK")) != -1) { switch (c) { case 'o': ! if (parseprop(exprops, optarg) != 0) { ! err = 1; ! goto recverror; ! } break; case 'd': flags.isprefix = B_TRUE; break; case 'e': flags.isprefix = B_TRUE; flags.istail = B_TRUE; break; + case 'l': + add_unique_option(limitds, optarg); + break; case 'n': flags.dryrun = B_TRUE; break; case 'u': flags.nomount = B_TRUE; break; case 'v': flags.verbose = B_TRUE; break; + case 'x': + add_unique_option(exprops, optarg); + break; case 's': flags.resumable = B_TRUE; break; case 'F': flags.force = B_TRUE; break; case 'A': abort_resumable = B_TRUE; break; + case 'K': + flags.keepsnap = B_TRUE; + break; case ':': (void) fprintf(stderr, gettext("missing argument for " "'%c' option\n"), optopt); usage(B_FALSE); break;
*** 4051,4067 **** if (argc > 1) { (void) fprintf(stderr, gettext("too many arguments\n")); usage(B_FALSE); } - while ((nvp = nvlist_next_nvpair(props, nvp))) { - if (strcmp(nvpair_name(nvp), "origin") != 0) { - (void) fprintf(stderr, gettext("invalid option")); - usage(B_FALSE); - } - } - if (abort_resumable) { if (flags.isprefix || flags.istail || flags.dryrun || flags.resumable || flags.nomount) { (void) fprintf(stderr, gettext("invalid option")); usage(B_FALSE); --- 4156,4165 ----
*** 4103,4114 **** gettext("Error: Backup stream can not be read " "from a terminal.\n" "You must redirect standard input.\n")); return (1); } - err = zfs_receive(g_zfs, argv[0], props, &flags, STDIN_FILENO, NULL); return (err != 0); } /* * allow/unallow stuff --- 4201,4218 ---- gettext("Error: Backup stream can not be read " "from a terminal.\n" "You must redirect standard input.\n")); return (1); } + err = zfs_receive(g_zfs, argv[0], &flags, STDIN_FILENO, exprops, + limitds, NULL); + + recverror: + nvlist_free(exprops); + nvlist_free(limitds); + return (err != 0); } /* * allow/unallow stuff
*** 4134,4144 **** #define ZFS_DELEG_PERM_GROUPUSED "groupused" #define ZFS_DELEG_PERM_HOLD "hold" #define ZFS_DELEG_PERM_RELEASE "release" #define ZFS_DELEG_PERM_DIFF "diff" #define ZFS_DELEG_PERM_BOOKMARK "bookmark" - #define ZFS_DELEG_PERM_REMAP "remap" #define ZFS_NUM_DELEG_NOTES ZFS_DELEG_NOTE_NONE static zfs_deleg_perm_tab_t zfs_deleg_perm_tbl[] = { { ZFS_DELEG_PERM_ALLOW, ZFS_DELEG_NOTE_ALLOW }, --- 4238,4247 ----
*** 4155,4165 **** { ZFS_DELEG_PERM_ROLLBACK, ZFS_DELEG_NOTE_ROLLBACK }, { ZFS_DELEG_PERM_SEND, ZFS_DELEG_NOTE_SEND }, { ZFS_DELEG_PERM_SHARE, ZFS_DELEG_NOTE_SHARE }, { ZFS_DELEG_PERM_SNAPSHOT, ZFS_DELEG_NOTE_SNAPSHOT }, { ZFS_DELEG_PERM_BOOKMARK, ZFS_DELEG_NOTE_BOOKMARK }, - { ZFS_DELEG_PERM_REMAP, ZFS_DELEG_NOTE_REMAP }, { ZFS_DELEG_PERM_GROUPQUOTA, ZFS_DELEG_NOTE_GROUPQUOTA }, { ZFS_DELEG_PERM_GROUPUSED, ZFS_DELEG_NOTE_GROUPUSED }, { ZFS_DELEG_PERM_USERPROP, ZFS_DELEG_NOTE_USERPROP }, { ZFS_DELEG_PERM_USERQUOTA, ZFS_DELEG_NOTE_USERQUOTA }, --- 4258,4267 ----
*** 5601,5626 **** char tsbuf[DATETIME_BUF_LEN]; char *tagname = nvpair_name(nvp2); uint64_t val = 0; time_t time; struct tm t; (void) nvpair_value_uint64(nvp2, &val); time = (time_t)val; (void) localtime_r(&time, &t); (void) strftime(tsbuf, DATETIME_BUF_LEN, gettext(STRFTIME_FMT_STR), &t); ! if (scripted) { ! (void) printf("%s\t%s\t%s\n", zname, ! tagname, tsbuf); ! } else { ! (void) printf("%-*s %-*s %s\n", nwidth, ! zname, tagwidth, tagname, tsbuf); } } - } } /* * Generic callback function to list a dataset or snapshot. */ --- 5703,5725 ---- char tsbuf[DATETIME_BUF_LEN]; char *tagname = nvpair_name(nvp2); uint64_t val = 0; time_t time; struct tm t; + char sep = scripted ? '\t' : ' '; + size_t sepnum = scripted ? 1 : 2; (void) nvpair_value_uint64(nvp2, &val); time = (time_t)val; (void) localtime_r(&time, &t); (void) strftime(tsbuf, DATETIME_BUF_LEN, gettext(STRFTIME_FMT_STR), &t); ! (void) printf("%-*s%*c%-*s%*c%s\n", nwidth, zname, ! sepnum, sep, tagwidth, tagname, sepnum, sep, tsbuf); } } } /* * Generic callback function to list a dataset or snapshot. */
*** 6532,6541 **** --- 6631,6666 ---- free(node); } } /* + * Initilialize libshare SA_INIT_SHARE_API_SELECTIVE here + * to avoid unneccesary load/unload of the libshare API + * per shared dataset downstream. + */ + if (op == OP_SHARE) { + zfs_handle_t **dslist = NULL; + size_t count = 0; + get_all_datasets(&dslist, &count, B_FALSE); + + if (count > 0) { + sa_init_selective_arg_t sharearg; + sharearg.zhandle_arr = dslist; + sharearg.zhandle_len = count; + if ((ret = zfs_init_libshare_arg( + zfs_get_handle(dslist[0]), + SA_INIT_SHARE_API_SELECTIVE, &sharearg)) + != SA_OK) { + (void) fprintf(stderr, gettext( + "Could not initialize libshare," + "%d"), ret); + return (1); + } + } + } + + /* * Walk the AVL tree in reverse, unmounting each filesystem and * removing it from the AVL tree in the process. */ if ((walk = uu_avl_walk_start(tree, UU_WALK_REVERSE | UU_WALK_ROBUST)) == NULL)
*** 6902,6927 **** zfs_close(zhp); return (err != 0); } - static int - zfs_do_remap(int argc, char **argv) - { - const char *fsname; - int err = 0; - if (argc != 2) { - (void) fprintf(stderr, gettext("wrong number of arguments\n")); - usage(B_FALSE); - } - - fsname = argv[1]; - err = zfs_remap_indirects(g_zfs, fsname); - - return (err); - } - /* * zfs bookmark <fs@snap> <fs#bmark> * * Creates a bookmark with the given name from the given snapshot. */ --- 7027,7036 ----
*** 7237,7246 **** --- 7346,7356 ---- "initialize ZFS library\n")); return (1); } zfs_save_arguments(argc, argv, history_str, sizeof (history_str)); + verify(zpool_stage_history(g_zfs, history_str) == 0); libzfs_print_on_error(g_zfs, B_TRUE); if ((mnttab_file = fopen(MNTTAB, "r")) == NULL) { (void) fprintf(stderr, gettext("internal error: unable to "