diff options
author | David S. Miller <davem@davemloft.net> | 2018-08-12 03:52:00 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-08-12 03:52:00 +0300 |
commit | 6a92ef08a1351e4977d6acde2196fa94e9c3a660 (patch) | |
tree | 3f237980c08af76beae04a6844ad254543ca4b9f /drivers/block | |
parent | 9a95d9c6429bb58905fdfc95da2e1b7cc3fb55b7 (diff) | |
parent | ec0c96714e7ddeda4eccaa077f5646a0fd6e371f (diff) | |
download | linux-6a92ef08a1351e4977d6acde2196fa94e9c3a660.tar.xz |
Merge ra.kernel.org:/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/zram/zram_drv.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 7436b2d27fa3..a390c6d4f72d 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -298,7 +298,8 @@ static void reset_bdev(struct zram *zram) zram->backing_dev = NULL; zram->old_block_size = 0; zram->bdev = NULL; - + zram->disk->queue->backing_dev_info->capabilities |= + BDI_CAP_SYNCHRONOUS_IO; kvfree(zram->bitmap); zram->bitmap = NULL; } @@ -400,6 +401,18 @@ static ssize_t backing_dev_store(struct device *dev, zram->backing_dev = backing_dev; zram->bitmap = bitmap; zram->nr_pages = nr_pages; + /* + * With writeback feature, zram does asynchronous IO so it's no longer + * synchronous device so let's remove synchronous io flag. Othewise, + * upper layer(e.g., swap) could wait IO completion rather than + * (submit and return), which will cause system sluggish. + * Furthermore, when the IO function returns(e.g., swap_readpage), + * upper layer expects IO was done so it could deallocate the page + * freely but in fact, IO is going on so finally could cause + * use-after-free when the IO is really done. + */ + zram->disk->queue->backing_dev_info->capabilities &= + ~BDI_CAP_SYNCHRONOUS_IO; up_write(&zram->init_lock); pr_info("setup backing device %s\n", file_name); |