On Mon 18-12-23 16:35:51, Christoph Hellwig wrote: > From: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> > > Wrap up the iterator with a nice bit of syntactic sugar. Now the > caller doesn't need to know about wbc->err and can just return error, > not knowing that the iterator took care of storing errors correctly. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Not sure if the trick with 'error' variable isn't a bit too clever for us ;) We'll see how many bugs it will cause in the future... Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > +#define for_each_writeback_folio(mapping, wbc, folio, error) \ > + for (folio = writeback_iter_init(mapping, wbc); \ > + folio || ((error = wbc->err), false); \ > + folio = writeback_iter_next(mapping, wbc, folio, error)) > + > typedef int (*writepage_t)(struct folio *folio, struct writeback_control *wbc, > void *data); > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index 0771f19950081f..fbffd30a9cc93f 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -2463,7 +2463,7 @@ static struct folio *writeback_get_folio(struct address_space *mapping, > return folio; > } > > -static struct folio *writeback_iter_init(struct address_space *mapping, > +struct folio *writeback_iter_init(struct address_space *mapping, > struct writeback_control *wbc) > { > if (wbc->range_cyclic) > @@ -2479,7 +2479,7 @@ static struct folio *writeback_iter_init(struct address_space *mapping, > return writeback_get_folio(mapping, wbc); > } > > -static struct folio *writeback_iter_next(struct address_space *mapping, > +struct folio *writeback_iter_next(struct address_space *mapping, > struct writeback_control *wbc, struct folio *folio, int error) > { > unsigned long nr = folio_nr_pages(folio); > @@ -2557,9 +2557,7 @@ int write_cache_pages(struct address_space *mapping, > struct folio *folio; > int error; > > - for (folio = writeback_iter_init(mapping, wbc); > - folio; > - folio = writeback_iter_next(mapping, wbc, folio, error)) > + for_each_writeback_folio(mapping, wbc, folio, error) > error = writepage(folio, wbc, data); > > return wbc->err; > -- > 2.39.2 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR