| --- a/compat/drivers-base-devcoredump.c |
| +++ b/compat/drivers-base-devcoredump.c |
| @@ -30,6 +30,7 @@ |
| #include <linux/slab.h> |
| #include <linux/fs.h> |
| #include <linux/workqueue.h> |
| +#include "backports.h" |
| |
| static struct class devcd_class; |
| |
| @@ -39,6 +40,10 @@ static bool devcd_disabled; |
| /* if data isn't read by userspace after 5 minutes then delete it */ |
| #define DEVCD_TIMEOUT (HZ * 60 * 5) |
| |
| +#if LINUX_VERSION_IS_LESS(3,11,0) |
| +static struct bin_attribute devcd_attr_data; |
| +#endif |
| + |
| struct devcd_entry { |
| struct device devcd_dev; |
| const void *data; |
| @@ -68,8 +73,7 @@ static void devcd_dev_release(struct dev |
| * a struct device to know when it goes away? |
| */ |
| if (devcd->failing_dev->kobj.sd) |
| - sysfs_delete_link(&devcd->failing_dev->kobj, &dev->kobj, |
| - "devcoredump"); |
| + sysfs_remove_link(&devcd->failing_dev->kobj, "devcoredump"); |
| |
| put_device(devcd->failing_dev); |
| kfree(devcd); |
| @@ -81,6 +85,9 @@ static void devcd_del(struct work_struct |
| |
| devcd = container_of(wk, struct devcd_entry, del_wk.work); |
| |
| +#if LINUX_VERSION_IS_LESS(3,11,0) |
| + device_remove_bin_file(&devcd->devcd_dev, &devcd_attr_data); |
| +#endif |
| device_del(&devcd->devcd_dev); |
| put_device(&devcd->devcd_dev); |
| } |
| @@ -114,6 +121,7 @@ static struct bin_attribute devcd_attr_d |
| .write = devcd_data_write, |
| }; |
| |
| +#if LINUX_VERSION_IS_GEQ(3,11,0) |
| static struct bin_attribute *devcd_dev_bin_attrs[] = { |
| &devcd_attr_data, NULL, |
| }; |
| @@ -125,6 +133,7 @@ static const struct attribute_group devc |
| static const struct attribute_group *devcd_dev_groups[] = { |
| &devcd_dev_group, NULL, |
| }; |
| +#endif /* LINUX_VERSION_IS_GEQ(3,11,0) */ |
| |
| static int devcd_free(struct device *dev, void *data) |
| { |
| @@ -169,7 +178,9 @@ static struct class devcd_class = { |
| .name = "devcoredump", |
| .owner = THIS_MODULE, |
| .dev_release = devcd_dev_release, |
| +#if LINUX_VERSION_IS_GEQ(3,11,0) |
| .dev_groups = devcd_dev_groups, |
| +#endif |
| .class_groups = devcd_class_groups, |
| }; |
| |
| @@ -270,6 +281,11 @@ void dev_coredumpm(struct device *dev, s |
| if (device_add(&devcd->devcd_dev)) |
| goto put_device; |
| |
| +#if LINUX_VERSION_IS_LESS(3,11,0) |
| + if (device_create_bin_file(&devcd->devcd_dev, &devcd_attr_data)) |
| + goto put_device; |
| +#endif |
| + |
| if (sysfs_create_link(&devcd->devcd_dev.kobj, &dev->kobj, |
| "failing_device")) |
| /* nothing - symlink will be missing */; |
| @@ -291,15 +307,13 @@ void dev_coredumpm(struct device *dev, s |
| } |
| EXPORT_SYMBOL_GPL(dev_coredumpm); |
| |
| -static int __init devcoredump_init(void) |
| +int __init devcoredump_init(void) |
| { |
| return class_register(&devcd_class); |
| } |
| -__initcall(devcoredump_init); |
| |
| -static void __exit devcoredump_exit(void) |
| +void __exit devcoredump_exit(void) |
| { |
| class_for_each_device(&devcd_class, NULL, NULL, devcd_free); |
| class_unregister(&devcd_class); |
| } |
| -__exitcall(devcoredump_exit); |
| --- a/include/linux/backport-devcoredump.h |
| +++ b/include/linux/backport-devcoredump.h |
| @@ -66,7 +66,7 @@ static inline void _devcd_free_sgtable(struct scatterlist *tab |
| } |
| |
| |
| -#ifdef CONFIG_DEV_COREDUMP |
| +#ifdef CPTCFG_BPAUTO_WANT_DEV_COREDUMP |
| void dev_coredumpv(struct device *dev, void *data, size_t datalen, |
| gfp_t gfp); |
| |
| @@ -100,6 +100,6 @@ static inline void dev_coredumpsg(struct device *dev, struct |
| { |
| _devcd_free_sgtable(table); |
| } |
| -#endif /* CONFIG_DEV_COREDUMP */ |
| +#endif /* CPTCFG_BPAUTO_WANT_DEV_COREDUMP */ |
| |
| #endif /* __DEVCOREDUMP_H */ |
| --- a/include/linux/devcoredump.h |
| +++ b/include/linux/devcoredump.h |
| @@ -1,6 +1,7 @@ |
| /* Automatically created during backport process */ |
| #ifndef CPTCFG_BPAUTO_BUILD_WANT_DEV_COREDUMP |
| #include_next <linux/devcoredump.h> |
| +#include <linux/bp-devcoredump.h> |
| #else |
| #undef dev_coredumpv |
| #define dev_coredumpv LINUX_BACKPORT(dev_coredumpv) |