I believe this needs a little tweak so you don't get issues with zfs send which
makes use of holds to ensure snapshots being sent don't get deleted while
processing.
In essence it should honor the enoent_ok flag and not report such an error
to stdout.
@@ -4207,6 +4238,9 @@
if (nvlist_next_nvpair(ha.nvl, NULL) == NULL) {
fnvlist_free(ha.nvl);
ret = ENOENT;
+ if (enoent_ok)
+ return (ret);
+
(void) snprintf(errbuf, sizeof (errbuf),
dgettext(TEXT_DOMAIN, "cannot hold snapshot '%s@%s'"),
zhp->zfs_name, snapname);
----- Original Message -----
From: "Martin Matuska" <m...@freebsd.org>
To: <src-committ...@freebsd.org>; <svn-src-all@freebsd.org>;
<svn-src-h...@freebsd.org>
Sent: Thursday, April 11, 2013 8:49 AM
Subject: svn commit: r249357 - head/cddl/contrib/opensolaris/lib/libzfs/common
Author: mm
Date: Thu Apr 11 07:49:16 2013
New Revision: 249357
URL: http://svnweb.freebsd.org/changeset/base/249357
Log:
Fix libzfs to report error instead of returning zero if trying to hold or
release a non-existing snapshot of a existing dataset. In recursive case
error is reported if no snapshots with the requested name have been found.
Problem and proposed solution reported to illumos:
3699 zfs hold or release of a non-existent snapshot does not output error
MFC after: 8 days
Modified:
head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c Thu Apr 11
07:40:30 2013 (r249356)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c Thu Apr 11
07:49:16 2013 (r249357)
@@ -4203,6 +4203,17 @@ zfs_hold(zfs_handle_t *zhp, const char *
ha.tag = tag;
ha.recursive = recursive;
(void) zfs_hold_one(zfs_handle_dup(zhp), &ha);
+
+ if (nvlist_next_nvpair(ha.nvl, NULL) == NULL) {
+ fnvlist_free(ha.nvl);
+ ret = ENOENT;
+ (void) snprintf(errbuf, sizeof (errbuf),
+ dgettext(TEXT_DOMAIN, "cannot hold snapshot '%s@%s'"),
+ zhp->zfs_name, snapname);
+ (void) zfs_standard_error(hdl, ret, errbuf);
+ return (ret);
+ }
+
ret = lzc_hold(ha.nvl, cleanup_fd, &errors);
fnvlist_free(ha.nvl);
@@ -4304,12 +4315,25 @@ zfs_release(zfs_handle_t *zhp, const cha
nvlist_t *errors;
nvpair_t *elem;
libzfs_handle_t *hdl = zhp->zfs_hdl;
+ char errbuf[1024];
ha.nvl = fnvlist_alloc();
ha.snapname = snapname;
ha.tag = tag;
ha.recursive = recursive;
(void) zfs_release_one(zfs_handle_dup(zhp), &ha);
+
+ if (nvlist_next_nvpair(ha.nvl, NULL) == NULL) {
+ fnvlist_free(ha.nvl);
+ ret = ENOENT;
+ (void) snprintf(errbuf, sizeof (errbuf),
+ dgettext(TEXT_DOMAIN,
+ "cannot release hold from snapshot '%s@%s'"),
+ zhp->zfs_name, snapname);
+ (void) zfs_standard_error(hdl, ret, errbuf);
+ return (ret);
+ }
+
ret = lzc_release(ha.nvl, &errors);
fnvlist_free(ha.nvl);
@@ -4318,8 +4342,6 @@ zfs_release(zfs_handle_t *zhp, const cha
if (nvlist_next_nvpair(errors, NULL) == NULL) {
/* no hold-specific errors */
- char errbuf[1024];
-
(void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
"cannot release"));
switch (errno) {
@@ -4336,8 +4358,6 @@ zfs_release(zfs_handle_t *zhp, const cha
for (elem = nvlist_next_nvpair(errors, NULL);
elem != NULL;
elem = nvlist_next_nvpair(errors, elem)) {
- char errbuf[1024];
-
(void) snprintf(errbuf, sizeof (errbuf),
dgettext(TEXT_DOMAIN,
"cannot release hold from snapshot '%s'"),
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"