Print this page
NEX-14164 'modified' property doesn't work for autosnapshots
Reviewed by: Alex Deiter <alex.deiter@nexenta.com>
Reviewed by: Alexey Komarov <alexey.komarov@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-9406 Add a property to show that a dataset has been modified since a snapshot
Reviewed by: Alexey Komarov <alexey.komarov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-9436 Rate limiting controls (was QoS) per ZFS dataset, updates from demo
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
NEX-8852 Quality-of-Service (QoS) controls per NFS share
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
NEX-6269 Unwanted inheritance of the sharesmb ZFS property
Reviewed by: Yuri Pankov <yuri.pankov@nexeneta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexeneta.com>
NEX-5795 Rename 'wrc' as 'wbc' in the source and in the tech docs
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
NEX-5318 Cleanup specialclass property (obsolete, not used) and fix related meta-to-special case
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
NEX-5058 WBC: Race between the purging of window and opening new one
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
NEX-2830 ZFS smart compression
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-4934 Add capability to remove special vdev
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
2605 want to resume interrupted zfs send
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Richard Elling <Richard.Elling@RichardElling.com>
Reviewed by: Xin Li <delphij@freebsd.org>
Reviewed by: Arne Jansen <sensille@gmx.net>
Approved by: Dan McDonald <danmcd@omniti.com>
4185 add new cryptographic checksums to ZFS: SHA-512, Skein, Edon-R (fix studio build)
4185 add new cryptographic checksums to ZFS: SHA-512, Skein, Edon-R
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Approved by: Garrett D'Amore <garrett@damore.org>
NEX-4476 WRC: Allow to use write back cache per tree of datasets
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
Revert "NEX-4476 WRC: Allow to use write back cache per tree of datasets"
This reverts commit fe97b74444278a6f36fec93179133641296312da.
NEX-4476 WRC: Allow to use write back cache per tree of datasets
Reviewed by: Alek Pinchuk <alek.pinchuk@nexenta.com>
Reviewed by: Alex Aizman <alex.aizman@nexenta.com>
NEX-4044 remove sha1crc32 in preparation with upstream merge of edon-r and skien
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Alek Pinchuk <alek@nexenta.com>
Conflicts:
        usr/src/uts/common/fs/zfs/sys/zio_checksum.h
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>
NEX-3558 KRRP Integration
OS-80 support for vdev and CoS properties for the new I/O scheduler
OS-95 lint warning introduced by OS-61
Make special vdev subtree topology the same as regular vdev subtree to simplify testcase setup
Fixup merge issues
Issue #7: add cacheability to the properties
          Contributors: Boris Protopopov
Issues #7: Reconsile L2ARC and "special" use by datasets
Support for secondarycache=data option
Align mutex tables in arc.c and dbuf.c to 64 bytes (cache line), place each kmutex_t on cache line by itself to avoid false sharing
Fixup merge results
re #12585 rb4049 ZFS++ work port - refactoring to improve separation of open/closed code, bug fixes, performance improvements - open code
Bug 11205: add missing libzfs_closed_stubs.c to fix opensource-only build.
ZFS plus work: special vdevs, cos, cos/vdev properties

@@ -21,17 +21,19 @@
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2011, 2016 by Delphix. All rights reserved.
  * Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
  * Copyright (c) 2014 Integros [integros.com]
+ * Copyright 2017 Nexenta Systems, Inc. All rights reserved.
  * Copyright 2016, Joyent, Inc.
  */
 
 /* Portions Copyright 2010 Robert Milkowski */
 
 #include <sys/zio.h>
 #include <sys/spa.h>
+#include <sys/special.h>
 #include <sys/u8_textprep.h>
 #include <sys/zfs_acl.h>
 #include <sys/zfs_ioctl.h>
 #include <sys/zfs_znode.h>
 

@@ -187,24 +189,38 @@
                 { "latency",    ZFS_LOGBIAS_LATENCY },
                 { "throughput", ZFS_LOGBIAS_THROUGHPUT },
                 { NULL }
         };
 
+        static zprop_index_t wbc_modes_table[] = {
+                { "off",                ZFS_WBC_MODE_OFF },
+                { "on",                 ZFS_WBC_MODE_ON },
+                { NULL }
+        };
+
         static zprop_index_t canmount_table[] = {
                 { "off",        ZFS_CANMOUNT_OFF },
                 { "on",         ZFS_CANMOUNT_ON },
                 { "noauto",     ZFS_CANMOUNT_NOAUTO },
                 { NULL }
         };
 
-        static zprop_index_t cache_table[] = {
+        static zprop_index_t primary_cache_table[] = {
                 { "none",       ZFS_CACHE_NONE },
                 { "metadata",   ZFS_CACHE_METADATA },
                 { "all",        ZFS_CACHE_ALL },
                 { NULL }
         };
 
+        static zprop_index_t secondary_cache_table[] = {
+                { "none",       ZFS_CACHE_NONE },
+                { "metadata",   ZFS_CACHE_METADATA },
+                { "all",        ZFS_CACHE_ALL },
+                { "data",       ZFS_CACHE_DATA },
+                { NULL }
+        };
+
         static zprop_index_t sync_table[] = {
                 { "standard",   ZFS_SYNC_STANDARD },
                 { "always",     ZFS_SYNC_ALWAYS },
                 { "disabled",   ZFS_SYNC_DISABLED },
                 { NULL }

@@ -214,10 +230,17 @@
                 { "all",        ZFS_REDUNDANT_METADATA_ALL },
                 { "most",       ZFS_REDUNDANT_METADATA_MOST },
                 { NULL }
         };
 
+        static zprop_index_t meta_placement_table[] = {
+                { "off",        META_PLACEMENT_OFF},
+                { "on",         META_PLACEMENT_ON},
+                { "dual",       META_PLACEMENT_DUAL},
+                { NULL }
+        };
+
         /* inherit index properties */
         zprop_register_index(ZFS_PROP_REDUNDANT_METADATA, "redundant_metadata",
             ZFS_REDUNDANT_METADATA_ALL,
             PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
             "all | most", "REDUND_MD",

@@ -254,93 +277,108 @@
         zprop_register_index(ZFS_PROP_COPIES, "copies", 1, PROP_INHERIT,
             ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
             "1 | 2 | 3", "COPIES", copies_table);
         zprop_register_index(ZFS_PROP_PRIMARYCACHE, "primarycache",
             ZFS_CACHE_ALL, PROP_INHERIT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME,
-            "all | none | metadata", "PRIMARYCACHE", cache_table);
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP |
+            ZFS_TYPE_VOLUME,
+            "all | none | metadata", "PRIMARYCACHE", primary_cache_table);
         zprop_register_index(ZFS_PROP_SECONDARYCACHE, "secondarycache",
             ZFS_CACHE_ALL, PROP_INHERIT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME,
-            "all | none | metadata", "SECONDARYCACHE", cache_table);
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP |
+            ZFS_TYPE_VOLUME,
+            "all | none | metadata | data", "SECONDARYCACHE",
+            secondary_cache_table);
         zprop_register_index(ZFS_PROP_LOGBIAS, "logbias", ZFS_LOGBIAS_LATENCY,
             PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
             "latency | throughput", "LOGBIAS", logbias_table);
+        zprop_register_index(ZFS_PROP_WBC_MODE, "wbc_mode", ZFS_WBC_MODE_OFF,
+            PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
+            "off | on", "WBC_MODE", wbc_modes_table);
+        zprop_register_index(ZFS_PROP_ZPL_META_TO_METADEV,
+            "zpl_meta_to_metadev", META_PLACEMENT_OFF, PROP_INHERIT,
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP |
+            ZFS_TYPE_VOLUME,
+            "on | dual | off", "ZPLMETA_TO_MD", meta_placement_table);
 
         /* inherit index (boolean) properties */
         zprop_register_index(ZFS_PROP_ATIME, "atime", 1, PROP_INHERIT,
             ZFS_TYPE_FILESYSTEM, "on | off", "ATIME", boolean_table);
         zprop_register_index(ZFS_PROP_DEVICES, "devices", 1, PROP_INHERIT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "DEVICES",
-            boolean_table);
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
+            "on | off", "DEVICES", boolean_table);
         zprop_register_index(ZFS_PROP_EXEC, "exec", 1, PROP_INHERIT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "EXEC",
-            boolean_table);
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
+            "on | off", "EXEC", boolean_table);
         zprop_register_index(ZFS_PROP_SETUID, "setuid", 1, PROP_INHERIT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "SETUID",
-            boolean_table);
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
+            "on | off", "SETUID", boolean_table);
         zprop_register_index(ZFS_PROP_READONLY, "readonly", 0, PROP_INHERIT,
             ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "on | off", "RDONLY",
             boolean_table);
         zprop_register_index(ZFS_PROP_ZONED, "zoned", 0, PROP_INHERIT,
             ZFS_TYPE_FILESYSTEM, "on | off", "ZONED", boolean_table);
         zprop_register_index(ZFS_PROP_XATTR, "xattr", 1, PROP_INHERIT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "XATTR",
-            boolean_table);
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
+            "on | off", "XATTR", boolean_table);
         zprop_register_index(ZFS_PROP_VSCAN, "vscan", 0, PROP_INHERIT,
             ZFS_TYPE_FILESYSTEM, "on | off", "VSCAN",
             boolean_table);
         zprop_register_index(ZFS_PROP_NBMAND, "nbmand", 0, PROP_INHERIT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "NBMAND",
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
+            "on | off", "NBMAND", boolean_table);
+        zprop_register_index(ZFS_PROP_SMARTCOMPRESSION, "smartcompression", 1,
+            PROP_INHERIT, ZFS_TYPE_FILESYSTEM, "on | off", "SMARTCOMPRESSION",
             boolean_table);
 
         /* default index properties */
         zprop_register_index(ZFS_PROP_VERSION, "version", 0, PROP_DEFAULT,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT,
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
             "1 | 2 | 3 | 4 | 5 | current", "VERSION", version_table);
         zprop_register_index(ZFS_PROP_CANMOUNT, "canmount", ZFS_CANMOUNT_ON,
             PROP_DEFAULT, ZFS_TYPE_FILESYSTEM, "on | off | noauto",
             "CANMOUNT", canmount_table);
 
         /* readonly index (boolean) properties */
         zprop_register_index(ZFS_PROP_MOUNTED, "mounted", 0, PROP_READONLY,
             ZFS_TYPE_FILESYSTEM, "yes | no", "MOUNTED", boolean_table);
         zprop_register_index(ZFS_PROP_DEFER_DESTROY, "defer_destroy", 0,
-            PROP_READONLY, ZFS_TYPE_SNAPSHOT, "yes | no", "DEFER_DESTROY",
-            boolean_table);
+            PROP_READONLY, ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
+            "yes | no", "DEFER_DESTROY", boolean_table);
 
         /* set once index properties */
         zprop_register_index(ZFS_PROP_NORMALIZE, "normalization", 0,
-            PROP_ONETIME, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT,
+            PROP_ONETIME, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT |
+            ZFS_TYPE_AUTOSNAP,
             "none | formC | formD | formKC | formKD", "NORMALIZATION",
             normalize_table);
         zprop_register_index(ZFS_PROP_CASE, "casesensitivity",
             ZFS_CASE_SENSITIVE, PROP_ONETIME, ZFS_TYPE_FILESYSTEM |
-            ZFS_TYPE_SNAPSHOT,
+            ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
             "sensitive | insensitive | mixed", "CASE", case_table);
 
         /* set once index (boolean) properties */
         zprop_register_index(ZFS_PROP_UTF8ONLY, "utf8only", 0, PROP_ONETIME,
-            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT,
+            ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP,
             "on | off", "UTF8ONLY", boolean_table);
 
         /* string properties */
         zprop_register_string(ZFS_PROP_ORIGIN, "origin", NULL, PROP_READONLY,
             ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<snapshot>", "ORIGIN");
         zprop_register_string(ZFS_PROP_CLONES, "clones", NULL, PROP_READONLY,
-            ZFS_TYPE_SNAPSHOT, "<dataset>[,...]", "CLONES");
+            ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP, "<dataset>[,...]", "CLONES");
         zprop_register_string(ZFS_PROP_MOUNTPOINT, "mountpoint", "/",
             PROP_INHERIT, ZFS_TYPE_FILESYSTEM, "<path> | legacy | none",
             "MOUNTPOINT");
         zprop_register_string(ZFS_PROP_SHARENFS, "sharenfs", "off",
             PROP_INHERIT, ZFS_TYPE_FILESYSTEM, "on | off | share(1M) options",
             "SHARENFS");
         zprop_register_string(ZFS_PROP_TYPE, "type", NULL, PROP_READONLY,
             ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK,
-            "filesystem | volume | snapshot | bookmark", "TYPE");
+            "filesystem | volume | snapshot | autosnap | bookmark", "TYPE");
         zprop_register_string(ZFS_PROP_SHARESMB, "sharesmb", "off",
-            PROP_INHERIT, ZFS_TYPE_FILESYSTEM,
+            PROP_DEFAULT, ZFS_TYPE_FILESYSTEM,
             "on | off | sharemgr(1M) options", "SHARESMB");
         zprop_register_string(ZFS_PROP_MLSLABEL, "mlslabel",
             ZFS_MLSLABEL_DEFAULT, PROP_INHERIT, ZFS_TYPE_DATASET,
             "<sensitivity label>", "MLSLABEL");
         zprop_register_string(ZFS_PROP_RECEIVE_RESUME_TOKEN,

@@ -375,11 +413,11 @@
             "USEDCHILD");
         zprop_register_number(ZFS_PROP_USEDREFRESERV, "usedbyrefreservation", 0,
             PROP_READONLY,
             ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", "USEDREFRESERV");
         zprop_register_number(ZFS_PROP_USERREFS, "userrefs", 0, PROP_READONLY,
-            ZFS_TYPE_SNAPSHOT, "<count>", "USERREFS");
+            ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP, "<count>", "USERREFS");
         zprop_register_number(ZFS_PROP_WRITTEN, "written", 0, PROP_READONLY,
             ZFS_TYPE_DATASET, "<size>", "WRITTEN");
         zprop_register_number(ZFS_PROP_LOGICALUSED, "logicalused", 0,
             PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>",
             "LUSED");

@@ -409,21 +447,22 @@
             UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM,
             "<count> | none", "FSLIMIT");
         zprop_register_number(ZFS_PROP_SNAPSHOT_LIMIT, "snapshot_limit",
             UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
             "<count> | none", "SSLIMIT");
+        zprop_register_number(ZFS_PROP_RATE_LIMIT, "rate_limit",
+            UINT64_MAX, PROP_DEFAULT, ZFS_TYPE_FILESYSTEM,
+            "<count> | none", "RATELIMIT");
 
         /* inherit number properties */
         zprop_register_number(ZFS_PROP_RECORDSIZE, "recordsize",
             SPA_OLD_MAXBLOCKSIZE, PROP_INHERIT,
             ZFS_TYPE_FILESYSTEM, "512 to 1M, power of 2", "RECSIZE");
 
         /* hidden properties */
         zprop_register_hidden(ZFS_PROP_CREATETXG, "createtxg", PROP_TYPE_NUMBER,
             PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "CREATETXG");
-        zprop_register_hidden(ZFS_PROP_REMAPTXG, "remaptxg", PROP_TYPE_NUMBER,
-            PROP_READONLY, ZFS_TYPE_DATASET, "REMAPTXG");
         zprop_register_hidden(ZFS_PROP_NUMCLONES, "numclones", PROP_TYPE_NUMBER,
             PROP_READONLY, ZFS_TYPE_SNAPSHOT, "NUMCLONES");
         zprop_register_hidden(ZFS_PROP_NAME, "name", PROP_TYPE_STRING,
             PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK, "NAME");
         zprop_register_hidden(ZFS_PROP_ISCSIOPTIONS, "iscsioptions",

@@ -442,10 +481,15 @@
             PROP_READONLY, ZFS_TYPE_DATASET, "OBJSETID");
         zprop_register_hidden(ZFS_PROP_INCONSISTENT, "inconsistent",
             PROP_TYPE_NUMBER, PROP_READONLY, ZFS_TYPE_DATASET, "INCONSISTENT");
         zprop_register_hidden(ZFS_PROP_PREV_SNAP, "prevsnap", PROP_TYPE_STRING,
             PROP_READONLY, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "PREVSNAP");
+        zprop_register_hidden(ZFS_PROP_LSTXG, "lstxg", PROP_TYPE_NUMBER,
+            PROP_READONLY, ZFS_TYPE_DATASET, "LSTXG");
+        zprop_register_index_hidden(ZFS_PROP_MODIFIED, "modified", 0,
+            PROP_READONLY, ZFS_TYPE_SNAPSHOT | ZFS_TYPE_AUTOSNAP, "yes | no",
+            "MODIFIED", boolean_table);
 
         /* oddball properties */
         zprop_register_impl(ZFS_PROP_CREATION, "creation", PROP_TYPE_NUMBER, 0,
             NULL, PROP_READONLY, ZFS_TYPE_DATASET | ZFS_TYPE_BOOKMARK,
             "<date>", "CREATION", B_FALSE, B_TRUE, NULL);