cachefiles, afs: mm wait fixes
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEqG5UsNXhtOCrfGQP+7dXa6fLC2sFAmBaVsAACgkQ+7dXa6fL C2u/7w/8DU9UZN3IRgZzR47xw3qYlgNMWRoiJ2RwSHYDJcsFqziJ/6jN/MDr7vzc eo1XQnDUH1Ok02WNxI6iVIfkX6cC/SidCWs6mNevQ6ksn9ei8tG0ZUWLcUl1IA+O HzXxvouyL9aJB+aNTQXttoi8JaSuoW/HBV3MbjOLywsy41AicCpt0gI0AJgXHKe8 nEz3mqWZpCywRTkVkt9sWFOMX2shUzy8SoFgLMNpDUgyMD4r98XVJdIH8X4Em3zE syLg92aOnxxTEOAAYefcOSsgDBIkxLqW6F/K884cTPgLC24RJ/LO+M4GoOWX1Cmj Gqy9DZ3TGTu9yXr6Cm32OMl6t1Y0rYnktNl1Z4OT0XibK4gxgohZEr811A1/pHHu OfPBIUAotKRS4o/scs8Au0+XMT0/R7qfsGZe+TUGzWG1CRzf+tOLMrgXPxWnh2fV E2eNfOzy2Ry5v0XB4Lb4tb0JVPM2WOBTbswgUIHUOLz7fT6+mVaFYK/8eDDu6EJH zmDxs7HLZvI6X6XB2DOCDDWJbzKk9Jo27raGV5o6QCwAKENIr8XAvgZBEg5+Quvc feNBNSWTplgB5ROPlRWgmy/Xh4Y4+uRMCzMN+q9FtC810bDCE5rY5TRnayxmx9ni XugpJnoMBM8QcbtHNxropGOg+gQpABYfSfZMmcNPd+Oyix3SbtQ= =/IaF -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
8a9d2e133e
@ -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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user