On Tue, Sep 13, 2016 at 08:49:58PM -0700, Linus Torvalds wrote:
> I'd also like to simplify the splice code if at all possible.
Then pipe_buffer it is; it will take a bit of surgery, but I'd expect
the end result to be much simpler. OK, so splice_pipe_desc switches
from the pages/partial_pages/ops/spd_release to pipe_bufs, and I'm
actually tempted to replace nr_pages with "the rest of ->pipe_bufs[] has
NULL ->page". Then it becomes simply
struct splice_pipe_desc {
struct pipe_buffer *bufs;
int nbufs;
unsigned flags;
}, perhaps with struct pipe_buffer _bufs[INLINE_SPLICE_BUFS]; in the end.
struct partial_page simply dies...
Next question: what to do with sanitizing flags in splice(2)/vmsplice(2)/tee(2)?
Right now we accept anything, and quietly ignore everything outside of lower
4 bits. Should we start masking everything else out and/or warning about
anything unexpected?
What I definitely want for splice_to_pipe() is an additional flag for
"fail unless there's enough space to copy everything". Having fuse open-code
splice_to_pipe() with all its guts is just plain wrong. I'm not saying that
it should be possible to set in splice(2) arguments; it's obviously an ABI
breakage, since currently we ignore all unknown bits. The question is whether
we mask the unknown bits quietly; doing that with yelling might allow to
make them eventually available.
|