mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-22 13:54:57 +08:00
afs: convert afs_writepages_region() to use filemap_get_folios_tag()
Convert to use folios throughout. This function is in preparation to remove find_get_pages_range_tag(). Also modify this function to write the whole batch one at a time, rather than calling for a new set every single write. Link: https://lkml.kernel.org/r/20230104211448.4804-6-vishal.moola@gmail.com Signed-off-by: Vishal Moola (Oracle) <vishal.moola@gmail.com> Tested-by: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
0fff435f06
commit
acc8d8588c
124
fs/afs/write.c
124
fs/afs/write.c
@ -704,85 +704,87 @@ static int afs_writepages_region(struct address_space *mapping,
|
||||
bool max_one_loop)
|
||||
{
|
||||
struct folio *folio;
|
||||
struct page *head_page;
|
||||
struct folio_batch fbatch;
|
||||
ssize_t ret;
|
||||
unsigned int i;
|
||||
int n, skips = 0;
|
||||
|
||||
_enter("%llx,%llx,", start, end);
|
||||
folio_batch_init(&fbatch);
|
||||
|
||||
do {
|
||||
pgoff_t index = start / PAGE_SIZE;
|
||||
|
||||
n = find_get_pages_range_tag(mapping, &index, end / PAGE_SIZE,
|
||||
PAGECACHE_TAG_DIRTY, 1, &head_page);
|
||||
n = filemap_get_folios_tag(mapping, &index, end / PAGE_SIZE,
|
||||
PAGECACHE_TAG_DIRTY, &fbatch);
|
||||
|
||||
if (!n)
|
||||
break;
|
||||
for (i = 0; i < n; i++) {
|
||||
folio = fbatch.folios[i];
|
||||
start = folio_pos(folio); /* May regress with THPs */
|
||||
|
||||
folio = page_folio(head_page);
|
||||
start = folio_pos(folio); /* May regress with THPs */
|
||||
_debug("wback %lx", folio_index(folio));
|
||||
|
||||
_debug("wback %lx", folio_index(folio));
|
||||
/* At this point we hold neither the i_pages lock nor the
|
||||
* page lock: the page may be truncated or invalidated
|
||||
* (changing page->mapping to NULL), or even swizzled
|
||||
* back from swapper_space to tmpfs file mapping
|
||||
*/
|
||||
if (wbc->sync_mode != WB_SYNC_NONE) {
|
||||
ret = folio_lock_killable(folio);
|
||||
if (ret < 0) {
|
||||
folio_batch_release(&fbatch);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
if (!folio_trylock(folio))
|
||||
continue;
|
||||
}
|
||||
|
||||
/* At this point we hold neither the i_pages lock nor the
|
||||
* page lock: the page may be truncated or invalidated
|
||||
* (changing page->mapping to NULL), or even swizzled
|
||||
* back from swapper_space to tmpfs file mapping
|
||||
*/
|
||||
if (wbc->sync_mode != WB_SYNC_NONE) {
|
||||
ret = folio_lock_killable(folio);
|
||||
if (folio->mapping != mapping ||
|
||||
!folio_test_dirty(folio)) {
|
||||
start += folio_size(folio);
|
||||
folio_unlock(folio);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (folio_test_writeback(folio) ||
|
||||
folio_test_fscache(folio)) {
|
||||
folio_unlock(folio);
|
||||
if (wbc->sync_mode != WB_SYNC_NONE) {
|
||||
folio_wait_writeback(folio);
|
||||
#ifdef CONFIG_AFS_FSCACHE
|
||||
folio_wait_fscache(folio);
|
||||
#endif
|
||||
} else {
|
||||
start += folio_size(folio);
|
||||
}
|
||||
if (wbc->sync_mode == WB_SYNC_NONE) {
|
||||
if (skips >= 5 || need_resched()) {
|
||||
*_next = start;
|
||||
_leave(" = 0 [%llx]", *_next);
|
||||
return 0;
|
||||
}
|
||||
skips++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!folio_clear_dirty_for_io(folio))
|
||||
BUG();
|
||||
ret = afs_write_back_from_locked_folio(mapping, wbc,
|
||||
folio, start, end);
|
||||
if (ret < 0) {
|
||||
folio_put(folio);
|
||||
_leave(" = %zd", ret);
|
||||
folio_batch_release(&fbatch);
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
if (!folio_trylock(folio)) {
|
||||
folio_put(folio);
|
||||
return 0;
|
||||
}
|
||||
|
||||
start += ret;
|
||||
}
|
||||
|
||||
if (folio_mapping(folio) != mapping ||
|
||||
!folio_test_dirty(folio)) {
|
||||
start += folio_size(folio);
|
||||
folio_unlock(folio);
|
||||
folio_put(folio);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (folio_test_writeback(folio) ||
|
||||
folio_test_fscache(folio)) {
|
||||
folio_unlock(folio);
|
||||
if (wbc->sync_mode != WB_SYNC_NONE) {
|
||||
folio_wait_writeback(folio);
|
||||
#ifdef CONFIG_AFS_FSCACHE
|
||||
folio_wait_fscache(folio);
|
||||
#endif
|
||||
} else {
|
||||
start += folio_size(folio);
|
||||
}
|
||||
folio_put(folio);
|
||||
if (wbc->sync_mode == WB_SYNC_NONE) {
|
||||
if (skips >= 5 || need_resched())
|
||||
break;
|
||||
skips++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!folio_clear_dirty_for_io(folio))
|
||||
BUG();
|
||||
ret = afs_write_back_from_locked_folio(mapping, wbc, folio, start, end);
|
||||
folio_put(folio);
|
||||
if (ret < 0) {
|
||||
_leave(" = %zd", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
start += ret;
|
||||
|
||||
if (max_one_loop)
|
||||
break;
|
||||
|
||||
folio_batch_release(&fbatch);
|
||||
cond_resched();
|
||||
} while (wbc->nr_to_write > 0);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user