mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 04:47:05 +00:00
swap: fix swapfile read/write offset
commitcaf6912f3f
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:dd6bd0d9c7
("swap: use bdev_read_page() / bdev_write_page()") Signed-off-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Anthony Iliopoulos <ailiop@suse.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
09beeb4694
commit
920ab96f34
2 changed files with 4 additions and 9 deletions
11
mm/page_io.c
11
mm/page_io.c
|
@ -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++)
|
||||
|
@ -261,11 +260,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
|
||||
|
@ -324,7 +318,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;
|
||||
|
@ -374,7 +369,7 @@ int swap_readpage(struct page *page, bool do_poll)
|
|||
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);
|
||||
|
|
|
@ -2304,7 +2304,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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue