diff options
-rw-r--r-- | driver-core-add-default-groups-to-struct-class.patch | 75 | ||||
-rw-r--r-- | driver-core-add-device_attr_rw-and-device_attr_ro-macros.patch | 82 | ||||
-rw-r--r-- | driver-core-introduce-device_create_groups.patch | 179 | ||||
-rw-r--r-- | f4.patch | 4 | ||||
-rw-r--r-- | series | 10 | ||||
-rw-r--r-- | sysfs-add-more-helper-macro-s-for-bin_-attribute-_groups.patch | 94 | ||||
-rw-r--r-- | sysfs-add-support-for-binary-attributes-in-groups.patch | 131 | ||||
-rw-r--r-- | sysfs-prevent-warning-when-only-using-binary-attributes.patch | 28 | ||||
-rw-r--r-- | sysfs-use-file-mode-defines-from-stat.h.patch | 45 | ||||
-rw-r--r-- | sysfs.h-add-__attr_rw-macro.patch | 51 | ||||
-rw-r--r-- | sysfs.h-add-attribute_groups-macro.patch | 35 | ||||
-rw-r--r-- | sysfs.h-add-bin_attr-macro.patch | 34 |
12 files changed, 2 insertions, 766 deletions
diff --git a/driver-core-add-default-groups-to-struct-class.patch b/driver-core-add-default-groups-to-struct-class.patch deleted file mode 100644 index af701f865c33fa..00000000000000 --- a/driver-core-add-default-groups-to-struct-class.patch +++ /dev/null @@ -1,75 +0,0 @@ -From foo@baz Tue Jul 9 12:00:06 PDT 2013 -Date: Tue, 09 Jul 2013 12:00:06 -0700 -To: Greg KH <gregkh@linuxfoundation.org> -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Subject: driver core: add default groups to struct class - -We should be using groups, not attribute lists, for classes to allow -subdirectories, and soon, binary files. Groups are just more flexible -overall, so add them. - -The dev_attrs list will go away after all in-kernel users are converted -to use dev_groups. - -Reviewed-by: Guenter Roeck <linux@roeck-us.net> -Tested-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---- - drivers/base/core.c | 9 ++++++++- - include/linux/device.h | 4 +++- - 2 files changed, 11 insertions(+), 2 deletions(-) - ---- a/drivers/base/core.c -+++ b/drivers/base/core.c -@@ -528,9 +528,12 @@ static int device_add_attrs(struct devic - int error; - - if (class) { -- error = device_add_attributes(dev, class->dev_attrs); -+ error = device_add_groups(dev, class->dev_groups); - if (error) - return error; -+ error = device_add_attributes(dev, class->dev_attrs); -+ if (error) -+ goto err_remove_class_groups; - error = device_add_bin_attributes(dev, class->dev_bin_attrs); - if (error) - goto err_remove_class_attrs; -@@ -563,6 +566,9 @@ static int device_add_attrs(struct devic - err_remove_class_attrs: - if (class) - device_remove_attributes(dev, class->dev_attrs); -+ err_remove_class_groups: -+ if (class) -+ device_remove_groups(dev, class->dev_groups); - - return error; - } -@@ -581,6 +587,7 @@ static void device_remove_attrs(struct d - if (class) { - device_remove_attributes(dev, class->dev_attrs); - device_remove_bin_attributes(dev, class->dev_bin_attrs); -+ device_remove_groups(dev, class->dev_groups); - } - } - ---- a/include/linux/device.h -+++ b/include/linux/device.h -@@ -320,6 +320,7 @@ int subsys_virtual_register(struct bus_t - * @name: Name of the class. - * @owner: The module owner. - * @class_attrs: Default attributes of this class. -+ * @dev_groups: Default attributes of the devices that belong to the class. - * @dev_attrs: Default attributes of the devices belong to the class. - * @dev_bin_attrs: Default binary attributes of the devices belong to the class. - * @dev_kobj: The kobject that represents this class and links it into the hierarchy. -@@ -349,7 +350,8 @@ struct class { - struct module *owner; - - struct class_attribute *class_attrs; -- struct device_attribute *dev_attrs; -+ struct device_attribute *dev_attrs; /* use dev_groups instead */ -+ const struct attribute_group **dev_groups; - struct bin_attribute *dev_bin_attrs; - struct kobject *dev_kobj; - diff --git a/driver-core-add-device_attr_rw-and-device_attr_ro-macros.patch b/driver-core-add-device_attr_rw-and-device_attr_ro-macros.patch deleted file mode 100644 index 3dc53f256f316c..00000000000000 --- a/driver-core-add-device_attr_rw-and-device_attr_ro-macros.patch +++ /dev/null @@ -1,82 +0,0 @@ -From foo@baz Mon Jul 8 22:44:37 PDT 2013 -Date: Mon, 08 Jul 2013 22:44:37 -0700 -To: Greg KH <gregkh@linuxfoundation.org> -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Subject: driver core: device.h: add RW and RO attribute macros - -Make it easier to create attributes without having to always audit the -mode settings. - -Reviewed-by: Guenter Roeck <linux@roeck-us.net> -Tested-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - include/linux/device.h | 28 +++++++++++++++++++++------- - 1 file changed, 21 insertions(+), 7 deletions(-) - ---- a/include/linux/device.h -+++ b/include/linux/device.h -@@ -47,7 +47,11 @@ struct bus_attribute { - }; - - #define BUS_ATTR(_name, _mode, _show, _store) \ --struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store) -+ struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store) -+#define BUS_ATTR_RW(_name) \ -+ struct bus_attribute bus_attr_##_name = __ATTR_RW(_name) -+#define BUS_ATTR_RO(_name) \ -+ struct bus_attribute bus_attr_##_name = __ATTR_RO(_name) - - extern int __must_check bus_create_file(struct bus_type *, - struct bus_attribute *); -@@ -261,9 +265,12 @@ struct driver_attribute { - size_t count); - }; - --#define DRIVER_ATTR(_name, _mode, _show, _store) \ --struct driver_attribute driver_attr_##_name = \ -- __ATTR(_name, _mode, _show, _store) -+#define DRIVER_ATTR(_name, _mode, _show, _store) \ -+ struct driver_attribute driver_attr_##_name = __ATTR(_name, _mode, _show, _store) -+#define DRIVER_ATTR_RW(_name) \ -+ struct driver_attribute driver_attr_##_name = __ATTR_RW(_name) -+#define DRIVER_ATTR_RO(_name) \ -+ struct driver_attribute driver_attr_##_name = __ATTR_RO(_name) - - extern int __must_check driver_create_file(struct device_driver *driver, - const struct driver_attribute *attr); -@@ -414,8 +421,12 @@ struct class_attribute { - const struct class_attribute *attr); - }; - --#define CLASS_ATTR(_name, _mode, _show, _store) \ --struct class_attribute class_attr_##_name = __ATTR(_name, _mode, _show, _store) -+#define CLASS_ATTR(_name, _mode, _show, _store) \ -+ struct class_attribute class_attr_##_name = __ATTR(_name, _mode, _show, _store) -+#define CLASS_ATTR_RW(_name) \ -+ struct class_attribute class_attr_##_name = __ATTR_RW(_name) -+#define CLASS_ATTR_RO(_name) \ -+ struct class_attribute class_attr_##_name = __ATTR_RO(_name) - - extern int __must_check class_create_file(struct class *class, - const struct class_attribute *attr); -@@ -423,7 +434,6 @@ extern void class_remove_file(struct cla - const struct class_attribute *attr); - - /* Simple class attribute that is just a static string */ -- - struct class_attribute_string { - struct class_attribute attr; - char *str; -@@ -512,6 +522,10 @@ ssize_t device_store_bool(struct device - - #define DEVICE_ATTR(_name, _mode, _show, _store) \ - struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) -+#define DEVICE_ATTR_RW(_name) \ -+ struct device_attribute dev_attr_##_name = __ATTR_RW(_name) -+#define DEVICE_ATTR_RO(_name) \ -+ struct device_attribute dev_attr_##_name = __ATTR_RO(_name) - #define DEVICE_ULONG_ATTR(_name, _mode, _var) \ - struct dev_ext_attribute dev_attr_##_name = \ - { __ATTR(_name, _mode, device_show_ulong, device_store_ulong), &(_var) } diff --git a/driver-core-introduce-device_create_groups.patch b/driver-core-introduce-device_create_groups.patch deleted file mode 100644 index e73fe6ef2236d6..00000000000000 --- a/driver-core-introduce-device_create_groups.patch +++ /dev/null @@ -1,179 +0,0 @@ -From groeck7@gmail.com Sat Jul 6 10:25:17 2013 -From: Guenter Roeck <linux@roeck-us.net> -Date: Sat, 6 Jul 2013 10:24:51 -0700 -Subject: driver core: Introduce device_create_groups -To: Jean Delvare <khali@linux-fr.org>, Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Cc: lm-sensors@lm-sensors.org, linux-kernel@vger.kernel.org, Guenter Roeck <linux@roeck-us.net> - -From: Guenter Roeck <linux@roeck-us.net> - -device_create_groups lets callers create devices as well as associated -sysfs attributes with a single call. This avoids race conditions seen -if sysfs attributes on new devices are created later. - -[fixed up comment block placement and add checks for printk buffer -formats - gregkh] - -Signed-off-by: Guenter Roeck <linux@roeck-us.net> -Cc: Jean Delvare <khali@linux-fr.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---- - drivers/base/core.c | 111 ++++++++++++++++++++++++++++++++++++------------- - include/linux/device.h | 5 ++ - 2 files changed, 88 insertions(+), 28 deletions(-) - ---- a/drivers/base/core.c -+++ b/drivers/base/core.c -@@ -1667,34 +1667,11 @@ static void device_create_release(struct - kfree(dev); - } - --/** -- * device_create_vargs - creates a device and registers it with sysfs -- * @class: pointer to the struct class that this device should be registered to -- * @parent: pointer to the parent struct device of this new device, if any -- * @devt: the dev_t for the char device to be added -- * @drvdata: the data to be added to the device for callbacks -- * @fmt: string for the device's name -- * @args: va_list for the device's name -- * -- * This function can be used by char device classes. A struct device -- * will be created in sysfs, registered to the specified class. -- * -- * A "dev" file will be created, showing the dev_t for the device, if -- * the dev_t is not 0,0. -- * If a pointer to a parent struct device is passed in, the newly created -- * struct device will be a child of that device in sysfs. -- * The pointer to the struct device will be returned from the call. -- * Any further sysfs files that might be required can be created using this -- * pointer. -- * -- * Returns &struct device pointer on success, or ERR_PTR() on error. -- * -- * Note: the struct class passed to this function must have previously -- * been created with a call to class_create(). -- */ --struct device *device_create_vargs(struct class *class, struct device *parent, -- dev_t devt, void *drvdata, const char *fmt, -- va_list args) -+static struct device * -+device_create_groups_vargs(struct class *class, struct device *parent, -+ dev_t devt, void *drvdata, -+ const struct attribute_group **groups, -+ const char *fmt, va_list args) - { - struct device *dev = NULL; - int retval = -ENODEV; -@@ -1711,6 +1688,7 @@ struct device *device_create_vargs(struc - dev->devt = devt; - dev->class = class; - dev->parent = parent; -+ dev->groups = groups; - dev->release = device_create_release; - dev_set_drvdata(dev, drvdata); - -@@ -1728,6 +1706,39 @@ error: - put_device(dev); - return ERR_PTR(retval); - } -+ -+/** -+ * device_create_vargs - creates a device and registers it with sysfs -+ * @class: pointer to the struct class that this device should be registered to -+ * @parent: pointer to the parent struct device of this new device, if any -+ * @devt: the dev_t for the char device to be added -+ * @drvdata: the data to be added to the device for callbacks -+ * @fmt: string for the device's name -+ * @args: va_list for the device's name -+ * -+ * This function can be used by char device classes. A struct device -+ * will be created in sysfs, registered to the specified class. -+ * -+ * A "dev" file will be created, showing the dev_t for the device, if -+ * the dev_t is not 0,0. -+ * If a pointer to a parent struct device is passed in, the newly created -+ * struct device will be a child of that device in sysfs. -+ * The pointer to the struct device will be returned from the call. -+ * Any further sysfs files that might be required can be created using this -+ * pointer. -+ * -+ * Returns &struct device pointer on success, or ERR_PTR() on error. -+ * -+ * Note: the struct class passed to this function must have previously -+ * been created with a call to class_create(). -+ */ -+struct device *device_create_vargs(struct class *class, struct device *parent, -+ dev_t devt, void *drvdata, const char *fmt, -+ va_list args) -+{ -+ return device_create_groups_vargs(class, parent, devt, drvdata, NULL, -+ fmt, args); -+} - EXPORT_SYMBOL_GPL(device_create_vargs); - - /** -@@ -1767,6 +1778,50 @@ struct device *device_create(struct clas - } - EXPORT_SYMBOL_GPL(device_create); - -+/** -+ * device_create_with_groups - creates a device and registers it with sysfs -+ * @class: pointer to the struct class that this device should be registered to -+ * @parent: pointer to the parent struct device of this new device, if any -+ * @devt: the dev_t for the char device to be added -+ * @drvdata: the data to be added to the device for callbacks -+ * @groups: NULL-terminated list of attribute groups to be created -+ * @fmt: string for the device's name -+ * -+ * This function can be used by char device classes. A struct device -+ * will be created in sysfs, registered to the specified class. -+ * Additional attributes specified in the groups parameter will also -+ * be created automatically. -+ * -+ * A "dev" file will be created, showing the dev_t for the device, if -+ * the dev_t is not 0,0. -+ * If a pointer to a parent struct device is passed in, the newly created -+ * struct device will be a child of that device in sysfs. -+ * The pointer to the struct device will be returned from the call. -+ * Any further sysfs files that might be required can be created using this -+ * pointer. -+ * -+ * Returns &struct device pointer on success, or ERR_PTR() on error. -+ * -+ * Note: the struct class passed to this function must have previously -+ * been created with a call to class_create(). -+ */ -+struct device *device_create_with_groups(struct class *class, -+ struct device *parent, dev_t devt, -+ void *drvdata, -+ const struct attribute_group **groups, -+ const char *fmt, ...) -+{ -+ va_list vargs; -+ struct device *dev; -+ -+ va_start(vargs, fmt); -+ dev = device_create_groups_vargs(class, parent, devt, drvdata, groups, -+ fmt, vargs); -+ va_end(vargs); -+ return dev; -+} -+EXPORT_SYMBOL_GPL(device_create_with_groups); -+ - static int __match_devt(struct device *dev, const void *data) - { - const dev_t *devt = data; ---- a/include/linux/device.h -+++ b/include/linux/device.h -@@ -938,6 +938,11 @@ extern __printf(5, 6) - struct device *device_create(struct class *cls, struct device *parent, - dev_t devt, void *drvdata, - const char *fmt, ...); -+extern __printf(6, 7) -+struct device *device_create_with_groups(struct class *cls, -+ struct device *parent, dev_t devt, void *drvdata, -+ const struct attribute_group **groups, -+ const char *fmt, ...); - extern void device_destroy(struct class *cls, dev_t devt); - - /* diff --git a/f4.patch b/f4.patch index b9c452085282b8..371e5f07871331 100644 --- a/f4.patch +++ b/f4.patch @@ -84,7 +84,7 @@ klist_del(&dev->p->knode_bus); --- a/drivers/base/platform.c +++ b/drivers/base/platform.c -@@ -671,11 +671,13 @@ static ssize_t modalias_show(struct devi +@@ -672,11 +672,13 @@ static ssize_t modalias_show(struct devi return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; } @@ -101,7 +101,7 @@ static int platform_uevent(struct device *dev, struct kobj_uevent_env *env) { -@@ -892,7 +894,7 @@ static const struct dev_pm_ops platform_ +@@ -893,7 +895,7 @@ static const struct dev_pm_ops platform_ struct bus_type platform_bus_type = { .name = "platform", @@ -1,16 +1,6 @@ # My specific stuff, at the top to make it easier to work stuff below. # driver core attribute cleanup work -sysfs.h-add-__attr_rw-macro.patch -sysfs.h-add-attribute_groups-macro.patch -sysfs.h-add-bin_attr-macro.patch -driver-core-add-device_attr_rw-and-device_attr_ro-macros.patch -sysfs-add-support-for-binary-attributes-in-groups.patch -sysfs-prevent-warning-when-only-using-binary-attributes.patch -driver-core-introduce-device_create_groups.patch -driver-core-add-default-groups-to-struct-class.patch -sysfs-add-more-helper-macro-s-for-bin_-attribute-_groups.patch -sysfs-use-file-mode-defines-from-stat.h.patch # dev_groups to struct class work misc-c2port-use-dev_bin_attrs-instead-of-hand-coding-it.patch diff --git a/sysfs-add-more-helper-macro-s-for-bin_-attribute-_groups.patch b/sysfs-add-more-helper-macro-s-for-bin_-attribute-_groups.patch deleted file mode 100644 index e549896047c28d..00000000000000 --- a/sysfs-add-more-helper-macro-s-for-bin_-attribute-_groups.patch +++ /dev/null @@ -1,94 +0,0 @@ -From 669597be47d042ee28abe5f7e172054043b003e7 Mon Sep 17 00:00:00 2001 -From: Oliver Schinagl <oliver@schinagl.nl> -Date: Thu, 11 Jul 2013 13:48:18 +0200 -Subject: sysfs: add more helper macro's for (bin_)attribute(_groups) - -With the recent changes to sysfs there's various helper macro's. -However there's no RW, RO BIN_ helper macro's. This patch adds them. - -Signed-off-by: Oliver Schinagl <oliver@schinagl.nl> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - include/linux/sysfs.h | 51 +++++++++++++++++++++++++++++++++++++------------- - 1 file changed, 38 insertions(+), 13 deletions(-) - ---- a/include/linux/sysfs.h -+++ b/include/linux/sysfs.h -@@ -17,6 +17,7 @@ - #include <linux/list.h> - #include <linux/lockdep.h> - #include <linux/kobject_ns.h> -+#include <linux/stat.h> - #include <linux/atomic.h> - - struct kobject; -@@ -94,15 +95,18 @@ struct attribute_group { - #define __ATTR_IGNORE_LOCKDEP __ATTR - #endif - --#define ATTRIBUTE_GROUPS(name) \ --static const struct attribute_group name##_group = { \ -- .attrs = name##_attrs, \ --}; \ --static const struct attribute_group *name##_groups[] = { \ -- &name##_group, \ -+#define __ATTRIBUTE_GROUPS(_name) \ -+static const struct attribute_group *_name##_groups[] = { \ -+ &_name##_group, \ - NULL, \ - } - -+#define ATTRIBUTE_GROUPS(_name) \ -+static const struct attribute_group _name##_group = { \ -+ .attrs = _name##_attrs, \ -+}; \ -+__ATTRIBUTE_GROUPS(_name) -+ - #define attr_name(_attr) (_attr).attr.name - - struct file; -@@ -132,15 +136,36 @@ struct bin_attribute { - */ - #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) - --/* macro to create static binary attributes easier */ --#define BIN_ATTR(_name, _mode, _read, _write, _size) \ --struct bin_attribute bin_attr_##_name = { \ -- .attr = {.name = __stringify(_name), .mode = _mode }, \ -- .read = _read, \ -- .write = _write, \ -- .size = _size, \ -+/* macros to create static binary attributes easier */ -+#define __BIN_ATTR(_name, _mode, _read, _write, _size) { \ -+ .attr = { .name = __stringify(_name), .mode = _mode }, \ -+ .read = _read, \ -+ .write = _write, \ -+ .size = _size, \ -+} -+ -+#define __BIN_ATTR_RO(_name, _size) { \ -+ .attr = { .name = __stringify(_name), .mode = S_IRUGO }, \ -+ .read = _name##_read, \ -+ .size = _size, \ - } - -+#define __BIN_ATTR_RW(_name, _size) __BIN_ATTR(_name, \ -+ (S_IWUSR | S_IRUGO), _name##_read, \ -+ _name##_write) -+ -+#define __BIN_ATTR_NULL __ATTR_NULL -+ -+#define BIN_ATTR(_name, _mode, _read, _write, _size) \ -+struct bin_attribute bin_attr_##_name = __BIN_ATTR(_name, _mode, _read, \ -+ _write, _size) -+ -+#define BIN_ATTR_RO(_name, _size) \ -+struct bin_attribute bin_attr_##_name = __BIN_ATTR_RO(_name, _size) -+ -+#define BIN_ATTR_RW(_name, _size) \ -+struct bin_attribute bin_attr_##_name = __BIN_ATTR_RW(_name, _size) -+ - struct sysfs_ops { - ssize_t (*show)(struct kobject *, struct attribute *,char *); - ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); diff --git a/sysfs-add-support-for-binary-attributes-in-groups.patch b/sysfs-add-support-for-binary-attributes-in-groups.patch deleted file mode 100644 index 3756614b6409f8..00000000000000 --- a/sysfs-add-support-for-binary-attributes-in-groups.patch +++ /dev/null @@ -1,131 +0,0 @@ -From foo@baz Wed Jul 10 12:02:20 PDT 2013 -Date: Wed, 10 Jul 2013 12:02:20 -0700 -To: Greg KH <gregkh@linuxfoundation.org> -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Subject: sysfs: add support for binary attributes in groups - -groups should be able to support binary attributes, just like it -supports "normal" attributes. This lets us only handle one type of -structure, groups, throughout the driver core and subsystems, making -binary attributes a "full fledged" part of the driver model, and not -something just "tacked on". - -Reported-by: Oliver Schinagl <oliver@schinagl.nl> -Reviewed-by: Guenter Roeck <linux@roeck-us.net> -Tested-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - fs/sysfs/group.c | 66 ++++++++++++++++++++++++++++++++++---------------- - include/linux/sysfs.h | 4 +-- - 2 files changed, 48 insertions(+), 22 deletions(-) - ---- a/fs/sysfs/group.c -+++ b/fs/sysfs/group.c -@@ -20,38 +20,64 @@ static void remove_files(struct sysfs_di - const struct attribute_group *grp) - { - struct attribute *const* attr; -- int i; -+ struct bin_attribute *const* bin_attr; - -- for (i = 0, attr = grp->attrs; *attr; i++, attr++) -- sysfs_hash_and_remove(dir_sd, NULL, (*attr)->name); -+ if (grp->attrs) -+ for (attr = grp->attrs; *attr; attr++) -+ sysfs_hash_and_remove(dir_sd, NULL, (*attr)->name); -+ if (grp->bin_attrs) -+ for (bin_attr = grp->bin_attrs; *bin_attr; bin_attr++) -+ sysfs_remove_bin_file(kobj, *bin_attr); - } - - static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj, - const struct attribute_group *grp, int update) - { - struct attribute *const* attr; -+ struct bin_attribute *const* bin_attr; - int error = 0, i; - -- for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++) { -- umode_t mode = 0; -+ if (grp->attrs) { -+ for (i = 0, attr = grp->attrs; *attr && !error; i++, attr++) { -+ umode_t mode = 0; - -- /* in update mode, we're changing the permissions or -- * visibility. Do this by first removing then -- * re-adding (if required) the file */ -- if (update) -- sysfs_hash_and_remove(dir_sd, NULL, (*attr)->name); -- if (grp->is_visible) { -- mode = grp->is_visible(kobj, *attr, i); -- if (!mode) -- continue; -+ /* -+ * In update mode, we're changing the permissions or -+ * visibility. Do this by first removing then -+ * re-adding (if required) the file. -+ */ -+ if (update) -+ sysfs_hash_and_remove(dir_sd, NULL, -+ (*attr)->name); -+ if (grp->is_visible) { -+ mode = grp->is_visible(kobj, *attr, i); -+ if (!mode) -+ continue; -+ } -+ error = sysfs_add_file_mode(dir_sd, *attr, -+ SYSFS_KOBJ_ATTR, -+ (*attr)->mode | mode); -+ if (unlikely(error)) -+ break; -+ } -+ if (error) { -+ remove_files(dir_sd, kobj, grp); -+ goto exit; -+ } -+ } -+ -+ if (grp->bin_attrs) { -+ for (bin_attr = grp->bin_attrs; *bin_attr; bin_attr++) { -+ if (update) -+ sysfs_remove_bin_file(kobj, *bin_attr); -+ error = sysfs_create_bin_file(kobj, *bin_attr); -+ if (error) -+ break; - } -- error = sysfs_add_file_mode(dir_sd, *attr, SYSFS_KOBJ_ATTR, -- (*attr)->mode | mode); -- if (unlikely(error)) -- break; -+ if (error) -+ remove_files(dir_sd, kobj, grp); - } -- if (error) -- remove_files(dir_sd, kobj, grp); -+exit: - return error; - } - ---- a/include/linux/sysfs.h -+++ b/include/linux/sysfs.h -@@ -21,6 +21,7 @@ - - struct kobject; - struct module; -+struct bin_attribute; - enum kobj_ns_type; - - struct attribute { -@@ -59,10 +60,9 @@ struct attribute_group { - umode_t (*is_visible)(struct kobject *, - struct attribute *, int); - struct attribute **attrs; -+ struct bin_attribute **bin_attrs; - }; - -- -- - /** - * Use these macros to make defining attributes easier. See include/linux/device.h - * for examples.. diff --git a/sysfs-prevent-warning-when-only-using-binary-attributes.patch b/sysfs-prevent-warning-when-only-using-binary-attributes.patch deleted file mode 100644 index 8c0774eca2aa93..00000000000000 --- a/sysfs-prevent-warning-when-only-using-binary-attributes.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 5a4066011878134c1ab9412bc147c28c30f0fa4b Mon Sep 17 00:00:00 2001 -From: Oliver Schinagl <oliver@schinagl.nl> -Date: Thu, 11 Jul 2013 13:40:20 +0200 -Subject: sysfs: prevent warning when only using binary attributes - -When only using bin_attrs instead of attrs the kernel prints a warning -and refuses to create the sysfs entry. This fixes that. - -Signed-off-by: Oliver Schinagl <oliver@schinagl.nl> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - fs/sysfs/group.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/fs/sysfs/group.c -+++ b/fs/sysfs/group.c -@@ -93,8 +93,8 @@ static int internal_create_group(struct - /* Updates may happen before the object has been instantiated */ - if (unlikely(update && !kobj->sd)) - return -EINVAL; -- if (!grp->attrs) { -- WARN(1, "sysfs: attrs not set by subsystem for group: %s/%s\n", -+ if (!grp->attrs && !grp->bin_attrs) { -+ WARN(1, "sysfs: (bin_)attrs not set by subsystem for group: %s/%s\n", - kobj->name, grp->name ? "" : grp->name); - return -EINVAL; - } diff --git a/sysfs-use-file-mode-defines-from-stat.h.patch b/sysfs-use-file-mode-defines-from-stat.h.patch deleted file mode 100644 index f96b8b73d4a665..00000000000000 --- a/sysfs-use-file-mode-defines-from-stat.h.patch +++ /dev/null @@ -1,45 +0,0 @@ -From a67de9f026363ce821c72a807d98830abece3cf7 Mon Sep 17 00:00:00 2001 -From: Oliver Schinagl <oliver@schinagl.nl> -Date: Thu, 11 Jul 2013 13:57:42 +0200 -Subject: sysfs: use file mode defines from stat.h - -With the last patches stat.h was included to the header, and thus those -permission defines should be used. - -Signed-off-by: Oliver Schinagl <oliver@schinagl.nl> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - include/linux/sysfs.h | 17 +++++++++-------- - 1 file changed, 9 insertions(+), 8 deletions(-) - ---- a/include/linux/sysfs.h -+++ b/include/linux/sysfs.h -@@ -69,18 +69,19 @@ struct attribute_group { - * for examples.. - */ - --#define __ATTR(_name,_mode,_show,_store) { \ -- .attr = {.name = __stringify(_name), .mode = _mode }, \ -- .show = _show, \ -- .store = _store, \ -+#define __ATTR(_name,_mode,_show,_store) { \ -+ .attr = {.name = __stringify(_name), .mode = _mode }, \ -+ .show = _show, \ -+ .store = _store, \ - } - --#define __ATTR_RO(_name) { \ -- .attr = { .name = __stringify(_name), .mode = 0444 }, \ -- .show = _name##_show, \ -+#define __ATTR_RO(_name) { \ -+ .attr = { .name = __stringify(_name), .mode = S_IRUGO }, \ -+ .show = _name##_show, \ - } - --#define __ATTR_RW(_name) __ATTR(_name, 0644, _name##_show, _name##_store) -+#define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO), \ -+ _name##_show, _name##_store) - - #define __ATTR_NULL { .attr = { .name = NULL } } - diff --git a/sysfs.h-add-__attr_rw-macro.patch b/sysfs.h-add-__attr_rw-macro.patch deleted file mode 100644 index e23971cb88196d..00000000000000 --- a/sysfs.h-add-__attr_rw-macro.patch +++ /dev/null @@ -1,51 +0,0 @@ -From foo@baz Mon Jul 8 12:30:29 PDT 2013 -Date: Mon, 08 Jul 2013 12:30:29 -0700 -To: Greg KH <gregkh@linuxfoundation.org> -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Subject: sysfs.h: add __ATTR_RW() macro - -A number of parts of the kernel created their own version of this, might -as well have the sysfs core provide it instead. - -Reviewed-by: Guenter Roeck <linux@roeck-us.net> -Tested-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---- - include/linux/sysfs.h | 2 ++ - kernel/events/core.c | 2 -- - mm/backing-dev.c | 2 -- - 3 files changed, 2 insertions(+), 4 deletions(-) - ---- a/include/linux/sysfs.h -+++ b/include/linux/sysfs.h -@@ -79,6 +79,8 @@ struct attribute_group { - .show = _name##_show, \ - } - -+#define __ATTR_RW(_name) __ATTR(_name, 0644, _name##_show, _name##_store) -+ - #define __ATTR_NULL { .attr = { .name = NULL } } - - #ifdef CONFIG_DEBUG_LOCK_ALLOC ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -6234,8 +6234,6 @@ perf_event_mux_interval_ms_store(struct - return count; - } - --#define __ATTR_RW(attr) __ATTR(attr, 0644, attr##_show, attr##_store) -- - static struct device_attribute pmu_dev_attrs[] = { - __ATTR_RO(type), - __ATTR_RW(perf_event_mux_interval_ms), ---- a/mm/backing-dev.c -+++ b/mm/backing-dev.c -@@ -232,8 +232,6 @@ static ssize_t stable_pages_required_sho - bdi_cap_stable_pages_required(bdi) ? 1 : 0); - } - --#define __ATTR_RW(attr) __ATTR(attr, 0644, attr##_show, attr##_store) -- - static struct device_attribute bdi_dev_attrs[] = { - __ATTR_RW(read_ahead_kb), - __ATTR_RW(min_ratio), diff --git a/sysfs.h-add-attribute_groups-macro.patch b/sysfs.h-add-attribute_groups-macro.patch deleted file mode 100644 index c6775e4880130a..00000000000000 --- a/sysfs.h-add-attribute_groups-macro.patch +++ /dev/null @@ -1,35 +0,0 @@ -From foo@baz Mon Jul 8 16:40:50 PDT 2013 -Date: Mon, 08 Jul 2013 16:40:50 -0700 -To: Greg KH <gregkh@linuxfoundation.org> -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Subject: sysfs.h: add ATTRIBUTE_GROUPS() macro - -To make it easier for driver subsystems to work with attribute groups, -create the ATTRIBUTE_GROUPS macro to remove some of the repetitive -typing for the most common use for attribute groups. - -Reviewed-by: Guenter Roeck <linux@roeck-us.net> -Tested-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---- - include/linux/sysfs.h | 9 +++++++++ - 1 file changed, 9 insertions(+) - ---- a/include/linux/sysfs.h -+++ b/include/linux/sysfs.h -@@ -94,6 +94,15 @@ struct attribute_group { - #define __ATTR_IGNORE_LOCKDEP __ATTR - #endif - -+#define ATTRIBUTE_GROUPS(name) \ -+static const struct attribute_group name##_group = { \ -+ .attrs = name##_attrs, \ -+}; \ -+static const struct attribute_group *name##_groups[] = { \ -+ &name##_group, \ -+ NULL, \ -+} -+ - #define attr_name(_attr) (_attr).attr.name - - struct file; diff --git a/sysfs.h-add-bin_attr-macro.patch b/sysfs.h-add-bin_attr-macro.patch deleted file mode 100644 index f3a1c5b230f365..00000000000000 --- a/sysfs.h-add-bin_attr-macro.patch +++ /dev/null @@ -1,34 +0,0 @@ -From foo@baz Wed Jul 10 12:06:27 PDT 2013 -Date: Wed, 10 Jul 2013 12:06:27 -0700 -To: Greg KH <gregkh@linuxfoundation.org> -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Subject: sysfs.h: add BIN_ATTR macro - -This makes it easier to create static binary attributes, which is needed -in a number of drivers, instead of "open coding" them. - -Reviewed-by: Guenter Roeck <linux@roeck-us.net> -Tested-by: Guenter Roeck <linux@roeck-us.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> ---- - include/linux/sysfs.h | 9 +++++++++ - 1 file changed, 9 insertions(+) - ---- a/include/linux/sysfs.h -+++ b/include/linux/sysfs.h -@@ -132,6 +132,15 @@ struct bin_attribute { - */ - #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) - -+/* macro to create static binary attributes easier */ -+#define BIN_ATTR(_name, _mode, _read, _write, _size) \ -+struct bin_attribute bin_attr_##_name = { \ -+ .attr = {.name = __stringify(_name), .mode = _mode }, \ -+ .read = _read, \ -+ .write = _write, \ -+ .size = _size, \ -+} -+ - struct sysfs_ops { - ssize_t (*show)(struct kobject *, struct attribute *,char *); - ssize_t (*store)(struct kobject *,struct attribute *,const char *, size_t); |