[PATCH 1/3] Revert "mm: simplify swapdev_block"

Chris Wilson chris at chris-wilson.co.uk
Tue Mar 2 14:21:12 UTC 2021


This reverts commit f885056a48ccf4ad4332def91e973f3993fa8695.
---
 mm/swapfile.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/mm/swapfile.c b/mm/swapfile.c
index f039745989d2..40d23cbee52e 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -1790,6 +1790,9 @@ int free_swap_and_cache(swp_entry_t entry)
 }
 
 #ifdef CONFIG_HIBERNATION
+
+static sector_t map_swap_entry(swp_entry_t, struct block_device**);
+
 /*
  * Find the swap type that corresponds to given device (if any).
  *
@@ -1849,13 +1852,12 @@ int find_first_swap(dev_t *device)
  */
 sector_t swapdev_block(int type, pgoff_t offset)
 {
+	struct block_device *bdev;
 	struct swap_info_struct *si = swap_type_to_swap_info(type);
-	struct swap_extent *se;
 
 	if (!si || !(si->flags & SWP_WRITEOK))
 		return 0;
-	se = offset_to_swap_extent(si, offset);
-	return se->start_block + (offset - se->start_page);
+	return map_swap_entry(swp_entry(type, offset), &bdev);
 }
 
 /*
@@ -2282,6 +2284,28 @@ static void drain_mmlist(void)
 	spin_unlock(&mmlist_lock);
 }
 
+#ifdef CONFIG_HIBERNATION
+/*
+ * Use this swapdev's extent info to locate the (PAGE_SIZE) block which
+ * corresponds to page offset for the specified swap entry.
+ * Note that the type of this function is sector_t, but it returns page offset
+ * into the bdev, not sector offset.
+ */
+static sector_t map_swap_entry(swp_entry_t entry, struct block_device **bdev)
+{
+	struct swap_info_struct *sis;
+	struct swap_extent *se;
+	pgoff_t offset;
+
+	sis = swp_swap_info(entry);
+	*bdev = sis->bdev;
+
+	offset = swp_offset(entry);
+	se = offset_to_swap_extent(sis, offset);
+	return se->start_block + (offset - se->start_page);
+}
+#endif
+
 /*
  * Free all of a swapdev's extent information
  */
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list