}
 
 static unsigned char swap_entry_put_locked(struct swap_info_struct *si,
-                                          unsigned long offset,
+                                          struct swap_cluster_info *ci,
+                                          swp_entry_t entry,
                                           unsigned char usage)
 {
+       unsigned long offset = swp_offset(entry);
        unsigned char count;
        unsigned char has_cache;
 
        if (usage)
                WRITE_ONCE(si->swap_map[offset], usage);
        else
-               WRITE_ONCE(si->swap_map[offset], SWAP_HAS_CACHE);
+               swap_entries_free(si, ci, entry, 1);
 
        return usage;
 }
        unsigned char usage;
 
        ci = lock_cluster(si, offset);
-       usage = swap_entry_put_locked(si, offset, 1);
-       if (!usage)
-               swap_entries_free(si, ci, swp_entry(si->type, offset), 1);
+       usage = swap_entry_put_locked(si, ci, entry, 1);
        unlock_cluster(ci);
 
        return usage;
 
        ci = lock_cluster(si, offset);
        do {
-               if (!swap_entry_put_locked(si, offset, usage))
-                       swap_entries_free(si, ci, swp_entry(si->type, offset), 1);
+               swap_entry_put_locked(si, ci, swp_entry(si->type, offset),
+                                     usage);
        } while (++offset < end);
        unlock_cluster(ci);
 }
        if (swap_only_has_cache(si, offset, size))
                swap_entries_free(si, ci, entry, size);
        else {
-               for (int i = 0; i < size; i++, entry.val++) {
-                       if (!swap_entry_put_locked(si, offset + i, SWAP_HAS_CACHE))
-                               swap_entries_free(si, ci, entry, 1);
-               }
+               for (int i = 0; i < size; i++, entry.val++)
+                       swap_entry_put_locked(si, ci, entry, SWAP_HAS_CACHE);
        }
        unlock_cluster(ci);
 }