diff options
author | Don Brady <[email protected]> | 2018-09-02 15:09:53 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-09-02 12:09:53 -0700 |
commit | e8bcb693d6a19962291e4429f2dc4ce60693bef7 (patch) | |
tree | a4afbb8d0562aae23e9fd8fd561fd2182b14db8e /module/zcommon/zprop_common.c | |
parent | bb91178e60df553071ce2e18b0067ef703f7b583 (diff) |
Add zfs module feature and property info to sysfs
This extends our sysfs '/sys/module/zfs' entry to include feature
and property attributes. The primary consumer of this information
is user processes, like the zfs CLI, that need to know what the
current loaded ZFS module supports. The libzfs binary will consult
this information when instantiating the zfs and zpool property
tables and the pool features table.
This introduces 4 kernel objects (dirs) into '/sys/module/zfs'
with corresponding attributes (files):
features.runtime
features.pool
properties.dataset
properties.pool
Reviewed-by: Matthew Ahrens <[email protected]>
Reviewed-by: Tony Hutter <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Don Brady <[email protected]>
Closes #7706
Diffstat (limited to 'module/zcommon/zprop_common.c')
-rw-r--r-- | module/zcommon/zprop_common.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/module/zcommon/zprop_common.c b/module/zcommon/zprop_common.c index 838988a4c..0ce2ee762 100644 --- a/module/zcommon/zprop_common.c +++ b/module/zcommon/zprop_common.c @@ -34,6 +34,7 @@ #include <sys/spa.h> #include <sys/zfs_acl.h> #include <sys/zfs_ioctl.h> +#include <sys/zfs_sysfs.h> #include <sys/zfs_znode.h> #include <sys/fs/zfs.h> @@ -48,6 +49,7 @@ #include <stdlib.h> #include <string.h> #include <ctype.h> +#include <sys/stat.h> #endif static zprop_desc_t * @@ -68,6 +70,34 @@ zprop_get_numprops(zfs_type_t type) return (ZFS_NUM_PROPS); } +static boolean_t +zfs_mod_supported_prop(const char *name, zfs_type_t type) +{ +/* + * The zfs module spa_feature_table[], whether in-kernel or in libzpool, + * always supports all the properties. libzfs needs to query the running + * module, via sysfs, to determine which properties are supported. + */ +#if defined(_KERNEL) || defined(LIB_ZPOOL_BUILD) + return (B_TRUE); +#else + struct stat64 statbuf; + char *path; + boolean_t supported = B_FALSE; + int len; + + len = asprintf(&path, "%s/%s/%s", ZFS_SYSFS_DIR, + (type == ZFS_TYPE_POOL) ? ZFS_SYSFS_POOL_PROPERTIES : + ZFS_SYSFS_DATASET_PROPERTIES, name); + + if (len > 0) { + supported = !!(stat64(path, &statbuf) == 0); + free(path); + } + return (supported); +#endif +} + void zprop_register_impl(int prop, const char *name, zprop_type_t type, uint64_t numdefault, const char *strdefault, zprop_attr_t attr, @@ -94,6 +124,7 @@ zprop_register_impl(int prop, const char *name, zprop_type_t type, pd->pd_colname = colname; pd->pd_rightalign = rightalign; pd->pd_visible = visible; + pd->pd_zfs_mod_supported = zfs_mod_supported_prop(name, objset_types); pd->pd_table = idx_tbl; pd->pd_table_size = 0; while (idx_tbl && (idx_tbl++)->pi_name != NULL) @@ -193,6 +224,7 @@ zprop_iter_common(zprop_func func, void *cb, boolean_t show_all, prop = ZPROP_CONT; for (i = 0; i < num_props; i++) { if ((order[i]->pd_visible || show_all) && + order[i]->pd_zfs_mod_supported && (func(order[i]->pd_propnum, cb) != ZPROP_CONT)) { prop = order[i]->pd_propnum; break; |