• Linus Walleij's avatar
    mmc: block: Fix bug when removing RPMB chardev · 1c87f735
    Linus Walleij authored
    I forgot to account for the fact that the device core holds a
    reference to a device added with device_initialize() that need
    to be released with a corresponding put_device() to reach a 0
    refcount at the end of the lifecycle.
    
    This led to a NULL pointer reference when freeing the device
    when e.g. unbidning the host device in sysfs.
    
    Fix this and use the device .release() callback to free the
    IDA and free:ing the memory used by the RPMB device.
    
    Before this patch:
    
    /sys/bus/amba/drivers/mmci-pl18x$ echo 80114000.sdi4_per2 > unbind
    [   29.797332] mmc3: card 0001 removed
    [   29.810791] Unable to handle kernel NULL pointer dereference at
                   virtual address 00000050
    [   29.818878] pgd = de70c000
    [   29.821624] [00000050] *pgd=1e70a831, *pte=00000000, *ppte=00000000
    [   29.827911] Internal error: Oops: 17 [#1] PREEMPT SMP ARM
    [   29.833282] Modules linked in:
    [   29.836334] CPU: 1 PID: 154 Comm: sh Not tainted
                   4.14.0-rc3-00039-g83318e309566-dirty #736
    [   29.844604] Hardware name: ST-Ericsson Ux5x0 platform (Device Tree Support)
    [   29.851562] task: de572700 task.stack: de742000
    [   29.856079] PC is at kernfs_find_ns+0x8/0x100
    [   29.860443] LR is at kernfs_find_and_get_ns+0x30/0x48
    
    After this patch:
    
    /sys/bus/amba/drivers/mmci-pl18x$ echo 80005000.sdi4_per2 > unbind
    [   20.623382] mmc3: card 0001 removed
    
    Fixes: 97548575 ("mmc: block: Convert RPMB to a character device")
    Reported-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
    1c87f735
block.c 70.6 KB