Fix in-kernel sysfs entries
The recent sysfs zfs properties feature breaks the in-kernel builds of zfs (sans module). When not built as a module add the sysfs entries under /sys/fs/zfs/. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Don Brady <don.brady@delphix.com> Closes #7868 Closes #7872
This commit is contained in:
parent
e7b677aa5d
commit
73a5ec30bf
|
@ -35,6 +35,7 @@ void zfs_sysfs_fini(void);
|
||||||
#define zfs_sysfs_init()
|
#define zfs_sysfs_init()
|
||||||
#define zfs_sysfs_fini()
|
#define zfs_sysfs_fini()
|
||||||
|
|
||||||
|
boolean_t zfs_mod_supported(const char *, const char *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ZFS_SYSFS_POOL_PROPERTIES "properties.pool"
|
#define ZFS_SYSFS_POOL_PROPERTIES "properties.pool"
|
||||||
|
@ -43,5 +44,7 @@ void zfs_sysfs_fini(void);
|
||||||
#define ZFS_SYSFS_POOL_FEATURES "features.pool"
|
#define ZFS_SYSFS_POOL_FEATURES "features.pool"
|
||||||
|
|
||||||
#define ZFS_SYSFS_DIR "/sys/module/zfs"
|
#define ZFS_SYSFS_DIR "/sys/module/zfs"
|
||||||
|
/* Alternate location when ZFS is built as part of the kernel (rare) */
|
||||||
|
#define ZFS_SYSFS_ALT_DIR "/sys/fs/zfs"
|
||||||
|
|
||||||
#endif /* _SYS_ZFS_SYSFS_H */
|
#endif /* _SYS_ZFS_SYSFS_H */
|
||||||
|
|
|
@ -159,6 +159,32 @@ deps_contains_feature(const spa_feature_t *deps, const spa_feature_t feature)
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(_KERNEL) && !defined(LIB_ZPOOL_BUILD)
|
||||||
|
static boolean_t
|
||||||
|
zfs_mod_supported_impl(const char *scope, const char *name, const char *sysfs)
|
||||||
|
{
|
||||||
|
struct stat64 statbuf;
|
||||||
|
char *path;
|
||||||
|
boolean_t supported = B_FALSE;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = asprintf(&path, "%s/%s/%s", sysfs, scope, name);
|
||||||
|
|
||||||
|
if (len > 0) {
|
||||||
|
supported = !!(stat64(path, &statbuf) == 0);
|
||||||
|
free(path);
|
||||||
|
}
|
||||||
|
return (supported);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean_t
|
||||||
|
zfs_mod_supported(const char *scope, const char *name)
|
||||||
|
{
|
||||||
|
return (zfs_mod_supported_impl(scope, name, ZFS_SYSFS_DIR) ||
|
||||||
|
zfs_mod_supported_impl(scope, name, ZFS_SYSFS_ALT_DIR));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static boolean_t
|
static boolean_t
|
||||||
zfs_mod_supported_feature(const char *name)
|
zfs_mod_supported_feature(const char *name)
|
||||||
{
|
{
|
||||||
|
@ -171,19 +197,7 @@ zfs_mod_supported_feature(const char *name)
|
||||||
#if defined(_KERNEL) || defined(LIB_ZPOOL_BUILD)
|
#if defined(_KERNEL) || defined(LIB_ZPOOL_BUILD)
|
||||||
return (B_TRUE);
|
return (B_TRUE);
|
||||||
#else
|
#else
|
||||||
struct stat64 statbuf;
|
return (zfs_mod_supported(ZFS_SYSFS_POOL_FEATURES, name));
|
||||||
char *path;
|
|
||||||
boolean_t supported = B_FALSE;
|
|
||||||
int len;
|
|
||||||
|
|
||||||
len = asprintf(&path, "%s/%s/%s", ZFS_SYSFS_DIR,
|
|
||||||
ZFS_SYSFS_POOL_FEATURES, name);
|
|
||||||
|
|
||||||
if (len > 0) {
|
|
||||||
supported = !!(stat64(path, &statbuf) == 0);
|
|
||||||
free(path);
|
|
||||||
}
|
|
||||||
return (supported);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,20 +81,8 @@ zfs_mod_supported_prop(const char *name, zfs_type_t type)
|
||||||
#if defined(_KERNEL) || defined(LIB_ZPOOL_BUILD)
|
#if defined(_KERNEL) || defined(LIB_ZPOOL_BUILD)
|
||||||
return (B_TRUE);
|
return (B_TRUE);
|
||||||
#else
|
#else
|
||||||
struct stat64 statbuf;
|
return (zfs_mod_supported(type == ZFS_TYPE_POOL ?
|
||||||
char *path;
|
ZFS_SYSFS_POOL_PROPERTIES : ZFS_SYSFS_DATASET_PROPERTIES, name));
|
||||||
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -572,11 +572,16 @@ zfs_sysfs_properties_init(zfs_mod_kobj_t *zfs_kobj, struct kobject *parent,
|
||||||
void
|
void
|
||||||
zfs_sysfs_init(void)
|
zfs_sysfs_init(void)
|
||||||
{
|
{
|
||||||
struct kobject *parent =
|
struct kobject *parent;
|
||||||
&(((struct module *)(THIS_MODULE))->mkobj).kobj;
|
#if defined(CONFIG_ZFS) && !defined(CONFIG_ZFS_MODULE)
|
||||||
|
parent = kobject_create_and_add("zfs", fs_kobj);
|
||||||
|
#else
|
||||||
|
parent = &(((struct module *)(THIS_MODULE))->mkobj).kobj;
|
||||||
|
#endif
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
ASSERT(parent != NULL);
|
if (parent == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
err = zfs_kernel_features_init(&kernel_features_kobj, parent);
|
err = zfs_kernel_features_init(&kernel_features_kobj, parent);
|
||||||
if (err)
|
if (err)
|
||||||
|
|
Loading…
Reference in New Issue