Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Apr 2013 01:17:53 +0100
From:      "Steven Hartland" <smh@freebsd.org>
To:        "Martin Matuska" <mm@FreeBSD.org>, <src-committers@freebsd.org>, <svn-src-all@freebsd.org>, <svn-src-head@freebsd.org>
Subject:   Re: svn commit: r249357 - head/cddl/contrib/opensolaris/lib/libzfs/common
Message-ID:  <CC65FE0CA4D94289B5AE9264C9F47D1C@multiplay.co.uk>
References:  <201304110749.r3B7nGxR071588@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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" <mm@FreeBSD.org>
To: <src-committers@freebsd.org>; <svn-src-all@freebsd.org>; <svn-src-head@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'"),
>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CC65FE0CA4D94289B5AE9264C9F47D1C>