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_fini()
|
||||
|
||||
boolean_t zfs_mod_supported(const char *, const char *);
|
||||
#endif
|
||||
|
||||
#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_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 */
|
||||
|
|
|
@ -159,6 +159,32 @@ deps_contains_feature(const spa_feature_t *deps, const spa_feature_t feature)
|
|||
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
|
||||
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)
|
||||
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,
|
||||
ZFS_SYSFS_POOL_FEATURES, name);
|
||||
|
||||
if (len > 0) {
|
||||
supported = !!(stat64(path, &statbuf) == 0);
|
||||
free(path);
|
||||
}
|
||||
return (supported);
|
||||
return (zfs_mod_supported(ZFS_SYSFS_POOL_FEATURES, name));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -81,20 +81,8 @@ zfs_mod_supported_prop(const char *name, zfs_type_t type)
|
|||
#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);
|
||||
return (zfs_mod_supported(type == ZFS_TYPE_POOL ?
|
||||
ZFS_SYSFS_POOL_PROPERTIES : ZFS_SYSFS_DATASET_PROPERTIES, name));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -572,11 +572,16 @@ zfs_sysfs_properties_init(zfs_mod_kobj_t *zfs_kobj, struct kobject *parent,
|
|||
void
|
||||
zfs_sysfs_init(void)
|
||||
{
|
||||
struct kobject *parent =
|
||||
&(((struct module *)(THIS_MODULE))->mkobj).kobj;
|
||||
struct kobject *parent;
|
||||
#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;
|
||||
|
||||
ASSERT(parent != NULL);
|
||||
if (parent == NULL)
|
||||
return;
|
||||
|
||||
err = zfs_kernel_features_init(&kernel_features_kobj, parent);
|
||||
if (err)
|
||||
|
|
Loading…
Reference in New Issue