2023-06-19 14:03:04

by David Howells

[permalink] [raw]
Subject: [PATCH 0/2] afs: Fix writeback

Hi Linus,

Could you apply these fixes to AFS writeback code from Vishal?

(1) Release the acquired batch before returning if we got >=5 skips.

(2) Retry a page we had to wait for rather than skipping over it after the
wait.

The patches can be found here:

https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/log/?h=afs-fixes

Thanks,
David

---
%(shortlog)s
%(diffstat)s

Vishal Moola (Oracle) (2):
afs: Fix dangling folio ref counts in writeback
afs: Fix waiting for writeback then skipping folio

fs/afs/write.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)



2023-06-19 14:13:12

by David Howells

[permalink] [raw]
Subject: [PATCH 2/2] afs: Fix waiting for writeback then skipping folio

From: "Vishal Moola (Oracle)" <[email protected]>

Commit acc8d8588cb7 converted afs_writepages_region() to write back a
folio batch. The function waits for writeback to a folio, but then
proceeds to the rest of the batch without trying to write that folio
again. This patch fixes has it attempt to write the folio again.

[DH: Also remove an 'else' that adding a goto makes redundant]

Fixes: acc8d8588cb7 ("afs: convert afs_writepages_region() to use filemap_get_folios_tag()")
Signed-off-by: Vishal Moola (Oracle) <[email protected]>
Signed-off-by: David Howells <[email protected]>
cc: Marc Dionne <[email protected]>
cc: [email protected]
Link: https://lore.kernel.org/r/[email protected]/
---
fs/afs/write.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/afs/write.c b/fs/afs/write.c
index fd433024070e..8750b99c3f56 100644
--- a/fs/afs/write.c
+++ b/fs/afs/write.c
@@ -731,6 +731,7 @@ static int afs_writepages_region(struct address_space *mapping,
* (changing page->mapping to NULL), or even swizzled
* back from swapper_space to tmpfs file mapping
*/
+try_again:
if (wbc->sync_mode != WB_SYNC_NONE) {
ret = folio_lock_killable(folio);
if (ret < 0) {
@@ -757,9 +758,10 @@ static int afs_writepages_region(struct address_space *mapping,
#ifdef CONFIG_AFS_FSCACHE
folio_wait_fscache(folio);
#endif
- } else {
- start += folio_size(folio);
+ goto try_again;
}
+
+ start += folio_size(folio);
if (wbc->sync_mode == WB_SYNC_NONE) {
if (skips >= 5 || need_resched()) {
*_next = start;


2023-06-19 14:17:36

by David Howells

[permalink] [raw]
Subject: Re: [PATCH 0/2] afs: Fix writeback

David Howells <[email protected]> wrote:

> Hi Linus,
>
> Could you apply these fixes to AFS writeback code from Vishal?
>
> (1) Release the acquired batch before returning if we got >=5 skips.
>
> (2) Retry a page we had to wait for rather than skipping over it after the
> wait.
>
> The patches can be found here:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git/log/?h=afs-fixes

Let me do that with a signed tag.

David


2023-06-19 14:24:52

by David Howells

[permalink] [raw]
Subject: [PATCH 1/2] afs: Fix dangling folio ref counts in writeback

From: "Vishal Moola (Oracle)" <[email protected]>

Commit acc8d8588cb7 converted afs_writepages_region() to write back a
folio batch. If writeback needs rescheduling, the function exits without
dropping the references to the folios in fbatch. This patch fixes that.

[DH: Moved the added line before the _leave()]

Fixes: acc8d8588cb7 ("afs: convert afs_writepages_region() to use filemap_get_folios_tag()")
Signed-off-by: Vishal Moola (Oracle) <[email protected]>
Signed-off-by: David Howells <[email protected]>
cc: Marc Dionne <[email protected]>
cc: [email protected]
Link: https://lore.kernel.org/r/[email protected]/
---
fs/afs/write.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/fs/afs/write.c b/fs/afs/write.c
index c822d6006033..fd433024070e 100644
--- a/fs/afs/write.c
+++ b/fs/afs/write.c
@@ -763,6 +763,7 @@ static int afs_writepages_region(struct address_space *mapping,
if (wbc->sync_mode == WB_SYNC_NONE) {
if (skips >= 5 || need_resched()) {
*_next = start;
+ folio_batch_release(&fbatch);
_leave(" = 0 [%llx]", *_next);
return 0;
}