Print this page
6328 Fix cstyle errors in zfs codebase (fix studio)
6328 Fix cstyle errors in zfs codebase
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Alex Reece <alex@delphix.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Jorgen Lundman <lundman@lundman.net>
Approved by: Robert Mustacchi <rm@joyent.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>
re #13487 libscf: memory leaks in scf_simple_app_props_get()
re #13485 libzfs: memory leak in iter_dependents_cb()

@@ -136,45 +136,77 @@
 
 /*
  * Iterate over all snapshots
  */
 int
-zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func,
-    void *data)
+zfs_iter_snapshots_internal(zfs_handle_t *zhp, boolean_t simple,
+    zfs_iter_f func, void *data, boolean_t autosnaps)
 {
         zfs_cmd_t zc = { 0 };
-        zfs_handle_t *nzhp;
         int ret;
 
         if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT ||
-            zhp->zfs_type == ZFS_TYPE_BOOKMARK)
+            zhp->zfs_type == ZFS_TYPE_BOOKMARK ||
+            zhp->zfs_type == ZFS_TYPE_AUTOSNAP)
                 return (0);
 
         zc.zc_simple = simple;
 
         if (zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0) != 0)
                 return (-1);
+
         while ((ret = zfs_do_list_ioctl(zhp, ZFS_IOC_SNAPSHOT_LIST_NEXT,
             &zc)) == 0) {
+                zfs_handle_t *nzhp;
 
                 if (simple)
                         nzhp = make_dataset_simple_handle_zc(zhp, &zc);
                 else
                         nzhp = make_dataset_handle_zc(zhp->zfs_hdl, &zc);
                 if (nzhp == NULL)
                         continue;
 
+                if (autosnaps) {
+                        if (zfs_get_type(nzhp) != ZFS_TYPE_AUTOSNAP) {
+                                zfs_close(nzhp);
+                                continue;
+                        }
+                } else {
+                        if (zfs_get_type(nzhp) != ZFS_TYPE_SNAPSHOT) {
+                                zfs_close(nzhp);
+                                continue;
+                        }
+                }
+
                 if ((ret = func(nzhp, data)) != 0) {
                         zcmd_free_nvlists(&zc);
                         return (ret);
                 }
         }
+
         zcmd_free_nvlists(&zc);
         return ((ret < 0) ? ret : 0);
 }
 
 /*
+ * Iterate over all snapshots
+ */
+int
+zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func,
+    void *data)
+{
+        return (zfs_iter_snapshots_internal(zhp, simple, func, data, B_FALSE));
+}
+
+int
+zfs_iter_autosnapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func,
+    void *data)
+{
+        return (zfs_iter_snapshots_internal(zhp, simple, func, data, B_TRUE));
+}
+
+/*
  * Iterate over all bookmarks
  */
 int
 zfs_iter_bookmarks(zfs_handle_t *zhp, zfs_iter_f func, void *data)
 {

@@ -181,11 +213,12 @@
         zfs_handle_t *nzhp;
         nvlist_t *props = NULL;
         nvlist_t *bmarks = NULL;
         int err;
 
-        if ((zfs_get_type(zhp) & (ZFS_TYPE_SNAPSHOT | ZFS_TYPE_BOOKMARK)) != 0)
+        if ((zfs_get_type(zhp) & (ZFS_TYPE_SNAPSHOT |
+            ZFS_TYPE_BOOKMARK | ZFS_TYPE_AUTOSNAP)) != 0)
                 return (0);
 
         /* Setup the requested properties nvlist. */
         props = fnvlist_alloc();
         fnvlist_add_boolean(props, zfs_prop_to_name(ZFS_PROP_GUID));

@@ -422,24 +455,20 @@
         return (ret);
 }
 
 /*
  * Iterate over all children, snapshots and filesystems
- * Process snapshots before filesystems because they are nearer the input
- * handle: this is extremely important when used with zfs_iter_f functions
- * looking for data, following the logic that we would like to find it as soon
- * and as close as possible.
  */
 int
 zfs_iter_children(zfs_handle_t *zhp, zfs_iter_f func, void *data)
 {
         int ret;
 
-        if ((ret = zfs_iter_snapshots(zhp, B_FALSE, func, data)) != 0)
+        if ((ret = zfs_iter_filesystems(zhp, func, data)) != 0)
                 return (ret);
 
-        return (zfs_iter_filesystems(zhp, func, data));
+        return (zfs_iter_snapshots(zhp, B_FALSE, func, data));
 }
 
 
 typedef struct iter_stack_frame {
         struct iter_stack_frame *next;

@@ -500,10 +529,16 @@
                 err = zfs_iter_filesystems(zhp, iter_dependents_cb, ida);
                 if (err == 0) {
                         err = zfs_iter_snapshots(zhp, B_FALSE,
                             iter_dependents_cb, ida);
                 }
+
+                if (err == 0) {
+                        err = zfs_iter_autosnapshots(zhp, B_FALSE,
+                            iter_dependents_cb, ida);
+                }
+
                 ida->stack = isf.next;
         }
 
         if (!first && err == 0)
                 err = ida->func(zhp, ida->data);