]> granicus.if.org Git - zfs/commitdiff
Fix in-kernel sysfs entries
authorDon Brady <don.brady@delphix.com>
Fri, 7 Sep 2018 04:44:52 +0000 (22:44 -0600)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 7 Sep 2018 04:44:52 +0000 (21:44 -0700)
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

include/sys/zfs_sysfs.h
module/zcommon/zfeature_common.c
module/zcommon/zprop_common.c
module/zfs/zfs_sysfs.c

index 7c4a0304f8da23237f3c17345ee7e15083372ab5..925d7ad542f7e7c82ab17acfca018c99727ef1aa 100644 (file)
@@ -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 */
index c86f98ac264fd77723b8d09fc7b496e9fc2105b1..e630481cbff31e55b121002e2823cede8982365e 100644 (file)
@@ -159,31 +159,45 @@ 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_feature(const char *name)
+zfs_mod_supported_impl(const char *scope, const char *name, const char *sysfs)
 {
-       /*
-        * The zfs module spa_feature_table[], whether in-kernel or in
-        * libzpool, always supports all the features. libzfs needs to
-        * query the running module, via sysfs, to determine which
-        * features 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,
-           ZFS_SYSFS_POOL_FEATURES, name);
+       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)
+{
+       /*
+        * The zfs module spa_feature_table[], whether in-kernel or in
+        * libzpool, always supports all the features. libzfs needs to
+        * query the running module, via sysfs, to determine which
+        * features are supported.
+        */
+#if defined(_KERNEL) || defined(LIB_ZPOOL_BUILD)
+       return (B_TRUE);
+#else
+       return (zfs_mod_supported(ZFS_SYSFS_POOL_FEATURES, name));
 #endif
 }
 
index 0ce2ee762f588b9029d0b6b805841c7e9fbfcaf2..4d856cec1ebe477f265e87e2efa4baa7b870cf02 100644 (file)
@@ -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
 }
 
index 1eb7f9448cb63645797f883c1743eebdf33975bb..42822b2f230f4009fc630eaae4f1350dbc69bce0 100644 (file)
@@ -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)