History

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

Chenwandun committed 7 years ago

Commit f7daefe1 parent ae8af431 file · +3 −2Browse files

Unified · Split

drivers/block/zram/zram_drv.c+3−2
@@ -413,13 +413,14 @@ static void reset_bdev(struct zram *zram) · 412 unmodified lines
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;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t