2023-02-15 13:14:29

by void0red

[permalink] [raw]
Subject: [PATCH] xa_load() needs a NULL check before locking check

Signed-off-by: void0red <[email protected]>
---
include/linux/pagemap.h | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index bbccb4044222..f1ddee3571de 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -1250,6 +1250,10 @@ static inline struct folio *__readahead_folio(struct readahead_control *ractl)
}

folio = xa_load(&ractl->mapping->i_pages, ractl->_index);
+ if (!folio) {
+ VM_BUG_ON(!folio);
+ return NULL;
+ }
VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);
ractl->_batch_count = folio_nr_pages(folio);

--
2.34.1



2023-02-15 13:32:04

by Matthew Wilcox

[permalink] [raw]
Subject: Re: [PATCH] xa_load() needs a NULL check before locking check

On Wed, Feb 15, 2023 at 09:14:17PM +0800, void0red wrote:
> folio = xa_load(&ractl->mapping->i_pages, ractl->_index);
> + if (!folio) {
> + VM_BUG_ON(!folio);
> + return NULL;
> + }
> VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio);

Why does this need to happen? The caller has inserted all these folios
into the xarray. They're locked, so they can't be removed. If they're
not there, something has gone horribly wrong and crashing is a good
response.

> ractl->_batch_count = folio_nr_pages(folio);
>
> --
> 2.34.1
>