|
@@ -798,7 +798,7 @@ swp_entry_t get_swap_page_of_type(int type)
|
|
|
return (swp_entry_t) {0};
|
|
|
}
|
|
|
|
|
|
-static struct swap_info_struct *_swap_info_get(swp_entry_t entry)
|
|
|
+static struct swap_info_struct *__swap_info_get(swp_entry_t entry)
|
|
|
{
|
|
|
struct swap_info_struct *p;
|
|
|
unsigned long offset, type;
|
|
@@ -814,13 +814,8 @@ static struct swap_info_struct *_swap_info_get(swp_entry_t entry)
|
|
|
offset = swp_offset(entry);
|
|
|
if (offset >= p->max)
|
|
|
goto bad_offset;
|
|
|
- if (!p->swap_map[offset])
|
|
|
- goto bad_free;
|
|
|
return p;
|
|
|
|
|
|
-bad_free:
|
|
|
- pr_err("swap_info_get: %s%08lx\n", Unused_offset, entry.val);
|
|
|
- goto out;
|
|
|
bad_offset:
|
|
|
pr_err("swap_info_get: %s%08lx\n", Bad_offset, entry.val);
|
|
|
goto out;
|
|
@@ -833,6 +828,24 @@ out:
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+static struct swap_info_struct *_swap_info_get(swp_entry_t entry)
|
|
|
+{
|
|
|
+ struct swap_info_struct *p;
|
|
|
+
|
|
|
+ p = __swap_info_get(entry);
|
|
|
+ if (!p)
|
|
|
+ goto out;
|
|
|
+ if (!p->swap_map[swp_offset(entry)])
|
|
|
+ goto bad_free;
|
|
|
+ return p;
|
|
|
+
|
|
|
+bad_free:
|
|
|
+ pr_err("swap_info_get: %s%08lx\n", Unused_offset, entry.val);
|
|
|
+ goto out;
|
|
|
+out:
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
static struct swap_info_struct *swap_info_get(swp_entry_t entry)
|
|
|
{
|
|
|
struct swap_info_struct *p;
|
|
@@ -986,6 +999,28 @@ int page_swapcount(struct page *page)
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * How many references to @entry are currently swapped out?
|
|
|
+ * This does not give an exact answer when swap count is continued,
|
|
|
+ * but does include the high COUNT_CONTINUED flag to allow for that.
|
|
|
+ */
|
|
|
+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);
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* How many references to @entry are currently swapped out?
|
|
|
* This considers COUNT_CONTINUED so it returns exact answer.
|