diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/filemap.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 188cf5fd3e8d..ac8f690d2885 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -173,6 +173,12 @@ static int sync_page(void *word) | |||
173 | return 0; | 173 | return 0; |
174 | } | 174 | } |
175 | 175 | ||
176 | static int sync_page_killable(void *word) | ||
177 | { | ||
178 | sync_page(word); | ||
179 | return fatal_signal_pending(current) ? -EINTR : 0; | ||
180 | } | ||
181 | |||
176 | /** | 182 | /** |
177 | * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range | 183 | * __filemap_fdatawrite_range - start writeback on mapping dirty pages in range |
178 | * @mapping: address space structure to write | 184 | * @mapping: address space structure to write |
@@ -577,6 +583,14 @@ void fastcall __lock_page(struct page *page) | |||
577 | } | 583 | } |
578 | EXPORT_SYMBOL(__lock_page); | 584 | EXPORT_SYMBOL(__lock_page); |
579 | 585 | ||
586 | int fastcall __lock_page_killable(struct page *page) | ||
587 | { | ||
588 | DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); | ||
589 | |||
590 | return __wait_on_bit_lock(page_waitqueue(page), &wait, | ||
591 | sync_page_killable, TASK_KILLABLE); | ||
592 | } | ||
593 | |||
580 | /* | 594 | /* |
581 | * Variant of lock_page that does not require the caller to hold a reference | 595 | * Variant of lock_page that does not require the caller to hold a reference |
582 | * on the page's mapping. | 596 | * on the page's mapping. |