Print this page
NEX-17003 Autosnapshots should not be managed via .zfs/snapshot
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
6093 zfsctl_shares_lookup should only VN_RELE() on zfs_zget() success
Reviewed by: Gordon Ross <gwr@nexenta.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Robert Mustacchi <rm@joyent.com>
5766 Avoid 128K kmem allocations in mzap_upgrade()
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Steven Hartland <killing@multiplay.co.uk>
Approved by: Rich Lowe <richlowe@richlowe.net>
5768 zfsctl_snapshot_inactive() can leak a vnode hold
Reviewed by: George Wilson <george@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Adam Leventhal <adam.leventhal@delphix.com>
Reviewed by: Bayard Bell <buffer.g.overflow@gmail.com>
Approved by: Rich Lowe <richlowe@richlowe.net>
        
@@ -20,10 +20,11 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2012, 2017 by Delphix. All rights reserved.
  * Copyright 2015, OmniTI Computer Consulting, Inc. All rights reserved.
+ * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  */
 
 /*
  * ZFS control directory (a.k.a. ".zfs")
  *
@@ -75,10 +76,11 @@
 #include <sys/dmu.h>
 #include <sys/dsl_destroy.h>
 #include <sys/dsl_deleg.h>
 #include <sys/mount.h>
 #include <sys/sunddi.h>
+#include <sys/autosnap.h>
 
 #include "zfs_namecheck.h"
 
 typedef struct zfsctl_node {
         gfs_dir_t       zc_gfs_private;
@@ -739,11 +741,12 @@
         char name[ZFS_MAX_DATASET_NAME_LEN];
         int err;
         static enum symfollow follow = NO_FOLLOW;
         static enum uio_seg seg = UIO_SYSSPACE;
 
-        if (zfs_component_namecheck(dirname, NULL, NULL) != 0)
+        if (zfs_component_namecheck(dirname, NULL, NULL) != 0 ||
+            autosnap_check_name(dirname))
                 return (SET_ERROR(EILSEQ));
 
         dmu_objset_name(zfsvfs->z_os, name);
 
         *vpp = NULL;
@@ -868,10 +871,17 @@
                  * forcing EILSEQ to ENOENT.
                  * Since shell ultimately passes "*" or "?" as name to lookup
                  */
                 return (err == EILSEQ ? ENOENT : err);
         }
+
+        if (autosnap_check_name(strchr(snapname, '@'))) {
+                mutex_exit(&sdp->sd_lock);
+                ZFS_EXIT(zfsvfs);
+                return (SET_ERROR(ENOENT));
+        }
+
         if (dmu_objset_hold(snapname, FTAG, &snap) != 0) {
                 mutex_exit(&sdp->sd_lock);
                 ZFS_EXIT(zfsvfs);
                 return (SET_ERROR(ENOENT));
         }
@@ -985,12 +995,14 @@
 
         ZFS_ENTER(zfsvfs);
 
         cookie = *offp;
         dsl_pool_config_enter(dmu_objset_pool(zfsvfs->z_os), FTAG);
+        do {
         error = dmu_snapshot_list_next(zfsvfs->z_os,
             sizeof (snapname), snapname, &id, &cookie, &case_conflict);
+        } while (error == 0 && autosnap_check_name(snapname));
         dsl_pool_config_exit(dmu_objset_pool(zfsvfs->z_os), FTAG);
         if (error) {
                 ZFS_EXIT(zfsvfs);
                 if (error == ENOENT) {
                         *eofp = 1;