svn commit: r249357 - head/cddl/contrib/opensolaris/lib/libzfs/common

Steven Hartland smh at freebsd.org
Thu Apr 25 00:17:32 UTC 2013


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 at FreeBSD.org>
To: <src-committers at freebsd.org>; <svn-src-all at freebsd.org>; <svn-src-head at 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'"),
>


More information about the svn-src-all mailing list