[PATCH v3 3/3] mm/truncate: clarify return value of truncate_inode_partial_folio()

From: Zhang Yi

Date: Wed Sep 16 2026 - 05:42:04 EST


From: Zhang Yi <yi.zhang@xxxxxxxxxx>

With the earlier rework the callers no longer rely on the return value
of truncate_inode_partial_folio() to decide whether to adjust the
truncation range. The pstart/pend out-parameters carry that information
instead. The callers now only use the return value as a flag indicating
whether the loop should be reset to pick up newly split sub-folios on
the shmem path.

Return true if at least one split succeeded, and false otherwise.
This clarifies the existing confusing return value semantics.

Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx>
---
mm/truncate.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/mm/truncate.c b/mm/truncate.c
index 5ab7a40b1e25..23c90f00b530 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -216,8 +216,7 @@ static int folio_split_or_unmap(struct folio *folio, struct page *split_at,
* aligned inwards to min_order, i.e. the range of folios wholly within
* [lstart, lend] and so safe to discard.
*
- * Returns false if splitting failed so the caller can avoid
- * discarding the entire folio which is stubbornly unsplit.
+ * Return %true if at least one split succeeded, %false otherwise.
*/
bool truncate_inode_partial_folio(struct folio *folio, loff_t lstart,
loff_t lend, pgoff_t *pstart, pgoff_t *pend)
@@ -247,7 +246,7 @@ bool truncate_inode_partial_folio(struct folio *folio, loff_t lstart,
folio_wait_writeback(folio);
if (length == size) {
truncate_inode_folio(folio->mapping, folio);
- return true;
+ return false;
}

/*
@@ -261,7 +260,7 @@ bool truncate_inode_partial_folio(struct folio *folio, loff_t lstart,
if (folio_needs_release(folio))
folio_invalidate(folio, offset, length);
if (!folio_test_large(folio))
- return true;
+ return false;

min_order = mapping_min_folio_order(folio->mapping);
min_nrbytes = mapping_min_folio_nrbytes(folio->mapping);
@@ -331,10 +330,9 @@ bool truncate_inode_partial_folio(struct folio *folio, loff_t lstart,
*pend = end;
return true;
}
- if (folio_test_dirty(folio))
- return false;
- truncate_inode_folio(folio->mapping, folio);
- return true;
+ if (!folio_test_dirty(folio))
+ truncate_inode_folio(folio->mapping, folio);
+ return false;
}

/*
--
2.52.0