Patch "zram: fix unbalanced idr management at hot removal" has been added to the 4.8-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
zram: fix unbalanced idr management at hot removal
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
zram-fix-unbalanced-idr-management-at-hot-removal.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
529e71e16403830ae0d737a66c55c5f360f3576bMon Sep 17 00:00:00 2001
From: Takashi Iwai <[email protected]>
Date: Wed, 30 Nov 2016 15:54:08 -0800
Subject: zram: fix unbalanced idr management at hot removal
From: Takashi Iwai <[email protected]>
commit 529e71e16403830ae0d737a66c55c5f360f3576b upstream.
The zram hot removal code calls idr_remove() even when zram_remove() returns an error (typically -EBUSY). This results in a leftover at the device release, eventually leading to a crash when the module is reloaded.
As described in the bug report below, the following procedure would cause an Oops with zram:
- provision three zram devices via modprobe zram num_devices=3
- configure a size for each device
+ echo "1G" > /sys/block/$zram_name/disksize
- mkfs and mount zram0 only
- attempt to hot remove all three devices
+ echo 2 > /sys/class/zram-control/hot_remove
+ echo 1 > /sys/class/zram-control/hot_remove
+ echo 0 > /sys/class/zram-control/hot_remove
- zram0 removal fails with EBUSY, as expected
- unmount zram0
- try zram0 hot remove again
+ echo 0 > /sys/class/zram-control/hot_remove
- fails with ENODEV (unexpected)
- unload zram kernel module
+ completes successfully
- zram0 device node still exists
- attempt to mount /dev/zram0
+ mount command is killed
+ following BUG is encountered
BUG: unable to handle kernel paging request at ffffffffa0002ba0 IP: get_disk+0x16/0x50 Oops: 0000 [#1] SMP CPU: 0 PID: 252 Comm: mount Not tainted 4.9.0-rc6 #176 Call Trace: exact_lock+0xc/0x20 kobj_lookup+0xdc/0x160 get_gendisk+0x2f/0x110 __blkdev_get+0x10c/0x3c0 blkdev_get+0x19d/0x2e0 blkdev_open+0x56/0x70 do_dentry_open.isra.19+0x1ff/0x310 vfs_open+0x43/0x60 path_openat+0x2c9/0xf30 do_filp_open+0x79/0xd0 do_sys_open+0x114/0x1e0 SyS_open+0x19/0x20 entry_SYSCALL_64_fastpath+0x13/0x94
This patch adds the proper error check in hot_remove_store() not to call idr_remove() unconditionally.
Bugzilla: https://bugzilla.opensuse.org/show_bug.cgi?id=1010970
--- drivers/block/zram/zram_drv.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/block/zram/zram_drv.c +2 -1
@@ -1403,7 +1403,8 @@ static ssize_t hot_remove_store(struct c zram =idr_find (&zram_index_idr, dev_id);if (zram) { ret =zram_remove (zram); -idr_remove (&zram_index_idr, dev_id); +if (!ret) +idr_remove (&zram_index_idr, dev_id); }else { ret = -ENODEV ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/zram-fix-unbalanced-idr-management-at-hot-removal.patch