diff options
| -rw-r--r-- | Documentation/feature-removal-schedule.txt | 12 | ||||
| -rw-r--r-- | include/linux/pagemap.h | 4 | ||||
| -rw-r--r-- | mm/swapfile.c | 14 |
3 files changed, 24 insertions, 6 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 495858b236b6..a92b10bb0b03 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -241,3 +241,15 @@ Why: The USB subsystem has changed a lot over time, and it has been | |||
| 241 | Who: Greg Kroah-Hartman <gregkh@suse.de> | 241 | Who: Greg Kroah-Hartman <gregkh@suse.de> |
| 242 | 242 | ||
| 243 | --------------------------- | 243 | --------------------------- |
| 244 | |||
| 245 | What: find_trylock_page | ||
| 246 | When: January 2007 | ||
| 247 | Why: The interface no longer has any callers left in the kernel. It | ||
| 248 | is an odd interface (compared with other find_*_page functions), in | ||
| 249 | that it does not take a refcount to the page, only the page lock. | ||
| 250 | It should be replaced with find_get_page or find_lock_page if possible. | ||
| 251 | This feature removal can be reevaluated if users of the interface | ||
| 252 | cannot cleanly use something else. | ||
| 253 | Who: Nick Piggin <npiggin@suse.de> | ||
| 254 | |||
| 255 | --------------------------- | ||
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 839f0b3c23aa..9539efd4f7e6 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
| @@ -72,8 +72,8 @@ extern struct page * find_get_page(struct address_space *mapping, | |||
| 72 | unsigned long index); | 72 | unsigned long index); |
| 73 | extern struct page * find_lock_page(struct address_space *mapping, | 73 | extern struct page * find_lock_page(struct address_space *mapping, |
| 74 | unsigned long index); | 74 | unsigned long index); |
| 75 | extern struct page * find_trylock_page(struct address_space *mapping, | 75 | extern __deprecated_for_modules struct page * find_trylock_page( |
| 76 | unsigned long index); | 76 | struct address_space *mapping, unsigned long index); |
| 77 | extern struct page * find_or_create_page(struct address_space *mapping, | 77 | extern struct page * find_or_create_page(struct address_space *mapping, |
| 78 | unsigned long index, gfp_t gfp_mask); | 78 | unsigned long index, gfp_t gfp_mask); |
| 79 | unsigned find_get_pages(struct address_space *mapping, pgoff_t start, | 79 | unsigned find_get_pages(struct address_space *mapping, pgoff_t start, |
diff --git a/mm/swapfile.c b/mm/swapfile.c index 39aa9d129612..e5fd5385f0cc 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
| @@ -397,18 +397,24 @@ void free_swap_and_cache(swp_entry_t entry) | |||
| 397 | 397 | ||
| 398 | p = swap_info_get(entry); | 398 | p = swap_info_get(entry); |
| 399 | if (p) { | 399 | if (p) { |
| 400 | if (swap_entry_free(p, swp_offset(entry)) == 1) | 400 | if (swap_entry_free(p, swp_offset(entry)) == 1) { |
| 401 | page = find_trylock_page(&swapper_space, entry.val); | 401 | page = find_get_page(&swapper_space, entry.val); |
| 402 | if (page && unlikely(TestSetPageLocked(page))) { | ||
| 403 | page_cache_release(page); | ||
| 404 | page = NULL; | ||
| 405 | } | ||
| 406 | } | ||
| 402 | spin_unlock(&swap_lock); | 407 | spin_unlock(&swap_lock); |
| 403 | } | 408 | } |
| 404 | if (page) { | 409 | if (page) { |
| 405 | int one_user; | 410 | int one_user; |
| 406 | 411 | ||
| 407 | BUG_ON(PagePrivate(page)); | 412 | BUG_ON(PagePrivate(page)); |
| 408 | page_cache_get(page); | ||
| 409 | one_user = (page_count(page) == 2); | 413 | one_user = (page_count(page) == 2); |
| 410 | /* Only cache user (+us), or swap space full? Free it! */ | 414 | /* Only cache user (+us), or swap space full? Free it! */ |
| 411 | if (!PageWriteback(page) && (one_user || vm_swap_full())) { | 415 | /* Also recheck PageSwapCache after page is locked (above) */ |
| 416 | if (PageSwapCache(page) && !PageWriteback(page) && | ||
| 417 | (one_user || vm_swap_full())) { | ||
| 412 | delete_from_swap_cache(page); | 418 | delete_from_swap_cache(page); |
| 413 | SetPageDirty(page); | 419 | SetPageDirty(page); |
| 414 | } | 420 | } |
