diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 92e6f56a932d..f76abbeb9c90 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1840,6 +1840,12 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
 					goto xa_locked;
 				}
 				xas_store(&xas, hpage);
+				if (xas_error(&xas)) {
+					mapping->nrpages--;
+					shmem_uncharge(mapping->host, 1);
+					result = SCAN_FAIL;
+					goto xa_locked;
+				}
 				nr_none++;
 				continue;
 			}
@@ -2134,7 +2140,6 @@ static int collapse_file(struct mm_struct *mm, unsigned long addr,
 		mem_cgroup_uncharge(page_folio(hpage));
 		put_page(hpage);
 	}
-
 	trace_mm_khugepaged_collapse_file(mm, hpage, index, is_shmem, addr, file, nr, result);
 	return result;
 }