Messages in this thread | | | Date | Mon, 14 Nov 2022 12:42:29 +0800 | From | Gao Xiang <> | Subject | Re: [PATCH] erofs: fix missing xas_retry() in fscache mode |
| |
On Fri, Nov 11, 2022 at 05:08:13PM +0800, Jingbo Xu wrote: > The xarray iteration only holds RCU and thus may encounter > XA_RETRY_ENTRY if there's process modifying the xarray concurrently. > This will cause oops when referring to the invalid entry. > > Fix this by adding the missing xas_retry(), which will make the > iteration wind back to the root node if XA_RETRY_ENTRY is encountered. > > Fixes: d435d53228dd ("erofs: change to use asynchronous io for fscache readpage/readahead") > Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Thanks, Gao Xiang
> --- > fs/erofs/fscache.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/fs/erofs/fscache.c b/fs/erofs/fscache.c > index fe05bc51f9f2..458c1c70ef30 100644 > --- a/fs/erofs/fscache.c > +++ b/fs/erofs/fscache.c > @@ -75,11 +75,15 @@ static void erofs_fscache_rreq_unlock_folios(struct netfs_io_request *rreq) > > rcu_read_lock(); > xas_for_each(&xas, folio, last_page) { > - unsigned int pgpos = > - (folio_index(folio) - start_page) * PAGE_SIZE; > - unsigned int pgend = pgpos + folio_size(folio); > + unsigned int pgpos, pgend; > bool pg_failed = false; > > + if (xas_retry(&xas, folio)) > + continue; > + > + pgpos = (folio_index(folio) - start_page) * PAGE_SIZE; > + pgend = pgpos + folio_size(folio); > + > for (;;) { > if (!subreq) { > pg_failed = true; > -- > 2.19.1.6.gb485710b
| |