> +static int memfd_luo_preserve_folios(struct memfd_luo_preserved_folio *pfolios, > + struct folio **folios, > + unsigned int nr_folios) > +{ > + unsigned int i; Should be 'long i' Otherwise in err_unpreserve we get into an infinite loop. Thank you Josh Hilke for noticing this. Pasha > + int err; > + > + for (i = 0; i < nr_folios; i++) { > + struct memfd_luo_preserved_folio *pfolio = &pfolios[i]; > + struct folio *folio = folios[i]; > + unsigned int flags = 0; > + unsigned long pfn; > + > + err = kho_preserve_folio(folio); > + if (err) > + goto err_unpreserve; > + > + pfn = folio_pfn(folio); > + if (folio_test_dirty(folio)) > + flags |= PRESERVED_FLAG_DIRTY; > + if (folio_test_uptodate(folio)) > + flags |= PRESERVED_FLAG_UPTODATE; > + > + pfolio->foliodesc = PRESERVED_FOLIO_MKDESC(pfn, flags); > + pfolio->index = folio->index; > + } > + > + return 0; > + > +err_unpreserve: > + i--; > + for (; i >= 0; i--) > + WARN_ON_ONCE(kho_unpreserve_folio(folios[i])); > + return err; > +} > +