Linux 5.18 compat: kobj_type.default_attrs replaced with default_groups

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
This commit is contained in:
наб 2022-04-21 16:27:15 +02:00 committed by Brian Behlendorf
parent 520a7c8a85
commit 0cdda2edb3
3 changed files with 61 additions and 17 deletions

37
config/kernel-sysfs.m4 Normal file
View File

@ -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
])

View File

@ -133,6 +133,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS
ZFS_AC_KERNEL_SRC_SIGNAL_STOP ZFS_AC_KERNEL_SRC_SIGNAL_STOP
ZFS_AC_KERNEL_SRC_SIGINFO ZFS_AC_KERNEL_SRC_SIGINFO
ZFS_AC_KERNEL_SRC_SYSFS
ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE
ZFS_AC_KERNEL_SRC_VFS_READPAGES ZFS_AC_KERNEL_SRC_VFS_READPAGES
ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS 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_BIO_MAX_SEGS
ZFS_AC_KERNEL_SIGNAL_STOP ZFS_AC_KERNEL_SIGNAL_STOP
ZFS_AC_KERNEL_SIGINFO ZFS_AC_KERNEL_SIGINFO
ZFS_AC_KERNEL_SYSFS
ZFS_AC_KERNEL_SET_SPECIAL_STATE ZFS_AC_KERNEL_SET_SPECIAL_STATE
ZFS_AC_KERNEL_VFS_READPAGES ZFS_AC_KERNEL_VFS_READPAGES
ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS

View File

@ -65,16 +65,15 @@
/* /*
* A zfs_mod_kobj_t represents a zfs kobject under '/sys/module/zfs' * 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; typedef struct zfs_mod_kobj zfs_mod_kobj_t;
struct zfs_mod_kobj { struct zfs_mod_kobj {
struct kobject zko_kobj; struct kobject zko_kobj;
struct kobj_type zko_kobj_type; struct kobj_type zko_kobj_type;
struct sysfs_ops zko_sysfs_ops; struct sysfs_ops zko_sysfs_ops;
size_t zko_attr_count; size_t zko_attr_count;
struct attribute *zko_attr_list; /* allocated */ 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; size_t zko_child_count;
zfs_mod_kobj_t *zko_children; /* allocated */ zfs_mod_kobj_t *zko_children; /* allocated */
}; };
@ -127,10 +126,10 @@ zfs_kobj_release(struct kobject *kobj)
zkobj->zko_attr_list = NULL; zkobj->zko_attr_list = NULL;
} }
if (zkobj->zko_default_attrs != NULL) { if (zkobj->zko_default_group.attrs != NULL) {
kmem_free(zkobj->zko_default_attrs, kmem_free(zkobj->zko_default_group.attrs,
DEFAULT_ATTR_SIZE(zkobj->zko_attr_count)); DEFAULT_ATTR_SIZE(zkobj->zko_attr_count));
zkobj->zko_default_attrs = NULL; zkobj->zko_default_group.attrs = NULL;
} }
if (zkobj->zko_child_count != 0) { 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); VERIFY3U(attr_num, <, zkobj->zko_attr_count);
ASSERT(zkobj->zko_attr_list); 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].name = attr_name;
zkobj->zko_attr_list[attr_num].mode = 0444; 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]); 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); return (ENOMEM);
} }
/* this will always have at least one slot for NULL termination */ /* this will always have at least one slot for NULL termination */
zkobj->zko_default_attrs = kmem_zalloc(DEFAULT_ATTR_SIZE(attr_cnt), zkobj->zko_default_group.attrs =
KM_SLEEP); kmem_zalloc(DEFAULT_ATTR_SIZE(attr_cnt), KM_SLEEP);
if (zkobj->zko_default_attrs == NULL) { if (zkobj->zko_default_group.attrs == NULL) {
if (zkobj->zko_attr_list != NULL) { if (zkobj->zko_attr_list != NULL) {
kmem_free(zkobj->zko_attr_list, kmem_free(zkobj->zko_attr_list,
ATTR_TABLE_SIZE(attr_cnt)); 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); return (ENOMEM);
} }
zkobj->zko_attr_count = attr_cnt; 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) { if (child_cnt > 0) {
zkobj->zko_children = kmem_zalloc(CHILD_TABLE_SIZE(child_cnt), zkobj->zko_children = kmem_zalloc(CHILD_TABLE_SIZE(child_cnt),
KM_SLEEP); KM_SLEEP);
if (zkobj->zko_children == NULL) { if (zkobj->zko_children == NULL) {
if (zkobj->zko_default_attrs != NULL) { if (zkobj->zko_default_group.attrs != NULL) {
kmem_free(zkobj->zko_default_attrs, kmem_free(zkobj->zko_default_group.attrs,
DEFAULT_ATTR_SIZE(attr_cnt)); DEFAULT_ATTR_SIZE(attr_cnt));
} }
if (zkobj->zko_attr_list != NULL) { 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 static int
zfs_kobj_add(zfs_mod_kobj_t *zkobj, struct kobject *parent, const char *name) zfs_kobj_add(zfs_mod_kobj_t *zkobj, struct kobject *parent, const char *name)
{ {
/* zko_default_attrs must be NULL terminated */ /* zko_default_group.attrs must be NULL terminated */
ASSERT(zkobj->zko_default_attrs != NULL); ASSERT(zkobj->zko_default_group.attrs != NULL);
ASSERT(zkobj->zko_default_attrs[zkobj->zko_attr_count] == NULL); ASSERT(zkobj->zko_default_group.attrs[zkobj->zko_attr_count] == NULL);
kobject_init(&zkobj->zko_kobj, &zkobj->zko_kobj_type); kobject_init(&zkobj->zko_kobj, &zkobj->zko_kobj_type);
return (kobject_add(&zkobj->zko_kobj, parent, name)); return (kobject_add(&zkobj->zko_kobj, parent, name));