On Fri, Aug 08 2025, Pasha Tatashin wrote: >> +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. Good catch! Will fix. > >> + 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; >> +} >> + -- Regards, Pratyush Yadav