Messages in this thread | ![/](/images/icornerl.gif) | | Date | Tue, 24 Jan 2023 12:50:18 -0800 | Subject | Re: [PATCH v9 2/8] iov_iter: Add a function to extract a page list from an iterator | From | John Hubbard <> |
| |
On 1/24/23 09:01, David Howells wrote: ... > +/* > + * Extract a list of contiguous pages from an ITER_BVEC iterator. This does > + * not get references on the pages, nor does it get a pin on them. > + */ > +static ssize_t iov_iter_extract_bvec_pages(struct iov_iter *i, > + struct page ***pages, size_t maxsize, > + unsigned int maxpages, > + unsigned int extraction_flags, > + size_t *offset0) > +{ > + struct page **p, *page; > + size_t skip = i->iov_offset, offset; > + int k; > + > + for (;;) { > + if (i->nr_segs == 0) > + return 0; > + maxsize = min(maxsize, i->bvec->bv_len - skip); > + if (maxsize) > + break; > + i->iov_offset = 0; > + i->nr_segs--; > + i->kvec++; > + skip = 0; > + } > + > + skip += i->bvec->bv_offset; > + page = i->bvec->bv_page + skip / PAGE_SIZE; > + offset = skip % PAGE_SIZE; > + *offset0 = offset; > + > + maxpages = want_pages_array(pages, maxsize, offset, maxpages); > + if (!maxpages) > + return -ENOMEM;
Is it OK that the iov_iter position has been advanced, and left that way, in the case of an early -ENOMEM return here?
thanks, -- John Hubbard NVIDIA
| ![\](/images/icornerr.gif) |