|
@@ -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);
|