mm: factor out a swap_writepage_bdev helper
authorChristoph Hellwig <hch@lst.de>
Wed, 25 Jan 2023 13:34:35 +0000 (14:34 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 3 Feb 2023 06:33:33 +0000 (22:33 -0800)
Split the block device case from swap_readpage into a separate helper,
following the abstraction for file based swap.

Link: https://lkml.kernel.org/r/20230125133436.447864-7-hch@lst.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Ira Weiny <ira.weiny@intel.com>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Keith Busch <kbusch@kernel.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/page_io.c

index 3ba5a6e..0a1a3b8 100644 (file)
@@ -326,23 +326,12 @@ static void swap_writepage_fs(struct page *page, struct writeback_control *wbc)
                *wbc->swap_plug = sio;
 }
 
-void __swap_writepage(struct page *page, struct writeback_control *wbc)
+static void swap_writepage_bdev(struct page *page,
+               struct writeback_control *wbc, struct swap_info_struct *sis)
 {
        struct bio *bio;
-       int ret;
-       struct swap_info_struct *sis = page_swap_info(page);
-
-       VM_BUG_ON_PAGE(!PageSwapCache(page), page);
-       /*
-        * ->flags can be updated non-atomicially (scan_swap_map_slots),
-        * but that will never affect SWP_FS_OPS, so the data_race
-        * is safe.
-        */
-       if (data_race(sis->flags & SWP_FS_OPS))
-               return swap_writepage_fs(page, wbc);
 
-       ret = bdev_write_page(sis->bdev, swap_page_sector(page), page, wbc);
-       if (!ret) {
+       if (!bdev_write_page(sis->bdev, swap_page_sector(page), page, wbc)) {
                count_swpout_vm_event(page);
                return;
        }
@@ -361,6 +350,22 @@ void __swap_writepage(struct page *page, struct writeback_control *wbc)
        submit_bio(bio);
 }
 
+void __swap_writepage(struct page *page, struct writeback_control *wbc)
+{
+       struct swap_info_struct *sis = page_swap_info(page);
+
+       VM_BUG_ON_PAGE(!PageSwapCache(page), page);
+       /*
+        * ->flags can be updated non-atomicially (scan_swap_map_slots),
+        * but that will never affect SWP_FS_OPS, so the data_race
+        * is safe.
+        */
+       if (data_race(sis->flags & SWP_FS_OPS))
+               swap_writepage_fs(page, wbc);
+       else
+               swap_writepage_bdev(page, wbc, sis);
+}
+
 void swap_write_unplug(struct swap_iocb *sio)
 {
        struct iov_iter from;