• Jean Delvare's avatar
    i2c: Fix userspace_device list corruption · bbd2d9c9
    Jean Delvare authored
    Fix userspace_device list corruption. The corruption was caused by
    clients not being removed when adapters with such clients were
    themselves removed. Something like the following would trigger it
    (assuming i2c-stub gets adapter number 3):
    
    # modprobe i2c-stub chip_addr=0x50
    # echo 24c08 0x50 > /sys/bus/i2c/devices/i2c-3/new_device 
    # rmmod i2c-stub
    # modprobe i2c-stub chip_addr=0x50
    # echo 24c08 0x50 > /sys/bus/i2c/devices/i2c-3/new_device 
    
    For the records, the stack trace in the kernel logs look like this:
    
    kernel: WARNING: at lib/list_debug.c:30 __list_add+0x8b/0x90()
    kernel: Hardware name: (...)
    kernel: list_add corruption. prev->next should be next (c137fc84), but was (null). (prev=f57111b8).
    kernel: Modules linked in: (...)
    kernel: Pid: 4669, comm: bash Not tainted 2.6.32-rc8 #259
    kernel: Call Trace:
    kernel:  [<c111eb8b>] ? __list_add+0x8b/0x90
    kernel:  [<c111eb8b>] ? __list_add+0x8b/0x90
    kernel:  [<c103265c>] warn_slowpath_common+0x6c/0xc0
    kernel:  [<c111eb8b>] ? __list_add+0x8b/0x90
    kernel:  [<c10326f6>] warn_slowpath_fmt+0x26/0x30
    kernel:  [<c111eb8b>] __list_add+0x8b/0x90
    kernel:  [<c11ba165>] i2c_sysfs_new_device+0x1c5/0x250
    kernel:  [<c10861be>] ? might_fault+0x2e/0x80
    kernel:  [<c11b9fa0>] ? i2c_sysfs_new_device+0x0/0x250
    kernel:  [<c118c625>] dev_attr_store+0x25/0x30
    kernel:  [<c10e305c>] sysfs_write_file+0x9c/0xf0
    kernel:  [<c109d35c>] vfs_write+0x9c/0x160
    kernel:  [<c10e2fc0>] ? sysfs_write_file+0x0/0xf0
    kernel:  [<c109d4dd>] sys_write+0x3d/0x70
    kernel:  [<c1002ed8>] sysenter_do_call+0x12/0x36
    Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
    bbd2d9c9
i2c-core.c 52.9 KB