]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 5.18 compat: kobj_type.default_attrs replaced with default_groups
authorнаб <nabijaczleweli@nabijaczleweli.xyz>
Thu, 21 Apr 2022 14:27:15 +0000 (16:27 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 22 Apr 2022 21:27:10 +0000 (14:27 -0700)
Upstream-commit: cdb4f26a63c391317e335e6e683a614358e70aeb ("kobject:
 kobj_type: remove default_attrs")
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #13357

config/kernel-sysfs.m4 [new file with mode: 0644]
config/kernel.m4
module/os/linux/zfs/zfs_sysfs.c

diff --git a/config/kernel-sysfs.m4 b/config/kernel-sysfs.m4
new file mode 100644 (file)
index 0000000..668def5
--- /dev/null
@@ -0,0 +1,37 @@
+dnl #
+dnl # Linux 5.2/5.18 API
+dnl #
+dnl # In cdb4f26a63c391317e335e6e683a614358e70aeb ("kobject: kobj_type: remove default_attrs")
+dnl #  struct kobj_type.default_attrs
+dnl # was finally removed in favour of
+dnl #  struct kobj_type.default_groups
+dnl #
+dnl # This was added in aa30f47cf666111f6bbfd15f290a27e8a7b9d854 ("kobject: Add support for default attribute groups to kobj_type"),
+dnl # if both are present (5.2-5.17), we prefer default_groups; they're otherwise equivalent
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SRC_SYSFS_DEFAULT_GROUPS], [
+       ZFS_LINUX_TEST_SRC([sysfs_default_groups], [
+               #include <linux/kobject.h>
+       ],[
+               struct kobj_type __attribute__ ((unused)) kt = {
+                       .default_groups = (const struct attribute_group **)NULL };
+       ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_SYSFS_DEFAULT_GROUPS], [
+       AC_MSG_CHECKING([for struct kobj_type.default_groups])
+       ZFS_LINUX_TEST_RESULT([sysfs_default_groups],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE([HAVE_SYSFS_DEFAULT_GROUPS], 1, [struct kobj_type has default_groups])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_SRC_SYSFS], [
+       ZFS_AC_KERNEL_SRC_SYSFS_DEFAULT_GROUPS
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_SYSFS], [
+       ZFS_AC_KERNEL_SYSFS_DEFAULT_GROUPS
+])
index 771dc21787d4b4106984d65ad02f7d86f44880ad..7cf181beb3b113b618073ef2374c635bc655e04e 100644 (file)
@@ -133,6 +133,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
        ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS
        ZFS_AC_KERNEL_SRC_SIGNAL_STOP
        ZFS_AC_KERNEL_SRC_SIGINFO
+       ZFS_AC_KERNEL_SRC_SYSFS
        ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
        ZFS_AC_KERNEL_SRC_VFS_READPAGES
        ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
@@ -247,6 +248,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
        ZFS_AC_KERNEL_BIO_MAX_SEGS
        ZFS_AC_KERNEL_SIGNAL_STOP
        ZFS_AC_KERNEL_SIGINFO
+       ZFS_AC_KERNEL_SYSFS
        ZFS_AC_KERNEL_SET_SPECIAL_STATE
        ZFS_AC_KERNEL_VFS_READPAGES
        ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
index aa21ba5cfd020cc331c8bc7e716829a3baa45453..eb7c5f6166d25ece271cf3b93b59ac7c32aef277 100644 (file)
 /*
  * A zfs_mod_kobj_t represents a zfs kobject under '/sys/module/zfs'
  */
-struct zfs_mod_kobj;
 typedef struct zfs_mod_kobj zfs_mod_kobj_t;
-
 struct zfs_mod_kobj {
        struct kobject          zko_kobj;
        struct kobj_type        zko_kobj_type;
        struct sysfs_ops        zko_sysfs_ops;
        size_t                  zko_attr_count;
        struct attribute        *zko_attr_list;         /* allocated */
-       struct attribute        **zko_default_attrs;    /* allocated */
+       struct attribute_group  zko_default_group;      /* .attrs allocated */
+       const struct attribute_group    *zko_default_groups[2];
        size_t                  zko_child_count;
        zfs_mod_kobj_t          *zko_children;          /* allocated */
 };
@@ -127,10 +126,10 @@ zfs_kobj_release(struct kobject *kobj)
                zkobj->zko_attr_list = NULL;
        }
 
-       if (zkobj->zko_default_attrs != NULL) {
-               kmem_free(zkobj->zko_default_attrs,
+       if (zkobj->zko_default_group.attrs != NULL) {
+               kmem_free(zkobj->zko_default_group.attrs,
                    DEFAULT_ATTR_SIZE(zkobj->zko_attr_count));
-               zkobj->zko_default_attrs = NULL;
+               zkobj->zko_default_group.attrs = NULL;
        }
 
        if (zkobj->zko_child_count != 0) {
@@ -154,11 +153,12 @@ zfs_kobj_add_attr(zfs_mod_kobj_t *zkobj, int attr_num, const char *attr_name)
 {
        VERIFY3U(attr_num, <, zkobj->zko_attr_count);
        ASSERT(zkobj->zko_attr_list);
-       ASSERT(zkobj->zko_default_attrs);
+       ASSERT(zkobj->zko_default_group.attrs);
 
        zkobj->zko_attr_list[attr_num].name = attr_name;
        zkobj->zko_attr_list[attr_num].mode = 0444;
-       zkobj->zko_default_attrs[attr_num] = &zkobj->zko_attr_list[attr_num];
+       zkobj->zko_default_group.attrs[attr_num] =
+           &zkobj->zko_attr_list[attr_num];
        sysfs_attr_init(&zkobj->zko_attr_list[attr_num]);
 }
 
@@ -176,9 +176,9 @@ zfs_kobj_init(zfs_mod_kobj_t *zkobj, int attr_cnt, int child_cnt,
                        return (ENOMEM);
        }
        /* this will always have at least one slot for NULL termination */
-       zkobj->zko_default_attrs = kmem_zalloc(DEFAULT_ATTR_SIZE(attr_cnt),
-           KM_SLEEP);
-       if (zkobj->zko_default_attrs == NULL) {
+       zkobj->zko_default_group.attrs =
+           kmem_zalloc(DEFAULT_ATTR_SIZE(attr_cnt), KM_SLEEP);
+       if (zkobj->zko_default_group.attrs == NULL) {
                if (zkobj->zko_attr_list != NULL) {
                        kmem_free(zkobj->zko_attr_list,
                            ATTR_TABLE_SIZE(attr_cnt));
@@ -186,14 +186,19 @@ zfs_kobj_init(zfs_mod_kobj_t *zkobj, int attr_cnt, int child_cnt,
                return (ENOMEM);
        }
        zkobj->zko_attr_count = attr_cnt;
-       zkobj->zko_kobj_type.default_attrs = zkobj->zko_default_attrs;
+       zkobj->zko_default_groups[0] = &zkobj->zko_default_group;
+#ifdef HAVE_SYSFS_DEFAULT_GROUPS
+       zkobj->zko_kobj_type.default_groups = zkobj->zko_default_groups;
+#else
+       zkobj->zko_kobj_type.default_attrs = zkobj->zko_default_group.attrs;
+#endif
 
        if (child_cnt > 0) {
                zkobj->zko_children = kmem_zalloc(CHILD_TABLE_SIZE(child_cnt),
                    KM_SLEEP);
                if (zkobj->zko_children == NULL) {
-                       if (zkobj->zko_default_attrs != NULL) {
-                               kmem_free(zkobj->zko_default_attrs,
+                       if (zkobj->zko_default_group.attrs != NULL) {
+                               kmem_free(zkobj->zko_default_group.attrs,
                                    DEFAULT_ATTR_SIZE(attr_cnt));
                        }
                        if (zkobj->zko_attr_list != NULL) {
@@ -215,9 +220,9 @@ zfs_kobj_init(zfs_mod_kobj_t *zkobj, int attr_cnt, int child_cnt,
 static int
 zfs_kobj_add(zfs_mod_kobj_t *zkobj, struct kobject *parent, const char *name)
 {
-       /* zko_default_attrs must be NULL terminated */
-       ASSERT(zkobj->zko_default_attrs != NULL);
-       ASSERT(zkobj->zko_default_attrs[zkobj->zko_attr_count] == NULL);
+       /* zko_default_group.attrs must be NULL terminated */
+       ASSERT(zkobj->zko_default_group.attrs != NULL);
+       ASSERT(zkobj->zko_default_group.attrs[zkobj->zko_attr_count] == NULL);
 
        kobject_init(&zkobj->zko_kobj, &zkobj->zko_kobj_type);
        return (kobject_add(&zkobj->zko_kobj, parent, name));