Commit 8a9d2e13 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'afs-cachefiles-fixes-20210323' of...

Merge tag 'afs-cachefiles-fixes-20210323' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs

Pull cachefiles and afs fixes from David Howells:
 "Fixes from Matthew Wilcox for page waiting-related issues in
  cachefiles and afs as extracted from his folio series[1]:

   - In cachefiles, remove the use of the wait_bit_key struct to access
     something that's actually in wait_page_key format. The proper
     struct is now available in the header, so that should be used
     instead.

   - Add a proper wait function for waiting killably on the page
     writeback flag. This includes a recent bugfix[2] that's not in the
     afs code.

   - In afs, use the function added in (2) rather than using
     wait_on_page_bit_killable() which doesn't provide the
     aforementioned bugfix"

Link: https://lore.kernel.org/r/20210320054104.1300774-1-willy@infradead.org[1]
Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c2407cf7d22d0c0d94cf20342b3b8f06f1d904e7 [2]
Link: https://lore.kernel.org/r/20210323120829.GC1719932@casper.infradead.org/ # v1

* tag 'afs-cachefiles-fixes-20210323' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs:
  afs: Use wait_on_page_writeback_killable
  mm/writeback: Add wait_on_page_writeback_killable
  fs/cachefiles: Remove wait_bit_key layout dependency
parents bf1c82a5 75b69799
...@@ -851,8 +851,7 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf) ...@@ -851,8 +851,7 @@ vm_fault_t afs_page_mkwrite(struct vm_fault *vmf)
fscache_wait_on_page_write(vnode->cache, vmf->page); fscache_wait_on_page_write(vnode->cache, vmf->page);
#endif #endif
if (PageWriteback(vmf->page) && if (wait_on_page_writeback_killable(vmf->page))
wait_on_page_bit_killable(vmf->page, PG_writeback) < 0)
return VM_FAULT_RETRY; return VM_FAULT_RETRY;
if (lock_page_killable(vmf->page) < 0) if (lock_page_killable(vmf->page) < 0)
......
...@@ -24,17 +24,16 @@ static int cachefiles_read_waiter(wait_queue_entry_t *wait, unsigned mode, ...@@ -24,17 +24,16 @@ static int cachefiles_read_waiter(wait_queue_entry_t *wait, unsigned mode,
container_of(wait, struct cachefiles_one_read, monitor); container_of(wait, struct cachefiles_one_read, monitor);
struct cachefiles_object *object; struct cachefiles_object *object;
struct fscache_retrieval *op = monitor->op; struct fscache_retrieval *op = monitor->op;
struct wait_bit_key *key = _key; struct wait_page_key *key = _key;
struct page *page = wait->private; struct page *page = wait->private;
ASSERT(key); ASSERT(key);
_enter("{%lu},%u,%d,{%p,%u}", _enter("{%lu},%u,%d,{%p,%u}",
monitor->netfs_page->index, mode, sync, monitor->netfs_page->index, mode, sync,
key->flags, key->bit_nr); key->page, key->bit_nr);
if (key->flags != &page->flags || if (key->page != page || key->bit_nr != PG_locked)
key->bit_nr != PG_locked)
return 0; return 0;
_debug("--- monitor %p %lx ---", page, page->flags); _debug("--- monitor %p %lx ---", page, page->flags);
......
...@@ -559,7 +559,6 @@ static inline pgoff_t linear_page_index(struct vm_area_struct *vma, ...@@ -559,7 +559,6 @@ static inline pgoff_t linear_page_index(struct vm_area_struct *vma,
return pgoff; return pgoff;
} }
/* This has the same layout as wait_bit_key - see fs/cachefiles/rdwr.c */
struct wait_page_key { struct wait_page_key {
struct page *page; struct page *page;
int bit_nr; int bit_nr;
...@@ -683,6 +682,7 @@ static inline int wait_on_page_locked_killable(struct page *page) ...@@ -683,6 +682,7 @@ static inline int wait_on_page_locked_killable(struct page *page)
int put_and_wait_on_page_locked(struct page *page, int state); int put_and_wait_on_page_locked(struct page *page, int state);
void wait_on_page_writeback(struct page *page); void wait_on_page_writeback(struct page *page);
int wait_on_page_writeback_killable(struct page *page);
extern void end_page_writeback(struct page *page); extern void end_page_writeback(struct page *page);
void wait_for_stable_page(struct page *page); void wait_for_stable_page(struct page *page);
......
...@@ -2833,6 +2833,22 @@ void wait_on_page_writeback(struct page *page) ...@@ -2833,6 +2833,22 @@ void wait_on_page_writeback(struct page *page)
} }
EXPORT_SYMBOL_GPL(wait_on_page_writeback); EXPORT_SYMBOL_GPL(wait_on_page_writeback);
/*
* Wait for a page to complete writeback. Returns -EINTR if we get a
* fatal signal while waiting.
*/
int wait_on_page_writeback_killable(struct page *page)
{
while (PageWriteback(page)) {
trace_wait_on_page_writeback(page, page_mapping(page));
if (wait_on_page_bit_killable(page, PG_writeback))
return -EINTR;
}
return 0;
}
EXPORT_SYMBOL_GPL(wait_on_page_writeback_killable);
/** /**
* wait_for_stable_page() - wait for writeback to finish, if necessary. * wait_for_stable_page() - wait for writeback to finish, if necessary.
* @page: The page to wait on. * @page: The page to wait on.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment