• David Howells's avatar
    cifs: Implement splice_read to pass down ITER_BVEC not ITER_PIPE · 4e260a8f
    David Howells authored
    Provide cifs_splice_read() to use a bvec rather than an pipe iterator as
    the latter cannot so easily be split and advanced, which is necessary to
    pass an iterator down to the bottom levels.  Upstream cifs gets around this
    problem by using iov_iter_get_pages() to prefill the pipe and then passing
    the list of pages down.
    
    This is done by:
    
     (1) Bulk-allocate a bunch of pages to carry as much of the requested
         amount of data as possible, but without overrunning the available
         slots in the pipe and add them to an ITER_BVEC.
    
     (2) Synchronously call ->read_iter() to read into the buffer.
    
     (3) Discard any unused pages.
    
     (4) Load the remaining pages into the pipe in order and advance the head
         pointer.
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    cc: Steve French <sfrench@samba.org>
    cc: Shyam Prasad N <nspmangalore@gmail.com>
    cc: Rohith Surabattula <rohiths.msft@gmail.com>
    cc: Jeff Layton <jlayton@kernel.org>
    cc: Al Viro <viro@zeniv.linux.org.uk>
    cc: linux-cifs@vger.kernel.org
    
    Link: https://lore.kernel.org/r/166732028113.3186319.1793644937097301358.stgit@warthog.procyon.org.uk/ # rfc
    Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
    4e260a8f
cifsfs.h 6.46 KB