649e766a64
Signed-off-by: Felix Fietkau <nbd@nbd.name>
152 lines
4.4 KiB
Diff
152 lines
4.4 KiB
Diff
--- a/compat/Makefile
|
|
+++ b/compat/Makefile
|
|
@@ -35,8 +35,6 @@ compat-$(CPTCFG_KERNEL_4_6) += backport-
|
|
|
|
compat-$(CPTCFG_BPAUTO_BUILD_CRYPTO_CCM) += crypto-ccm.o
|
|
compat-$(CPTCFG_BPAUTO_CRYPTO_SKCIPHER) += crypto-skcipher.o
|
|
-skcipher-objs += crypto-skcipher.o
|
|
-obj-$(CPTCFG_BPAUTO_CRYPTO_SKCIPHER) += skcipher.o
|
|
compat-$(CPTCFG_BPAUTO_BUILD_WANT_DEV_COREDUMP) += drivers-base-devcoredump.o
|
|
compat-$(CPTCFG_BPAUTO_RHASHTABLE) += lib-rhashtable.o
|
|
cordic-objs += lib-cordic.o
|
|
--- a/compat/drivers-base-devcoredump.c
|
|
+++ b/compat/drivers-base-devcoredump.c
|
|
@@ -31,6 +31,7 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/workqueue.h>
|
|
+#include "backports.h"
|
|
|
|
static struct class devcd_class;
|
|
|
|
@@ -40,6 +41,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_CODE < KERNEL_VERSION(3,11,0)
|
|
+static struct bin_attribute devcd_attr_data;
|
|
+#endif
|
|
+
|
|
struct devcd_entry {
|
|
struct device devcd_dev;
|
|
void *data;
|
|
@@ -69,8 +74,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);
|
|
@@ -82,6 +86,9 @@ static void devcd_del(struct work_struct
|
|
|
|
devcd = container_of(wk, struct devcd_entry, del_wk.work);
|
|
|
|
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
|
|
+ device_remove_bin_file(&devcd->devcd_dev, &devcd_attr_data);
|
|
+#endif
|
|
device_del(&devcd->devcd_dev);
|
|
put_device(&devcd->devcd_dev);
|
|
}
|
|
@@ -115,6 +122,7 @@ static struct bin_attribute devcd_attr_d
|
|
.write = devcd_data_write,
|
|
};
|
|
|
|
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
|
|
static struct bin_attribute *devcd_dev_bin_attrs[] = {
|
|
&devcd_attr_data, NULL,
|
|
};
|
|
@@ -126,6 +134,7 @@ static const struct attribute_group devc
|
|
static const struct attribute_group *devcd_dev_groups[] = {
|
|
&devcd_dev_group, NULL,
|
|
};
|
|
+#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0) */
|
|
|
|
static int devcd_free(struct device *dev, void *data)
|
|
{
|
|
@@ -160,18 +169,11 @@ static ssize_t disabled_store(struct cla
|
|
|
|
return count;
|
|
}
|
|
-static CLASS_ATTR_RW(disabled);
|
|
|
|
-static struct attribute *devcd_class_attrs[] = {
|
|
- &class_attr_disabled.attr,
|
|
- NULL,
|
|
+static struct class_attribute devcd_class_attrs[] = {
|
|
+ __ATTR_RW(disabled),
|
|
+ __ATTR_NULL
|
|
};
|
|
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
|
|
-ATTRIBUTE_GROUPS(devcd_class);
|
|
-#else
|
|
-#define BP_ATTR_GRP_STRUCT device_attribute
|
|
-ATTRIBUTE_GROUPS_BACKPORT(devcd_class);
|
|
-#endif
|
|
|
|
static struct class devcd_class = {
|
|
.name = "devcoredump",
|
|
@@ -179,10 +181,8 @@ static struct class devcd_class = {
|
|
.dev_release = devcd_dev_release,
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
|
|
.dev_groups = devcd_dev_groups,
|
|
-#else
|
|
- .dev_attrs = devcd_class_dev_attrs,
|
|
#endif
|
|
- .class_groups = devcd_class_groups,
|
|
+ .class_attrs = devcd_class_attrs,
|
|
};
|
|
|
|
static ssize_t devcd_readv(char *buffer, loff_t offset, size_t count,
|
|
@@ -325,6 +325,11 @@ void dev_coredumpm(struct device *dev, s
|
|
if (device_add(&devcd->devcd_dev))
|
|
goto put_device;
|
|
|
|
+#if LINUX_VERSION_CODE < KERNEL_VERSION(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 */;
|
|
@@ -367,16 +372,13 @@ void dev_coredumpsg(struct device *dev,
|
|
}
|
|
EXPORT_SYMBOL_GPL(dev_coredumpsg);
|
|
|
|
-static int __init devcoredump_init(void)
|
|
+int __init devcoredump_init(void)
|
|
{
|
|
- init_devcd_class_attrs();
|
|
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(s
|
|
}
|
|
|
|
|
|
-#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
|
|
{
|
|
_devcd_free_sgtable(table);
|
|
}
|
|
-#endif /* CONFIG_DEV_COREDUMP */
|
|
+#endif /* CPTCFG_BPAUTO_WANT_DEV_COREDUMP */
|
|
|
|
#endif /* __DEVCOREDUMP_H */
|