Re: iov_iter_pipe warning.

From: Al Viro
Date: Mon Apr 10 2017 - 15:57:17 EST


On Mon, Apr 10, 2017 at 03:42:06PM -0400, Dave Jones wrote:
> > Do you have a reliable reproducer?
>
> Not reliable, but I'll see if I can find some time to narrow it down
> this week. I've been working on better logging of "wtf just happened"
> the last few weeks, so it should get easier once I finish that work.

I would suggest
a) slapping WARN_ON(pipe->nr_bufs); right before the loop
in splice_direct_to_actor(). Internal pipe should be empty when we
enter this function.
b) the same WARN_ON() in the very end of the loop body.

We should have started with empty pipe. We'd called ->splice_read()
and it had returned a positive number (in read_len). That should be
the amount we'd pushed in there. Then we call actor(), with
sd->total_len set to read_len. Its return value is
* positive (or we would've buggered off)
* no less than read_len (ditto)
so it should have drained the pipe entirely, leaving it empty again.

Finding it not just non-empty, but full means that something's very
wrong. The actor here is essentially ->splice_write(), and I'm really
curious which file is the target. Actually, could you turn those
WARN_ON() into
if (WARN_ON(pipe->nr_bufs))
printk(KERN_ERR "->splice_write = %p",
sd->u.file->f_op->splice_write);
and see which function it is?