On Sat, Sep 10, 2022 at 09:21:11PM +0000, Chuck Lever III wrote: > It's also possible that recent simplifications I've done to the splice > read actor accidentally removed the ability to deal with compound pages. > You might want to review the commit history of nfsd_splice_actor() to > see if there is an historic version that would behave correctly with > the new copy_page_to_iter(). Nah, that's unrelated... > Is the need to deal with CompoundPage documented somewhere? If not, > perhaps nfsd_splice_actor() could mention it so that overzealous > maintainers don't break it again. > > + struct page *page = buf->page; // may be a compound one Does that qualify? ;-) FWIW, there's a separate problem in that thing - it assumes that pipe_buffer boundaries will end up PAGE_SIZE-aligned. Usually that's going to be true, but foofs_splice_read() is not required to maintain that. E.g. it might be working in terms of chunks used by weird protocol used by foofs, with e.g. 1024-byte payloads + 300-odd bytes of framing/checskums/whatnot. In that case it might do 1024 bytes per pipe_buffer, with non-zero offset in page in each of them; normal read()/splice()/etc. would work just fine with that, but for nfsd_splice_actor() results would not be nice. AFAICS, sunrpc assumes that we have several pages, offset in the first one and total size; no provisions exist for e.g. 5Kb of data scattered in 5 chunks over 5 pages. Correct?