mm: migrate: move migrate_page_lock_buffers()
buffer_migrate_page() is the only caller of migrate_page_lock_buffers() move it close to it and also drop the now unused stub for !CONFIG_BLOCK. Link: http://lkml.kernel.org/r/20181211172143.7358-4-jack@suse.cz Signed-off-by: Jan Kara <jack@suse.cz> Acked-by: Mel Gorman <mgorman@suse.de> Cc: Michal Hocko <mhocko@suse.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
cc4f11e69f
commit
84ade7c15c
1 changed files with 42 additions and 50 deletions
92
mm/migrate.c
92
mm/migrate.c
|
@ -374,56 +374,6 @@ unlock:
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BLOCK
|
||||
/* Returns true if all buffers are successfully locked */
|
||||
static bool buffer_migrate_lock_buffers(struct buffer_head *head,
|
||||
enum migrate_mode mode)
|
||||
{
|
||||
struct buffer_head *bh = head;
|
||||
|
||||
/* Simple case, sync compaction */
|
||||
if (mode != MIGRATE_ASYNC) {
|
||||
do {
|
||||
get_bh(bh);
|
||||
lock_buffer(bh);
|
||||
bh = bh->b_this_page;
|
||||
|
||||
} while (bh != head);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* async case, we cannot block on lock_buffer so use trylock_buffer */
|
||||
do {
|
||||
get_bh(bh);
|
||||
if (!trylock_buffer(bh)) {
|
||||
/*
|
||||
* We failed to lock the buffer and cannot stall in
|
||||
* async migration. Release the taken locks
|
||||
*/
|
||||
struct buffer_head *failed_bh = bh;
|
||||
put_bh(failed_bh);
|
||||
bh = head;
|
||||
while (bh != failed_bh) {
|
||||
unlock_buffer(bh);
|
||||
put_bh(bh);
|
||||
bh = bh->b_this_page;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bh = bh->b_this_page;
|
||||
} while (bh != head);
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
static inline bool buffer_migrate_lock_buffers(struct buffer_head *head,
|
||||
enum migrate_mode mode)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif /* CONFIG_BLOCK */
|
||||
|
||||
static int expected_page_refs(struct page *page)
|
||||
{
|
||||
int expected_count = 1;
|
||||
|
@ -751,6 +701,48 @@ int migrate_page(struct address_space *mapping,
|
|||
EXPORT_SYMBOL(migrate_page);
|
||||
|
||||
#ifdef CONFIG_BLOCK
|
||||
/* Returns true if all buffers are successfully locked */
|
||||
static bool buffer_migrate_lock_buffers(struct buffer_head *head,
|
||||
enum migrate_mode mode)
|
||||
{
|
||||
struct buffer_head *bh = head;
|
||||
|
||||
/* Simple case, sync compaction */
|
||||
if (mode != MIGRATE_ASYNC) {
|
||||
do {
|
||||
get_bh(bh);
|
||||
lock_buffer(bh);
|
||||
bh = bh->b_this_page;
|
||||
|
||||
} while (bh != head);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/* async case, we cannot block on lock_buffer so use trylock_buffer */
|
||||
do {
|
||||
get_bh(bh);
|
||||
if (!trylock_buffer(bh)) {
|
||||
/*
|
||||
* We failed to lock the buffer and cannot stall in
|
||||
* async migration. Release the taken locks
|
||||
*/
|
||||
struct buffer_head *failed_bh = bh;
|
||||
put_bh(failed_bh);
|
||||
bh = head;
|
||||
while (bh != failed_bh) {
|
||||
unlock_buffer(bh);
|
||||
put_bh(bh);
|
||||
bh = bh->b_this_page;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bh = bh->b_this_page;
|
||||
} while (bh != head);
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Migration function for pages with buffers. This function can only be used
|
||||
* if the underlying filesystem guarantees that no other references to "page"
|
||||
|
|
Loading…
Reference in a new issue