Merge tag 'mm-stable-2023-02-20-13-37' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / mm / swapfile.c
index 0ab52d16bde6699b649191a750aedeb4a3242443..62ba2bf577d7e7210398181b47f11fca9e5f5099 100644 (file)
@@ -1098,8 +1098,6 @@ start_over:
                spin_unlock(&si->lock);
                if (n_ret || size == SWAPFILE_CLUSTER)
                        goto check_out;
-               pr_debug("scan_swap_map of si %d failed to find offset\n",
-                       si->type);
                cond_resched();
 
                spin_lock(&swap_avail_lock);
@@ -1844,13 +1842,13 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
        pte_t *pte;
        struct swap_info_struct *si;
        int ret = 0;
-       volatile unsigned char *swap_map;
 
        si = swap_info[type];
        pte = pte_offset_map(pmd, addr);
        do {
                struct folio *folio;
                unsigned long offset;
+               unsigned char swp_count;
 
                if (!is_swap_pte(*pte))
                        continue;
@@ -1861,7 +1859,6 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
 
                offset = swp_offset(entry);
                pte_unmap(pte);
-               swap_map = &si->swap_map[offset];
                folio = swap_cache_get_folio(entry, vma, addr);
                if (!folio) {
                        struct page *page;
@@ -1878,8 +1875,10 @@ static int unuse_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
                                folio = page_folio(page);
                }
                if (!folio) {
-                       if (*swap_map == 0 || *swap_map == SWAP_MAP_BAD)
+                       swp_count = READ_ONCE(si->swap_map[offset]);
+                       if (swp_count == 0 || swp_count == SWAP_MAP_BAD)
                                goto try_next;
+
                        return -ENOMEM;
                }
 
@@ -3078,7 +3077,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
        if (p->bdev && bdev_stable_writes(p->bdev))
                p->flags |= SWP_STABLE_WRITES;
 
-       if (p->bdev && p->bdev->bd_disk->fops->rw_page)
+       if (p->bdev && bdev_synchronous(p->bdev))
                p->flags |= SWP_SYNCHRONOUS_IO;
 
        if (p->bdev && bdev_nonrot(p->bdev)) {