diff mbox

issue with devcoredump.patch

Message ID 118eb454-703f-9de9-6fc4-5326de6592ca@broadcom.com (mailing list archive)
State Not Applicable
Headers show

Commit Message

Arend van Spriel Jan. 10, 2017, 11:16 a.m. UTC
With 4.10-rc1 the devcoredump.patch in patches/backport-adjustment no
longer applies due to following commit:

commit f76d25275c314defb684fdd692239507001774bc
Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date:   Mon Nov 28 16:41:58 2016 +0100

    driver core: devcoredump: convert to use class_groups

    Convert devcoredump to use class_groups instead of class_attrs as that's
    the correct way to handle lists of class attribute files.

    Acked-by: Johannes Berg <johannes@sipsolutions.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

So I am reworking the patch file (attached). When I run gentree I get
following:

Traceback (most recent call last):
  File "./gentree.py", line 1091, in <module>
    ret = _main()
  File "./gentree.py", line 724, in _main
    logwrite=logwrite)
  File "./gentree.py", line 906, in process
    apply_patches(args, "backport", source_dir, 'patches',
bpid.target_dir, logwrite)
  File "./gentree.py", line 514, in apply_patches
    raise Exception('No patch content found in %s' % print_name)
Exception: No patch content found in backport-adjustments/devcoredump.patch

However, go into the target dir and applying patch works fine:

$ patch -p1 < ~-/patches/backport-adjustments/devcoredump.patch
patching file compat/drivers-base-devcoredump.c
Hunk #7 succeeded at 181 with fuzz 1 (offset 2 lines).
Hunk #8 succeeded at 248 (offset 2 lines).
Hunk #9 succeeded at 339 (offset 2 lines).
Hunk #10 succeeded at 386 (offset 2 lines).
patching file include/linux/backport-devcoredump.h

So I am a bit puzzled as to what is going on so currently debugging
lib/patch.py. If anyone has a good hint feel free to let me know.

Regards,
Arend

Comments

Arend van Spriel Jan. 10, 2017, 8:39 p.m. UTC | #1
On 10-1-2017 12:16, Arend Van Spriel wrote:
> With 4.10-rc1 the devcoredump.patch in patches/backport-adjustment no
> longer applies due to following commit:
> 
> commit f76d25275c314defb684fdd692239507001774bc
> Author: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Date:   Mon Nov 28 16:41:58 2016 +0100
> 
>     driver core: devcoredump: convert to use class_groups
> 
>     Convert devcoredump to use class_groups instead of class_attrs as that's
>     the correct way to handle lists of class attribute files.
> 
>     Acked-by: Johannes Berg <johannes@sipsolutions.net>
>     Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> 
> So I am reworking the patch file (attached). When I run gentree I get
> following:
> 
> Traceback (most recent call last):
>   File "./gentree.py", line 1091, in <module>
>     ret = _main()
>   File "./gentree.py", line 724, in _main
>     logwrite=logwrite)
>   File "./gentree.py", line 906, in process
>     apply_patches(args, "backport", source_dir, 'patches',
> bpid.target_dir, logwrite)
>   File "./gentree.py", line 514, in apply_patches
>     raise Exception('No patch content found in %s' % print_name)
> Exception: No patch content found in backport-adjustments/devcoredump.patch
> 
> However, go into the target dir and applying patch works fine:
> 
> $ patch -p1 < ~-/patches/backport-adjustments/devcoredump.patch
> patching file compat/drivers-base-devcoredump.c
> Hunk #7 succeeded at 181 with fuzz 1 (offset 2 lines).
> Hunk #8 succeeded at 248 (offset 2 lines).
> Hunk #9 succeeded at 339 (offset 2 lines).
> Hunk #10 succeeded at 386 (offset 2 lines).
> patching file include/linux/backport-devcoredump.h
> 
> So I am a bit puzzled as to what is going on so currently debugging
> lib/patch.py. If anyone has a good hint feel free to let me know.

Turns out that at line 70 of the patch file there is no single space
before the tab, which lib/patch.py marks as an error. With that fixed
the fun really starts as I get following code:

static CLASS_ATTR_RW(disabled);

static struct attribute *devcd_class_attrs[] = {
        &class_attr_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",
        .owner          = THIS_MODULE,
        .dev_release    = devcd_dev_release,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
        .dev_groups     = devcd_dev_groups,
#else
        .dev_attrs = devcd_class_dev_attrs,
#endif
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
        .class_attrs    = devcd_class_attrs,
#else
        .class_groups   = devcd_class_groups,
#endif
};

This is because the new devcoredump.c in 4.10-rc1 now triggers a
Coccinelle script to kick in, ie.
patches/collateral-evolutions/generic/0001-group-attr/0001-group_attr_class.cocci.
It seems to kick in because of the ATTRIBUTE_GROUPS(devcd_class) macro.

Regards,
Arend
--
To unsubscribe from this list: send the line "unsubscribe backports" in
Luca Coelho Jan. 28, 2017, 10:50 a.m. UTC | #2
Hey Arend,

On Tue, 2017-01-10 at 21:39 +0100, Arend Van Spriel wrote:
> Turns out that at line 70 of the patch file there is no single space
> before the tab, which lib/patch.py marks as an error. With that fixed
> the fun really starts as I get following code:
> 
> static CLASS_ATTR_RW(disabled);
> 
> static struct attribute *devcd_class_attrs[] = {
>         &class_attr_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",
>         .owner          = THIS_MODULE,
>         .dev_release    = devcd_dev_release,
> #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
> #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
>         .dev_groups     = devcd_dev_groups,
> #else
>         .dev_attrs = devcd_class_dev_attrs,
> #endif
> #endif
> #if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
>         .class_attrs    = devcd_class_attrs,
> #else
>         .class_groups   = devcd_class_groups,
> #endif
> };
> 
> This is because the new devcoredump.c in 4.10-rc1 now triggers a
> Coccinelle script to kick in, ie.
> patches/collateral-evolutions/generic/0001-group-attr/0001-group_attr_class.cocci.
> It seems to kick in because of the ATTRIBUTE_GROUPS(devcd_class) macro.

Did you ever get this to work? I'm getting this warnings:

home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:197:3: warning: initialization from incompatible pointer type [enabled by default]
   .class_attrs = devcd_class_attrs,
   ^
/home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:197:3: warning: (near initialization for ‘devcd_class.class_attrs’) [enabled by default]
In file included from /home/luca/iwlwifi/stack-dev/backport-include/linux/sysfs.h:3:0,
                 from include/linux/kobject.h:21,
                 from include/linux/module.h:17,
                 from /home/luca/iwlwifi/stack-dev/backport-include/linux/module.h:3,
                 from /home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:27:
/home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:179:18: warning: ‘devcd_class_groups’ defined but not used [-Wunused-variable]
 ATTRIBUTE_GROUPS(devcd_class);
                  ^
include/linux/sysfs.h:131:38: note: in definition of macro ‘__ATTRIBUTE_GROUPS’
 static const struct attribute_group *_name##_groups[] = { \
                                      ^
/home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:179:1: note: in expansion of macro ‘ATTRIBUTE_GROUPS’
 ATTRIBUTE_GROUPS(devcd_class);
 ^

Any idea how to fix it?

--
Cheers,
Luca.
--
To unsubscribe from this list: send the line "unsubscribe backports" in
Arend van Spriel Jan. 30, 2017, 8:27 a.m. UTC | #3
On 28-1-2017 11:50, Luca Coelho wrote:
> Hey Arend,
> 
> On Tue, 2017-01-10 at 21:39 +0100, Arend Van Spriel wrote:
>> Turns out that at line 70 of the patch file there is no single space
>> before the tab, which lib/patch.py marks as an error. With that fixed
>> the fun really starts as I get following code:
>>
>> static CLASS_ATTR_RW(disabled);
>>
>> static struct attribute *devcd_class_attrs[] = {
>>         &class_attr_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",
>>         .owner          = THIS_MODULE,
>>         .dev_release    = devcd_dev_release,
>> #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
>> #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
>>         .dev_groups     = devcd_dev_groups,
>> #else
>>         .dev_attrs = devcd_class_dev_attrs,
>> #endif
>> #endif
>> #if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
>>         .class_attrs    = devcd_class_attrs,
>> #else
>>         .class_groups   = devcd_class_groups,
>> #endif
>> };
>>
>> This is because the new devcoredump.c in 4.10-rc1 now triggers a
>> Coccinelle script to kick in, ie.
>> patches/collateral-evolutions/generic/0001-group-attr/0001-group_attr_class.cocci.
>> It seems to kick in because of the ATTRIBUTE_GROUPS(devcd_class) macro.
> 
> Did you ever get this to work? I'm getting this warnings:
> 
> home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:197:3: warning: initialization from incompatible pointer type [enabled by default]
>    .class_attrs = devcd_class_attrs,
>    ^
> /home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:197:3: warning: (near initialization for ‘devcd_class.class_attrs’) [enabled by default]
> In file included from /home/luca/iwlwifi/stack-dev/backport-include/linux/sysfs.h:3:0,
>                  from include/linux/kobject.h:21,
>                  from include/linux/module.h:17,
>                  from /home/luca/iwlwifi/stack-dev/backport-include/linux/module.h:3,
>                  from /home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:27:
> /home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:179:18: warning: ‘devcd_class_groups’ defined but not used [-Wunused-variable]
>  ATTRIBUTE_GROUPS(devcd_class);
>                   ^
> include/linux/sysfs.h:131:38: note: in definition of macro ‘__ATTRIBUTE_GROUPS’
>  static const struct attribute_group *_name##_groups[] = { \
>                                       ^
> /home/luca/iwlwifi/stack-dev/compat/drivers-base-devcoredump.c:179:1: note: in expansion of macro ‘ATTRIBUTE_GROUPS’
>  ATTRIBUTE_GROUPS(devcd_class);
>  ^
> 
> Any idea how to fix it?

Yeah. This is what I hit after fixing the devcoredump.patch. Because of
the recent change in drivers/base/devcoredump.c I think
0001-group_attr_class.cocci needs to be quite a bit smarter. My SmPL
knowledge is still somewhat limited so I did not get it working
properly. Maybe posting the problem (in simplified form) on the Cocci
mailing list will get us a solution.

Regards,
Arend

--
To unsubscribe from this list: send the line "unsubscribe backports" in
diff mbox

Patch

diff --git a/compat/drivers-base-devcoredump.c b/compat/drivers-base-devcoredump.c
index 240374f..8bb376b 100644
--- 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 device *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 *wk)
 
 	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_data = {
 	.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 devcd_dev_group = {
 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)
 {
@@ -170,7 +179,13 @@  static struct class devcd_class = {
 	.name		= "devcoredump",
 	.owner		= THIS_MODULE,
 	.dev_release	= devcd_dev_release,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
 	.dev_groups	= devcd_dev_groups,
+#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
+ 	.class_attrs	= devcd_class_attrs,
+#else
	.class_groups	= devcd_class_groups,
+#endif
 };
 
@@ -231,6 +242,14 @@  static void devcd_free_sgtable(void *data)
 	_devcd_free_sgtable(data);
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
+size_t sg_pcopy_to_buffer(struct scatterlist *sgl, unsigned int nents,
+			  void *buf, size_t buflen, off_t skip)
+{
+	return 0;
+}
+#endif
+
 /**
  * devcd_read_from_table - copy data from sg_table to a given buffer
  * and return the number of bytes read
@@ -314,6 +333,11 @@  void dev_coredumpm(struct device *dev, struct module *owner,
 	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 */;
@@ -356,15 +380,13 @@  void dev_coredumpsg(struct device *dev, struct scatterlist *table,
 }
 EXPORT_SYMBOL_GPL(dev_coredumpsg);
 
-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 *table)
 }
 
 
-#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 scatterlist *table,
 {
 	_devcd_free_sgtable(table);
 }
-#endif /* CONFIG_DEV_COREDUMP */
+#endif /* CPTCFG_BPAUTO_WANT_DEV_COREDUMP */
 
 #endif /* __DEVCOREDUMP_H */