Linux 5.18 compat: kobj_type.default_attrs replaced with default_groups
Upstream-commit: cdb4f26a63c391317e335e6e683a614358e70aeb ("kobject:
kobj_type: remove default_attrs")
Upstream-commit: 0cdda2edb3
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #13357
This commit is contained in:
parent
972637dc06
commit
642426095a
|
@ -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
|
||||||
|
])
|
|
@ -132,6 +132,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
|
||||||
|
@ -244,6 +245,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
|
||||||
|
|
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
@ -126,10 +125,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) {
|
||||||
|
@ -153,11 +152,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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,9 +175,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));
|
||||||
|
@ -185,14 +185,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) {
|
||||||
|
@ -214,9 +219,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));
|
||||||
|
|
Loading…
Reference in New Issue