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"

Reply via email to