summaryrefslogtreecommitdiffstats
path: root/mm/iov_iter.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* new helper: iov_iter_bvec()Al Viro2015-01-291-2/+15
| | | | | | similar to iov_iter_kvec(), for ITER_BVEC ones Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* copy_from_iter_nocache()Al Viro2014-12-091-0/+21
| | | | | | BTW, do we want memcpy_nocache()? Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* new helper: iov_iter_kvec()Al Viro2014-12-091-0/+13
| | | | | | initialization of kvec-backed iov_iter Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* csum_and_copy_..._iter()Al Viro2014-12-091-0/+89
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: handle ITER_KVEC directlyAl Viro2014-12-091-13/+69
| | | | | | ... without bothering with copy_..._user() Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: convert copy_to_iter() to iterate_and_advanceAl Viro2014-11-281-82/+9
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: convert copy_from_iter() to iterate_and_advanceAl Viro2014-11-281-91/+15
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: get rid of bvec_copy_page_{to,from}_iter()Al Viro2014-11-281-36/+24
| | | | | | | | | | Just have copy_page_{to,from}_iter() fall back to kmap_atomic + copy_{to,from}_iter() + kunmap_atomic() in ITER_BVEC case. As the matter of fact, that's what we want to do for any iov_iter kind that isn't blocking - e.g. ITER_KVEC will also go that way once we recognize it on iov_iter.c primitives level Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: convert iov_iter_zero() to iterate_and_advanceAl Viro2014-11-281-86/+12
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: convert iov_iter_get_pages_alloc() to iterate_all_kindsAl Viro2014-11-281-62/+45
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: convert iov_iter_get_pages() to iterate_all_kindsAl Viro2014-11-281-50/+28
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: convert iov_iter_npages() to iterate_all_kindsAl Viro2014-11-281-54/+19
| | | | Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: iterate_and_advanceAl Viro2014-11-281-76/+28
| | | | | | | | | same as iterate_all_kinds, but iterator is moved to the position past the last byte we'd handled. iov_iter_advance() converted to it Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* iov_iter.c: macros for iterating over iov_iterAl Viro2014-11-281-126/+86
| | | | | | | | | | | | | | | | | iterate_all_kinds(iter, size, ident, step_iovec, step_bvec) iterates through the ranges covered by iter (up to size bytes total), repeating step_iovec or step_bvec for each of those. ident is declared in expansion of that thing, either as struct iovec or struct bvec, and it contains the range we are currently looking at. step_bvec should be a void expression, step_iovec - a size_t one, with non-zero meaning "stop here, that many bytes from this range left". In the end, the amount actually handled is stored in size. iov_iter_copy_from_user_atomic() and iov_iter_alignment() converted to it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* Fix thinko in iov_iter_single_seg_countPaul Mackerras2014-11-131-2/+2
| | | | | | | | | | | | | | | | | | | | The branches of the if (i->type & ITER_BVEC) statement in iov_iter_single_seg_count() are the wrong way around; if ITER_BVEC is clear then we use i->bvec, when we should be using i->iov. This fixes it. In my case, the symptom that this caused was that a KVM guest doing filesystem operations on a virtual disk would result in one of qemu's threads on the host going into an infinite loop in generic_perform_write(). The loop would hit the copied == 0 case and call iov_iter_single_seg_count() to reduce the number of bytes to try to process, but because of the error, iov_iter_single_seg_count() would just return i->count and the loop made no progress and continued forever. Cc: stable@vger.kernel.org # 3.16+ Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* Add copy_to_iter(), copy_from_iter() and iov_iter_zero()Matthew Wilcox2014-10-091-14/+226
| | | | | | | | | | | | | | | | | | For DAX, we want to be able to copy between iovecs and kernel addresses that don't necessarily have a struct page. This is a fairly simple rearrangement for bvec iters to kmap the pages outside and pass them in, but for user iovecs it gets more complicated because we might try various different ways to kmap the memory. Duplicating the existing logic works out best in this case. We need to be able to write zeroes to an iovec for reads from unwritten ranges in a file. This is performed by the new iov_iter_zero() function, again patterned after the existing code that handles iovec iterators. [AV: and export the buggers...] Signed-off-by: Matthew Wilcox <willy@linux.intel.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* fuse: honour max_read and max_write in direct_io modeMiklos Szeredi2014-09-271-5/+9
| | | | | | | | | | | | | | | | | | | | The third argument of fuse_get_user_pages() "nbytesp" refers to the number of bytes a caller asked to pack into fuse request. This value may be lesser than capacity of fuse request or iov_iter. So fuse_get_user_pages() must ensure that *nbytesp won't grow. Now, when helper iov_iter_get_pages() performs all hard work of extracting pages from iov_iter, it can be done by passing properly calculated "maxsize" to the helper. The other caller of iov_iter_get_pages() (dio_refill_pages()) doesn't need this capability, so pass LONG_MAX as the maxsize argument here. Fixes: c9c37e2e6378 ("fuse: switch to iov_iter_get_pages()") Reported-by: Werner Baumann <werner.baumann@onlinehome.de> Tested-by: Maxim Patlasov <mpatlasov@parallels.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* switch iov_iter_get_pages() to passing maximal number of pagesAl Viro2014-08-071-9/+8
| | | | | | ... instead of maximal size. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* bio_vec-backed iov_iterAl Viro2014-05-061-32/+358
| | | | | | | | | | | | | | | New variant of iov_iter - ITER_BVEC in iter->type, backed with bio_vec array instead of iovec one. Primitives taught to deal with such beasts, __swap_write() switched to using that kind of iov_iter. Note that bio_vec is just a <page, offset, length> triple - there's nothing block-specific about it. I've left the definition where it was, but took it from under ifdef CONFIG_BLOCK. Next target: ->splice_write()... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* optimize copy_page_{to,from}_iter()Al Viro2014-05-061-0/+8
| | | | | | | | | | if we'd ended up in the end of a segment, jump to the beginning of the next one (iov_offset = 0, iov++), rather than having the next primitive deal with that. Ought to be folded back... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* new helper: copy_page_from_iter()Al Viro2014-05-061-0/+78
| | | | | | | parallel to copy_page_to_iter(). pipe_write() switched to it (and became ->write_iter()). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* new helper: iov_iter_get_pages_alloc()Al Viro2014-05-061-0/+40
| | | | | | | | same as iov_iter_get_pages(), except that pages array is allocated (kmalloc if possible, vmalloc if that fails) and left for caller to free. Lustre and NFS ->direct_IO() switched to it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* new helper: iov_iter_npages()Al Viro2014-05-061-0/+27
| | | | | | | | counts the pages covered by iov_iter, up to given limit. do_block_direct_io() and fuse_iter_npages() switched to it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* new helper: iov_iter_get_pages()Al Viro2014-05-061-0/+27
| | | | | | | | | | | | | | iov_iter_get_pages(iter, pages, maxsize, &start) grabs references pinning the pages of up to maxsize of (contiguous) data from iter. Returns the amount of memory grabbed or -error. In case of success, the requested area begins at offset start in pages[0] and runs through pages[1], etc. Less than requested amount might be returned - either because the contiguous area in the beginning of iterator is smaller than requested, or because the kernel failed to pin that many pages. direct-io.c switched to using iov_iter_get_pages() Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* start adding the tag to iov_iterAl Viro2014-05-061-0/+15
| | | | | | | | | For now, just use the same thing we pass to ->direct_IO() - it's all iovec-based at the moment. Pass it explicitly to iov_iter_init() and account for kvec vs. iovec in there, by the same kludge NFS ->direct_IO() uses. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* new primitive: iov_iter_alignment()Al Viro2014-05-061-0/+25
| | | | | | | returns the value aligned as badly as the worst remaining segment in iov_iter is. Use instead of open-coded equivalents. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* kill iov_iter_copy_from_user()Al Viro2014-05-061-27/+0
| | | | | | | all callers can use copy_page_from_iter() and it actually simplifies them. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
* take iov_iter stuff to mm/iov_iter.cAl Viro2014-04-021-0/+224
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>