Author: hselasky
Date: Mon Nov  4 14:19:09 2019
New Revision: 354335
URL: https://svnweb.freebsd.org/changeset/base/354335

Log:
  Enable device class group attributes in the LinuxKPI.
  
  Bump the __FreeBSD_version to force recompilation of
  external kernel modules due to structure change.
  
  Differential Revision:        https://reviews.freebsd.org/D21564
  Submitted by: Greg V <greg@unrelenting.technology>
  MFC after:    1 week
  Sponsored by: Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/include/linux/device.h
  head/sys/compat/linuxkpi/common/include/linux/sysfs.h
  head/sys/sys/param.h

Modified: head/sys/compat/linuxkpi/common/include/linux/device.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/device.h      Mon Nov  4 
13:46:21 2019        (r354334)
+++ head/sys/compat/linuxkpi/common/include/linux/device.h      Mon Nov  4 
14:19:09 2019        (r354335)
@@ -54,6 +54,7 @@ struct class {
        struct kobject  kobj;
        devclass_t      bsdclass;
        const struct dev_pm_ops *pm;
+       const struct attribute_group **dev_groups;
        void            (*class_release)(struct class *class);
        void            (*dev_release)(struct device *dev);
        char *          (*devnode)(struct device *dev, umode_t *mode);
@@ -424,6 +425,8 @@ done:
        kobject_init(&dev->kobj, &linux_dev_ktype);
        kobject_add(&dev->kobj, &dev->class->kobj, dev_name(dev));
 
+       sysfs_create_groups(&dev->kobj, dev->class->dev_groups);
+
        return (0);
 }
 
@@ -431,6 +434,8 @@ static inline void
 device_unregister(struct device *dev)
 {
        device_t bsddev;
+
+       sysfs_remove_groups(&dev->kobj, dev->class->dev_groups);
 
        bsddev = dev->bsddev;
        dev->bsddev = NULL;

Modified: head/sys/compat/linuxkpi/common/include/linux/sysfs.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/sysfs.h       Mon Nov  4 
13:46:21 2019        (r354334)
+++ head/sys/compat/linuxkpi/common/include/linux/sysfs.h       Mon Nov  4 
14:19:09 2019        (r354335)
@@ -62,12 +62,13 @@ struct attribute_group {
 
 #define        ATTRIBUTE_GROUPS(_name)                                         
\
        static struct attribute_group _name##_group = {                 \
+               .name = __stringify(_name),                             \
                .attrs = _name##_attrs,                                 \
        };                                                              \
-       static struct attribute_group *_name##_groups[] = {             \
+       static const struct attribute_group *_name##_groups[] = {       \
                &_name##_group,                                         \
                NULL,                                                   \
-       };
+       }
 
 /*
  * Handle our generic '\0' terminated 'C' string.
@@ -210,12 +211,25 @@ sysfs_create_groups(struct kobject *kobj, const struct
        int error = 0;
        int i;
 
+       if (grps == NULL)
+               goto done;
        for (i = 0; grps[i] && !error; i++)
                error = sysfs_create_group(kobj, grps[i]);
        while (error && --i >= 0)
                sysfs_remove_group(kobj, grps[i]);
-
+done:
        return (error);
+}
+
+static inline void
+sysfs_remove_groups(struct kobject *kobj, const struct attribute_group **grps)
+{
+       int i;
+
+       if (grps == NULL)
+               return;
+       for (i = 0; grps[i]; i++)
+               sysfs_remove_group(kobj, grps[i]);
 }
 
 static inline int

Modified: head/sys/sys/param.h
==============================================================================
--- head/sys/sys/param.h        Mon Nov  4 13:46:21 2019        (r354334)
+++ head/sys/sys/param.h        Mon Nov  4 14:19:09 2019        (r354335)
@@ -60,7 +60,7 @@
  *             in the range 5 to 9.
  */
 #undef __FreeBSD_version
-#define __FreeBSD_version 1300054      /* Master, propagated to newvers */
+#define __FreeBSD_version 1300055      /* Master, propagated to newvers */
 
 /*
  * __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to