--- /dev/null
+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
+])
/*
* 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 */
};
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) {
{
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]);
}
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));
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) {
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));