[lm-sensors] [PATCH] hwmon: (adm1026) Properly terminate sysfs groups (Was: panic about sysfs with adm1026)

Jean Delvare khali at linux-fr.org
Sun Feb 10 19:01:15 CET 2008


On Sun, 10 Feb 2008 09:10:04 -0800, Greg KH wrote:
> On Sat, Feb 09, 2008 at 11:55:43PM -0800, Yinghai Lu wrote:
> > Calling initcall 0xffffffff80c4b575: sm_adm1026_init+0x0/0xe()
> > i2c-adapter i2c-1: : Unrecognized stepping 0x45. Defaulting to ADM1026.
> > general protection fault: 0000 [1] SMP
> > CPU 0
> > Modules linked in:
> > Pid: 1, comm: swapper Not tainted 2.6.24-smp-09379-g0cf975e-dirty #34
> > RIP: 0010:[<ffffffff802d79ad>]  [<ffffffff802d79ad>] sysfs_add_file+0x16/0x81
> > RSP: 0000:ffff81040503dd50  EFLAGS: 00010286
> > RAX: 0000000000000000 RBX: fffe002e002d002c RCX: 00000000000048d9
> > RDX: 0000000000000002 RSI: fffe002e002d002c RDI: ffff810202c4fb90
> > RBP: 0000000000000000 R08: ffff810202c4fb90 R09: 0000000000000000
> > R10: 0000000000000002 R11: 0000000000000002 R12: 00000000fffffff4
> > R13: ffff810202c4fb90 R14: 000000000000000c R15: ffff810202c4fb90
> > FS:  0000000000000000(0000) GS:ffffffff80bde000(0000) knlGS:0000000000000000
> > CS:  0010 DS: 0018 ES: 0018 CR0: 000000008005003b
> > CR2: 00007fff94de3470 CR3: 0000000000201000 CR4: 00000000000006e0
> > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> > DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> > Process swapper (pid: 1, threadinfo ffff81040503c000, task ffff810205040000)
> > Stack:  ffff810202c4fb90 0000000000000000 0000000000000000 0000000000000001
> >  ffff810202c4e000 ffffffff80b87850 0000000000000000 ffff810202c4e118
> >  ffffffff808e0cc0 ffffffff802d933c ffff81040503dd55 ffff810202c17878
> > Call Trace:
> >  [<ffffffff802d933c>] sysfs_create_group+0xa2/0x106
> >  [<ffffffff8069fbc2>] adm1026_detect+0x4b3/0x522
> >  [<ffffffff8069f70f>] adm1026_detect+0x0/0x522
> >  [<ffffffff80698bff>] i2c_probe_address+0xb9/0xfc
> >  [<ffffffff806997db>] i2c_probe+0x162/0x175
> >  [<ffffffff8069f70f>] adm1026_detect+0x0/0x522
> >  [<ffffffff8069910f>] i2c_register_driver+0x9a/0xea
> >  [<ffffffff80c276d2>] kernel_init+0x15d/0x2c9
> >  [<ffffffff8021fc68>] child_rip+0xa/0x12
> >  [<ffffffff80c27575>] kernel_init+0x0/0x2c9
> >  [<ffffffff8021fc5e>] child_rip+0x0/0x12
> > 
> > 
> > Code: c0 84 c0 74 0c 41 58 48 89 df 5b 5d e9 2a 07 00 00 5e 5b 5d c3
> > 41 55 49 89 fd 41 54 41 bc f4 ff ff ff 55 53 48 89 f3 48 83 ec 28 <8b>
> > 76 10 48 8b 3b 66 81 e6 ff 0f 66 81 ce 00 80 0f b7 f6 e8 fd
> > RIP  [<ffffffff802d79ad>] sysfs_add_file+0x16/0x81
> >  RSP <ffff81040503dd50>
> > ---[ end trace b23a825db37d3043 ]---
> 
> Perhaps the adm1026 driver is not calling sysfs_create_group properly?
> 
> Jean, any ideas?

Yeah, I am an idiot. In 5b34dbcd88251508d02e48ad9b0f9b8232a13ee0 I
introduced two new sysfs file groups but forgot to NULL-terminate them.
Sorry about that, here's the fix:

* * * * *

The missing NULL at the end of two sysfs file groups causes a kernel
crash when calling sysfs_create_group().

Signed-off-by: Jean Delvare <khali at linux-fr.org>
---
 drivers/hwmon/adm1026.c |    2 ++
 1 file changed, 2 insertions(+)

--- linux-2.6.25-rc0.orig/drivers/hwmon/adm1026.c	2008-02-10 11:21:54.000000000 +0100
+++ linux-2.6.25-rc0/drivers/hwmon/adm1026.c	2008-02-10 18:51:00.000000000 +0100
@@ -1624,6 +1624,7 @@ static struct attribute *adm1026_attribu
 	&dev_attr_temp3_crit_enable.attr,
 	&dev_attr_temp3_auto_point1_pwm.attr,
 	&dev_attr_temp3_auto_point2_pwm.attr,
+	NULL
 };
 
 static const struct attribute_group adm1026_group_temp3 = {
@@ -1639,6 +1640,7 @@ static struct attribute *adm1026_attribu
 	&sensor_dev_attr_in9_max.dev_attr.attr,
 	&sensor_dev_attr_in9_min.dev_attr.attr,
 	&sensor_dev_attr_in9_alarm.dev_attr.attr,
+	NULL
 };
 
 static const struct attribute_group adm1026_group_in8_9 = {

* * * * *

Yinghai, the bug crept in because I do not have an ADM1026 chip to test
my changes. Could you please send a dump of your chip to me, so that I
can emulate it? This would avoid similar problems in the future.

First you have to find out at which address the ADM1026 chip lives. The
first line of "sensors" should tell, otherwise you can run "i2cdetect
1". The ADM1026 can live at 0x2c, 0x2d or 0x2e. Once you know the
address, run the following command to get the dump:

rmmod adm1026
i2cdump 1 0x2d b

(Replace 0x2d with the actual address.)

Thanks,
-- 
Jean Delvare




More information about the lm-sensors mailing list