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()

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libzfs/common/libzfs_iter.c
          +++ new/usr/src/lib/libzfs/common/libzfs_iter.c
↓ open down ↓ 130 lines elided ↑ open up ↑
 131  131                  }
 132  132          }
 133  133          zcmd_free_nvlists(&zc);
 134  134          return ((ret < 0) ? ret : 0);
 135  135  }
 136  136  
 137  137  /*
 138  138   * Iterate over all snapshots
 139  139   */
 140  140  int
 141      -zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func,
 142      -    void *data)
      141 +zfs_iter_snapshots_internal(zfs_handle_t *zhp, boolean_t simple,
      142 +    zfs_iter_f func, void *data, boolean_t autosnaps)
 143  143  {
 144  144          zfs_cmd_t zc = { 0 };
 145      -        zfs_handle_t *nzhp;
 146  145          int ret;
 147  146  
 148  147          if (zhp->zfs_type == ZFS_TYPE_SNAPSHOT ||
 149      -            zhp->zfs_type == ZFS_TYPE_BOOKMARK)
      148 +            zhp->zfs_type == ZFS_TYPE_BOOKMARK ||
      149 +            zhp->zfs_type == ZFS_TYPE_AUTOSNAP)
 150  150                  return (0);
 151  151  
 152  152          zc.zc_simple = simple;
 153  153  
 154  154          if (zcmd_alloc_dst_nvlist(zhp->zfs_hdl, &zc, 0) != 0)
 155  155                  return (-1);
      156 +
 156  157          while ((ret = zfs_do_list_ioctl(zhp, ZFS_IOC_SNAPSHOT_LIST_NEXT,
 157  158              &zc)) == 0) {
      159 +                zfs_handle_t *nzhp;
 158  160  
 159  161                  if (simple)
 160  162                          nzhp = make_dataset_simple_handle_zc(zhp, &zc);
 161  163                  else
 162  164                          nzhp = make_dataset_handle_zc(zhp->zfs_hdl, &zc);
 163  165                  if (nzhp == NULL)
 164  166                          continue;
 165  167  
      168 +                if (autosnaps) {
      169 +                        if (zfs_get_type(nzhp) != ZFS_TYPE_AUTOSNAP) {
      170 +                                zfs_close(nzhp);
      171 +                                continue;
      172 +                        }
      173 +                } else {
      174 +                        if (zfs_get_type(nzhp) != ZFS_TYPE_SNAPSHOT) {
      175 +                                zfs_close(nzhp);
      176 +                                continue;
      177 +                        }
      178 +                }
      179 +
 166  180                  if ((ret = func(nzhp, data)) != 0) {
 167  181                          zcmd_free_nvlists(&zc);
 168  182                          return (ret);
 169  183                  }
 170  184          }
      185 +
 171  186          zcmd_free_nvlists(&zc);
 172  187          return ((ret < 0) ? ret : 0);
 173  188  }
 174  189  
 175  190  /*
      191 + * Iterate over all snapshots
      192 + */
      193 +int
      194 +zfs_iter_snapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func,
      195 +    void *data)
      196 +{
      197 +        return (zfs_iter_snapshots_internal(zhp, simple, func, data, B_FALSE));
      198 +}
      199 +
      200 +int
      201 +zfs_iter_autosnapshots(zfs_handle_t *zhp, boolean_t simple, zfs_iter_f func,
      202 +    void *data)
      203 +{
      204 +        return (zfs_iter_snapshots_internal(zhp, simple, func, data, B_TRUE));
      205 +}
      206 +
      207 +/*
 176  208   * Iterate over all bookmarks
 177  209   */
 178  210  int
 179  211  zfs_iter_bookmarks(zfs_handle_t *zhp, zfs_iter_f func, void *data)
 180  212  {
 181  213          zfs_handle_t *nzhp;
 182  214          nvlist_t *props = NULL;
 183  215          nvlist_t *bmarks = NULL;
 184  216          int err;
 185  217  
 186      -        if ((zfs_get_type(zhp) & (ZFS_TYPE_SNAPSHOT | ZFS_TYPE_BOOKMARK)) != 0)
      218 +        if ((zfs_get_type(zhp) & (ZFS_TYPE_SNAPSHOT |
      219 +            ZFS_TYPE_BOOKMARK | ZFS_TYPE_AUTOSNAP)) != 0)
 187  220                  return (0);
 188  221  
 189  222          /* Setup the requested properties nvlist. */
 190  223          props = fnvlist_alloc();
 191  224          fnvlist_add_boolean(props, zfs_prop_to_name(ZFS_PROP_GUID));
 192  225          fnvlist_add_boolean(props, zfs_prop_to_name(ZFS_PROP_CREATETXG));
 193  226          fnvlist_add_boolean(props, zfs_prop_to_name(ZFS_PROP_CREATION));
 194  227  
 195  228          if ((err = lzc_get_bookmarks(zhp->zfs_name, props, &bmarks)) != 0)
 196  229                  goto out;
↓ open down ↓ 220 lines elided ↑ open up ↑
 417  450                                  ret = err;
 418  451                  }
 419  452          }
 420  453  
 421  454          free(buf);
 422  455          return (ret);
 423  456  }
 424  457  
 425  458  /*
 426  459   * Iterate over all children, snapshots and filesystems
 427      - * Process snapshots before filesystems because they are nearer the input
 428      - * handle: this is extremely important when used with zfs_iter_f functions
 429      - * looking for data, following the logic that we would like to find it as soon
 430      - * and as close as possible.
 431  460   */
 432  461  int
 433  462  zfs_iter_children(zfs_handle_t *zhp, zfs_iter_f func, void *data)
 434  463  {
 435  464          int ret;
 436  465  
 437      -        if ((ret = zfs_iter_snapshots(zhp, B_FALSE, func, data)) != 0)
      466 +        if ((ret = zfs_iter_filesystems(zhp, func, data)) != 0)
 438  467                  return (ret);
 439  468  
 440      -        return (zfs_iter_filesystems(zhp, func, data));
      469 +        return (zfs_iter_snapshots(zhp, B_FALSE, func, data));
 441  470  }
 442  471  
 443  472  
 444  473  typedef struct iter_stack_frame {
 445  474          struct iter_stack_frame *next;
 446  475          zfs_handle_t *zhp;
 447  476  } iter_stack_frame_t;
 448  477  
 449  478  typedef struct iter_dependents_arg {
 450  479          boolean_t first;
↓ open down ↓ 44 lines elided ↑ open up ↑
 495  524                  }
 496  525  
 497  526                  isf.zhp = zhp;
 498  527                  isf.next = ida->stack;
 499  528                  ida->stack = &isf;
 500  529                  err = zfs_iter_filesystems(zhp, iter_dependents_cb, ida);
 501  530                  if (err == 0) {
 502  531                          err = zfs_iter_snapshots(zhp, B_FALSE,
 503  532                              iter_dependents_cb, ida);
 504  533                  }
      534 +
      535 +                if (err == 0) {
      536 +                        err = zfs_iter_autosnapshots(zhp, B_FALSE,
      537 +                            iter_dependents_cb, ida);
      538 +                }
      539 +
 505  540                  ida->stack = isf.next;
 506  541          }
 507  542  
 508  543          if (!first && err == 0)
 509  544                  err = ida->func(zhp, ida->data);
 510  545          else
 511  546                  zfs_close(zhp);
 512  547  
 513  548          return (err);
 514  549  }
↓ open down ↓ 13 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX