[PATCH] xa_load() needs a NULL check before locking check

void0red posted 1 patch 2 years, 6 months ago
include/linux/pagemap.h | 4 ++++
1 file changed, 4 insertions(+)
[PATCH] xa_load() needs a NULL check before locking check
Posted by void0red 2 years, 6 months ago
Signed-off-by: void0red <void0red@gmail.com>
---
 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
Re: [PATCH] xa_load() needs a NULL check before locking check
Posted by Matthew Wilcox 2 years, 6 months ago
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
>