14 Nov, 2014

1 commit

  • 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
    Signed-off-by: Al Viro

    Paul Mackerras
     

09 Oct, 2014

1 commit

  • 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
    Signed-off-by: Al Viro

    Matthew Wilcox
     

27 Sep, 2014

1 commit

  • 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
    Tested-by: Maxim Patlasov
    Signed-off-by: Miklos Szeredi
    Signed-off-by: Al Viro

    Miklos Szeredi
     

08 Aug, 2014

1 commit


07 May, 2014

9 commits

  • 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 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

    Al Viro
     
  • 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

    Al Viro
     
  • parallel to copy_page_to_iter(). pipe_write() switched to it (and became
    ->write_iter()).

    Signed-off-by: Al Viro

    Al Viro
     
  • 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

    Al Viro
     
  • 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

    Al Viro
     
  • 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

    Al Viro
     
  • 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

    Al Viro
     
  • 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

    Al Viro
     
  • all callers can use copy_page_from_iter() and it actually simplifies
    them.

    Signed-off-by: Al Viro

    Al Viro
     

02 Apr, 2014

1 commit