add_swap_extent already coalesces multiple extents, no need to duplicate
that in the caller.

Signed-off-by: Christoph Hellwig <[email protected]>
---
 fs/iomap/swapfile.c | 104 +++++++++++++-------------------------------
 1 file changed, 31 insertions(+), 73 deletions(-)

diff --git a/fs/iomap/swapfile.c b/fs/iomap/swapfile.c
index cf354fdfb7c3..a4e0ca462cc4 100644
--- a/fs/iomap/swapfile.c
+++ b/fs/iomap/swapfile.c
@@ -6,57 +6,32 @@
 #include <linux/iomap.h>
 #include <linux/swap.h>
 
-/* Swapfile activation */
-
-struct iomap_swapfile_info {
-       struct iomap iomap;             /* accumulated iomap */
-       struct swap_info_struct *sis;
-       unsigned long nr_pages;         /* number of pages collected */
-       struct file *file;
-};
-
-/*
- * Collect physical extents for this swap file.  Physical extents reported to
- * the swap code must be trimmed to align to a page boundary.  The logical
- * offset within the file is irrelevant since the swapfile code maps logical
- * page numbers of the swap device to the physical page-aligned extents.
- */
-static int iomap_swapfile_add_extent(struct iomap_swapfile_info *isi)
-{
-       struct iomap *iomap = &isi->iomap;
-       uint64_t first_ppage;
-       uint64_t next_ppage;
-
-       /*
-        * Round the start up and the end down so that the physical
-        * extent aligns to a page boundary.
-        */
-       first_ppage = ALIGN(iomap->addr, PAGE_SIZE) >> PAGE_SHIFT;
-       next_ppage = ALIGN_DOWN(iomap->addr + iomap->length, PAGE_SIZE) >>
-                       PAGE_SHIFT;
-       return add_swap_extent(isi->sis, next_ppage - first_ppage, first_ppage);
-}
-
-static int iomap_swapfile_fail(struct iomap_swapfile_info *isi, const char 
*str)
+static int iomap_swapfile_fail(struct file *file, const char *str)
 {
        char *buf, *p = ERR_PTR(-ENOMEM);
 
        buf = kmalloc(PATH_MAX, GFP_KERNEL);
        if (buf)
-               p = file_path(isi->file, buf, PATH_MAX);
+               p = file_path(file, buf, PATH_MAX);
        pr_err("swapon: file %s %s\n", IS_ERR(p) ? "<unknown>" : p, str);
        kfree(buf);
        return -EINVAL;
 }
 
 /*
- * Accumulate iomaps for this swap file.  We have to accumulate iomaps because
- * swap only cares about contiguous page-aligned physical extents and makes no
- * distinction between written and unwritten extents.
+ * Report physical extents for this swap file.  Physical extents reported to 
the
+ * swap code must be trimmed to align to a page boundary.  The logical offset
+ * within the file is irrelevant since the swapfile code maps logical page
+ * numbers of the swap device to the physical page-aligned extents.
  */
-static int iomap_swapfile_iter(struct iomap_iter *iter,
-               struct iomap *iomap, struct iomap_swapfile_info *isi)
+static int iomap_swapfile_iter(struct iomap_iter *iter, struct file *file,
+               struct swap_info_struct *sis)
 {
+       struct iomap *iomap = &iter->iomap;
+       uint64_t first_ppage;
+       uint64_t next_ppage;
+       int error;
+
        switch (iomap->type) {
        case IOMAP_MAPPED:
        case IOMAP_UNWRITTEN:
@@ -64,35 +39,31 @@ static int iomap_swapfile_iter(struct iomap_iter *iter,
                break;
        case IOMAP_INLINE:
                /* No inline data. */
-               return iomap_swapfile_fail(isi, "is inline");
+               return iomap_swapfile_fail(file, "is inline");
        default:
-               return iomap_swapfile_fail(isi, "has unallocated extents");
+               return iomap_swapfile_fail(file, "has unallocated extents");
        }
 
        /* No uncommitted metadata or shared blocks. */
        if (iomap->flags & IOMAP_F_DIRTY)
-               return iomap_swapfile_fail(isi, "is not committed");
+               return iomap_swapfile_fail(file, "is not committed");
        if (iomap->flags & IOMAP_F_SHARED)
-               return iomap_swapfile_fail(isi, "has shared extents");
+               return iomap_swapfile_fail(file, "has shared extents");
 
        /* Only one bdev per swap file. */
-       if (iomap->bdev != isi->sis->bdev)
-               return iomap_swapfile_fail(isi, "outside the main device");
-
-       if (isi->iomap.length == 0) {
-               /* No accumulated extent, so just store it. */
-               memcpy(&isi->iomap, iomap, sizeof(isi->iomap));
-       } else if (isi->iomap.addr + isi->iomap.length == iomap->addr) {
-               /* Append this to the accumulated extent. */
-               isi->iomap.length += iomap->length;
-       } else {
-               /* Otherwise, add the retained iomap and store this one. */
-               int error = iomap_swapfile_add_extent(isi);
-               if (error)
-                       return error;
-               memcpy(&isi->iomap, iomap, sizeof(isi->iomap));
-       }
+       if (iomap->bdev != sis->bdev)
+               return iomap_swapfile_fail(file, "outside the main device");
 
+       /*
+        * Round the start up and the end down so that the physical extent
+        * aligns to a page boundary.
+        */
+       first_ppage = ALIGN(iomap->addr, PAGE_SIZE) >> PAGE_SHIFT;
+       next_ppage = ALIGN_DOWN(iomap->addr + iomap->length, PAGE_SIZE) >>
+                       PAGE_SHIFT;
+       error = add_swap_extent(sis, next_ppage - first_ppage, first_ppage);
+       if (error)
+               return error;
        return iomap_iter_advance_full(iter);
 }
 
@@ -110,10 +81,6 @@ int iomap_swap_activate(struct file *file, struct 
swap_info_struct *sis,
                .len    = ALIGN_DOWN(i_size_read(inode), PAGE_SIZE),
                .flags  = IOMAP_REPORT,
        };
-       struct iomap_swapfile_info isi = {
-               .sis = sis,
-               .file = file,
-       };
        int ret;
 
        /*
@@ -125,16 +92,7 @@ int iomap_swap_activate(struct file *file, struct 
swap_info_struct *sis,
                return ret;
 
        while ((ret = iomap_iter(&iter, ops)) > 0)
-               iter.status = iomap_swapfile_iter(&iter, &iter.iomap, &isi);
-       if (ret < 0)
-               return ret;
-
-       if (isi.iomap.length) {
-               ret = iomap_swapfile_add_extent(&isi);
-               if (ret)
-                       return ret;
-       }
-
-       return 0;
+               iter.status = iomap_swapfile_iter(&iter, file, sis);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(iomap_swap_activate);
-- 
2.53.0



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to