* [PATCH 1/2] fs/dax: Remove unused dax_layout_busy_page()
2026-09-04 15:27 [PATCH 0/2] fs/dax: Clean up busy page lookup helpers Kaitao Cheng
@ 2026-09-04 15:27 ` Kaitao Cheng
2026-09-05 2:03 ` Muchun Song
2026-09-04 15:27 ` [PATCH 2/2] fs/dax: Make dax_layout_busy_page_range() static Kaitao Cheng
1 sibling, 1 reply; 5+ messages in thread
From: Kaitao Cheng @ 2026-09-04 15:27 UTC (permalink / raw)
To: Alexander Viro, Christian Brauner, Jan Kara, Dan Williams,
Matthew Wilcox
Cc: Muchun Song, linux-fsdevel, nvdimm, linux-kernel, Kaitao Cheng
From: Kaitao Cheng <chengkaitao@kylinos.cn>
dax_layout_busy_page() used to let filesystems scan an entire DAX
mapping for pinned pages. All callers now use dax_break_layout(),
which also handles waiting for busy pages and deleting DAX mapping
entries once the range becomes idle.
The remaining function is only a wrapper around
dax_layout_busy_page_range() and has no in-tree users. Remove it
together with its declaration, !CONFIG_FS_DAX stub, and exported
symbol.
Signed-off-by: Kaitao Cheng <chengkaitao@kylinos.cn>
---
fs/dax.c | 6 ------
include/linux/dax.h | 6 ------
2 files changed, 12 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index dad4efea7964..1e19e4a354ce 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -841,12 +841,6 @@ struct page *dax_layout_busy_page_range(struct address_space *mapping,
}
EXPORT_SYMBOL_GPL(dax_layout_busy_page_range);
-struct page *dax_layout_busy_page(struct address_space *mapping)
-{
- return dax_layout_busy_page_range(mapping, 0, LLONG_MAX);
-}
-EXPORT_SYMBOL_GPL(dax_layout_busy_page);
-
static int __dax_invalidate_entry(struct address_space *mapping,
pgoff_t index, bool trunc)
{
diff --git a/include/linux/dax.h b/include/linux/dax.h
index fe6c3ded1b50..05e59e45a1c2 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -155,7 +155,6 @@ int dax_writeback_mapping_range(struct address_space *mapping,
struct dax_device *dax_dev, struct writeback_control *wbc);
int dax_folio_reset_order(struct folio *folio);
-struct page *dax_layout_busy_page(struct address_space *mapping);
struct page *dax_layout_busy_page_range(struct address_space *mapping, loff_t start, loff_t end);
dax_entry_t dax_lock_folio(struct folio *folio);
void dax_unlock_folio(struct folio *folio, dax_entry_t cookie);
@@ -173,11 +172,6 @@ static inline int fs_dax_get(struct dax_device *dax_dev, void *holder,
{
return -EOPNOTSUPP;
}
-static inline struct page *dax_layout_busy_page(struct address_space *mapping)
-{
- return NULL;
-}
-
static inline struct page *dax_layout_busy_page_range(struct address_space *mapping, pgoff_t start, pgoff_t nr_pages)
{
return NULL;
--
2.50.1 (Apple Git-155)
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH 2/2] fs/dax: Make dax_layout_busy_page_range() static
2026-09-04 15:27 [PATCH 0/2] fs/dax: Clean up busy page lookup helpers Kaitao Cheng
2026-09-04 15:27 ` [PATCH 1/2] fs/dax: Remove unused dax_layout_busy_page() Kaitao Cheng
@ 2026-09-04 15:27 ` Kaitao Cheng
2026-09-05 2:04 ` Muchun Song
1 sibling, 1 reply; 5+ messages in thread
From: Kaitao Cheng @ 2026-09-04 15:27 UTC (permalink / raw)
To: Alexander Viro, Christian Brauner, Jan Kara, Dan Williams,
Matthew Wilcox
Cc: Muchun Song, linux-fsdevel, nvdimm, linux-kernel, Kaitao Cheng
From: Kaitao Cheng <chengkaitao@kylinos.cn>
dax_layout_busy_page_range() no longer has callers outside fs/dax.c.
Keeping the range helper exported unnecessarily exposes a low-level
implementation detail.
Make the helper static and remove its export and header definitions.
Also fix the stale dax_layout_busy_page_range() comment to match the
implementation.
Signed-off-by: Kaitao Cheng <chengkaitao@kylinos.cn>
---
fs/dax.c | 18 ++++++++----------
include/linux/dax.h | 6 ------
2 files changed, 8 insertions(+), 16 deletions(-)
diff --git a/fs/dax.c b/fs/dax.c
index 1e19e4a354ce..c6ad9533aa54 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -770,24 +770,23 @@ static void *grab_mapping_entry(struct xa_state *xas,
/**
* dax_layout_busy_page_range - find first pinned page in @mapping
- * @mapping: address space to scan for a page with ref count > 1
+ * @mapping: address space to scan for a pinned page
* @start: Starting offset. Page containing 'start' is included.
* @end: End offset. Page containing 'end' is included. If 'end' is LLONG_MAX,
* pages from 'start' till the end of file are included.
*
- * DAX requires ZONE_DEVICE mapped pages. These pages are never
- * 'onlined' to the page allocator so they are considered idle when
- * page->count == 1. A filesystem uses this interface to determine if
- * any page in the mapping is busy, i.e. for DMA, or other
- * get_user_pages() usages.
+ * DAX requires ZONE_DEVICE mapped pages. A page is considered busy when
+ * folio_ref_count(folio) exceeds folio_mapcount(folio). This helper is
+ * used to determine if any page in the mapping is busy, i.e. for DMA,
+ * or other get_user_pages() usages.
*
* It is expected that the filesystem is holding locks to block the
* establishment of new mappings in this address_space. I.e. it expects
- * to be able to run unmap_mapping_range() and subsequently not race
+ * to be able to run unmap_mapping_pages() and subsequently not race
* mapping_mapped() becoming true.
*/
-struct page *dax_layout_busy_page_range(struct address_space *mapping,
- loff_t start, loff_t end)
+static struct page *dax_layout_busy_page_range(struct address_space *mapping,
+ loff_t start, loff_t end)
{
void *entry;
unsigned int scanned = 0;
@@ -839,7 +838,6 @@ struct page *dax_layout_busy_page_range(struct address_space *mapping,
xas_unlock_irq(&xas);
return page;
}
-EXPORT_SYMBOL_GPL(dax_layout_busy_page_range);
static int __dax_invalidate_entry(struct address_space *mapping,
pgoff_t index, bool trunc)
diff --git a/include/linux/dax.h b/include/linux/dax.h
index 05e59e45a1c2..f2d47975d905 100644
--- a/include/linux/dax.h
+++ b/include/linux/dax.h
@@ -155,7 +155,6 @@ int dax_writeback_mapping_range(struct address_space *mapping,
struct dax_device *dax_dev, struct writeback_control *wbc);
int dax_folio_reset_order(struct folio *folio);
-struct page *dax_layout_busy_page_range(struct address_space *mapping, loff_t start, loff_t end);
dax_entry_t dax_lock_folio(struct folio *folio);
void dax_unlock_folio(struct folio *folio, dax_entry_t cookie);
dax_entry_t dax_lock_mapping_entry(struct address_space *mapping,
@@ -172,11 +171,6 @@ static inline int fs_dax_get(struct dax_device *dax_dev, void *holder,
{
return -EOPNOTSUPP;
}
-static inline struct page *dax_layout_busy_page_range(struct address_space *mapping, pgoff_t start, pgoff_t nr_pages)
-{
- return NULL;
-}
-
static inline int dax_writeback_mapping_range(struct address_space *mapping,
struct dax_device *dax_dev, struct writeback_control *wbc)
{
--
2.50.1 (Apple Git-155)
^ permalink raw reply related [flat|nested] 5+ messages in thread