return count;
 }
 
+static int swap_swapcount(struct swap_info_struct *si, swp_entry_t entry)
+{
+       int count = 0;
+       pgoff_t offset = swp_offset(entry);
+       struct swap_cluster_info *ci;
+
+       ci = lock_cluster_or_swap_info(si, offset);
+       count = swap_count(si->swap_map[offset]);
+       unlock_cluster_or_swap_info(si, ci);
+       return count;
+}
+
 /*
  * How many references to @entry are currently swapped out?
  * This does not give an exact answer when swap count is continued,
 int __swp_swapcount(swp_entry_t entry)
 {
        int count = 0;
-       pgoff_t offset;
        struct swap_info_struct *si;
-       struct swap_cluster_info *ci;
 
        si = __swap_info_get(entry);
-       if (si) {
-               offset = swp_offset(entry);
-               ci = lock_cluster_or_swap_info(si, offset);
-               count = swap_count(si->swap_map[offset]);
-               unlock_cluster_or_swap_info(si, ci);
-       }
+       if (si)
+               count = swap_swapcount(si, entry);
        return count;
 }
 
                 * Also recheck PageSwapCache now page is locked (above).
                 */
                if (PageSwapCache(page) && !PageWriteback(page) &&
-                   (!page_mapped(page) || mem_cgroup_swap_full(page))) {
+                   (!page_mapped(page) || mem_cgroup_swap_full(page)) &&
+                   !swap_swapcount(p, entry)) {
                        delete_from_swap_cache(page);
                        SetPageDirty(page);
                }