Skip to content

Commit f7daefe

Browse files
Chenwanduntorvalds
authored andcommitted
zram: fix race between backing_dev_show and backing_dev_store
CPU0: CPU1: backing_dev_show backing_dev_store ...... ...... file = zram->backing_dev; down_read(&zram->init_lock); down_read(&zram->init_init_lock) file_path(file, ...); zram->backing_dev = backing_dev; up_read(&zram->init_lock); up_read(&zram->init_lock); gets the value of zram->backing_dev too early in backing_dev_show, which resultin the value being NULL at the beginning, and not NULL later. backtrace: d_path+0xcc/0x174 file_path+0x10/0x18 backing_dev_show+0x40/0xb4 dev_attr_show+0x20/0x54 sysfs_kf_seq_show+0x9c/0x10c kernfs_seq_show+0x28/0x30 seq_read+0x184/0x488 kernfs_fop_read+0x5c/0x1a4 __vfs_read+0x44/0x128 vfs_read+0xa0/0x138 SyS_read+0x54/0xb4 Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Chenwandun <[email protected]> Acked-by: Minchan Kim <[email protected]> Cc: Sergey Senozhatsky <[email protected]> Cc: Jens Axboe <[email protected]> Cc: <[email protected]> [4.14+] Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent ae8af43 commit f7daefe

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/block/zram/zram_drv.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,13 +413,14 @@ static void reset_bdev(struct zram *zram)
413413
static ssize_t backing_dev_show(struct device *dev,
414414
struct device_attribute *attr, char *buf)
415415
{
416+
struct file *file;
416417
struct zram *zram = dev_to_zram(dev);
417-
struct file *file = zram->backing_dev;
418418
char *p;
419419
ssize_t ret;
420420

421421
down_read(&zram->init_lock);
422-
if (!zram->backing_dev) {
422+
file = zram->backing_dev;
423+
if (!file) {
423424
memcpy(buf, "none\n", 5);
424425
up_read(&zram->init_lock);
425426
return 5;

0 commit comments

Comments
 (0)