summaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
Diffstat (limited to 'module')
-rw-r--r--module/zcommon/zfs_prop.c6
-rw-r--r--module/zcommon/zprop_common.c8
-rw-r--r--module/zfs/dsl_prop.c2
3 files changed, 11 insertions, 5 deletions
diff --git a/module/zcommon/zfs_prop.c b/module/zcommon/zfs_prop.c
index dd456b59a..d81ff3bc6 100644
--- a/module/zcommon/zfs_prop.c
+++ b/module/zcommon/zfs_prop.c
@@ -391,7 +391,7 @@ zfs_prop_init(void)
PROP_DEFAULT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
"<size> | none", "RESERV");
zprop_register_number(ZFS_PROP_VOLSIZE, "volsize", 0, PROP_DEFAULT,
- ZFS_TYPE_VOLUME, "<size>", "VOLSIZE");
+ ZFS_TYPE_SNAPSHOT | ZFS_TYPE_VOLUME, "<size>", "VOLSIZE");
zprop_register_number(ZFS_PROP_REFQUOTA, "refquota", 0, PROP_DEFAULT,
ZFS_TYPE_FILESYSTEM, "<size> | none", "REFQUOTA");
zprop_register_number(ZFS_PROP_REFRESERVATION, "refreservation", 0,
@@ -555,9 +555,9 @@ zfs_prop_random_value(zfs_prop_t prop, uint64_t seed)
* Returns TRUE if the property applies to any of the given dataset types.
*/
boolean_t
-zfs_prop_valid_for_type(int prop, zfs_type_t types)
+zfs_prop_valid_for_type(int prop, zfs_type_t types, boolean_t headcheck)
{
- return (zprop_valid_for_type(prop, types));
+ return (zprop_valid_for_type(prop, types, headcheck));
}
zprop_type_t
diff --git a/module/zcommon/zprop_common.c b/module/zcommon/zprop_common.c
index 6d9f89a98..035f3378d 100644
--- a/module/zcommon/zprop_common.c
+++ b/module/zcommon/zprop_common.c
@@ -351,9 +351,13 @@ zprop_values(int prop, zfs_type_t type)
/*
* Returns TRUE if the property applies to any of the given dataset types.
+ *
+ * If headcheck is set, the check is being made against the head dataset
+ * type of a snapshot which requires to return B_TRUE when the property
+ * is only valid for snapshots.
*/
boolean_t
-zprop_valid_for_type(int prop, zfs_type_t type)
+zprop_valid_for_type(int prop, zfs_type_t type, boolean_t headcheck)
{
zprop_desc_t *prop_tbl;
@@ -362,6 +366,8 @@ zprop_valid_for_type(int prop, zfs_type_t type)
ASSERT(prop < zprop_get_numprops(type));
prop_tbl = zprop_get_proptable(type);
+ if (headcheck && prop_tbl[prop].pd_types == ZFS_TYPE_SNAPSHOT)
+ return (B_TRUE);
return ((prop_tbl[prop].pd_types & type) != 0);
}
diff --git a/module/zfs/dsl_prop.c b/module/zfs/dsl_prop.c
index 079ef9742..ded0da991 100644
--- a/module/zfs/dsl_prop.c
+++ b/module/zfs/dsl_prop.c
@@ -925,7 +925,7 @@ dsl_prop_get_all_impl(objset_t *mos, uint64_t propobj,
/* Skip properties not valid for this type. */
if ((flags & DSL_PROP_GET_SNAPSHOT) && prop != ZPROP_INVAL &&
- !zfs_prop_valid_for_type(prop, ZFS_TYPE_SNAPSHOT))
+ !zfs_prop_valid_for_type(prop, ZFS_TYPE_SNAPSHOT, B_FALSE))
continue;
/* Skip properties already defined. */