提交 2b6b8c9b 编写于 作者: J Jens Axboe 提交者: Cheng Jian

swap: fix swapfile read/write offset

stable inclusion
from linux-4.19.179
commit 6ceea9a764b422e32d9028e35d37ad68761ffd2c

--------------------------------

commit caf6912f upstream.

We're not factoring in the start of the file for where to write and
read the swapfile, which leads to very unfortunate side effects of
writing where we should not be...

[This issue only affects swapfiles on filesystems on top of blockdevs
that implement rw_page ops (brd, zram, btt, pmem), and not on top of any
other block devices, in contrast to the upstream commit fix.]

Fixes: dd6bd0d9 ("swap: use bdev_read_page() / bdev_write_page()")
Signed-off-by: NJens Axboe <axboe@kernel.dk>
Signed-off-by: NAnthony Iliopoulos <ailiop@suse.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NCheng Jian <cj.chengjian@huawei.com>
上级 39350e99
......@@ -38,7 +38,6 @@ static struct bio *get_swap_bio(gfp_t gfp_flags,
bio->bi_iter.bi_sector = map_swap_page(page, &bdev);
bio_set_dev(bio, bdev);
bio->bi_iter.bi_sector <<= PAGE_SHIFT - 9;
bio->bi_end_io = end_io;
for (i = 0; i < nr; i++)
......@@ -262,11 +261,6 @@ int swap_writepage(struct page *page, struct writeback_control *wbc)
return ret;
}
static sector_t swap_page_sector(struct page *page)
{
return (sector_t)__page_file_index(page) << (PAGE_SHIFT - 9);
}
static inline void count_swpout_vm_event(struct page *page)
{
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
......@@ -325,7 +319,8 @@ int __swap_writepage(struct page *page, struct writeback_control *wbc,
return ret;
}
ret = bdev_write_page(sis->bdev, swap_page_sector(page), page, wbc);
ret = bdev_write_page(sis->bdev, map_swap_page(page, &sis->bdev),
page, wbc);
if (!ret) {
count_swpout_vm_event(page);
return 0;
......@@ -376,7 +371,7 @@ int swap_readpage(struct page *page, bool synchronous)
return ret;
}
ret = bdev_read_page(sis->bdev, swap_page_sector(page), page);
ret = bdev_read_page(sis->bdev, map_swap_page(page, &sis->bdev), page);
if (!ret) {
if (trylock_page(page)) {
swap_slot_free_notify(page);
......
......@@ -2381,7 +2381,7 @@ sector_t map_swap_page(struct page *page, struct block_device **bdev)
{
swp_entry_t entry;
entry.val = page_private(page);
return map_swap_entry(entry, bdev);
return map_swap_entry(entry, bdev) << (PAGE_SHIFT - 9);
}
/*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册