diff options
author | Jens Axboe <axboe@kernel.dk> | 2021-03-02 14:53:21 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2021-03-07 12:20:49 +0100 |
commit | 60fdceaa91ad3bd7d7171b7280492d7438492d5c (patch) | |
tree | 9ce78046383a82595fe5118c154675bc4e02ac33 /mm/swapfile.c | |
parent | bebf5e8327799cfb27c5c0c361b943b0f0e0a2d7 (diff) |
swap: fix swapfile read/write offset
commit caf6912f3f4af7232340d500a4a2008f81b93f14 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...
Fixes: dd6bd0d9c7db ("swap: use bdev_read_page() / bdev_write_page()")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Cc: Anthony Iliopoulos <ailiop@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'mm/swapfile.c')
-rw-r--r-- | mm/swapfile.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/mm/swapfile.c b/mm/swapfile.c index 7947633d3ced..f6964212c6c8 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -221,6 +221,19 @@ offset_to_swap_extent(struct swap_info_struct *sis, unsigned long offset) BUG(); } +sector_t swap_page_sector(struct page *page) +{ + struct swap_info_struct *sis = page_swap_info(page); + struct swap_extent *se; + sector_t sector; + pgoff_t offset; + + offset = __page_file_index(page); + se = offset_to_swap_extent(sis, offset); + sector = se->start_block + (offset - se->start_page); + return sector << (PAGE_SHIFT - 9); +} + /* * swap allocation tell device that a cluster of swap can now be discarded, * to allow the swap device to optimize its wear-levelling. |