From: Jens Axboe <jens.axboe@oracle.com>
To: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] splice: fix wrong __splice_from_pipe() usage
Date: Mon, 16 Jul 2007 13:15:28 +0200 [thread overview]
Message-ID: <20070716111528.GD5195@kernel.dk> (raw)
In-Reply-To: <87odiczkky.fsf@duaron.myhome.or.jp>
On Mon, Jul 16 2007, OGAWA Hirofumi wrote:
> Jens Axboe <jens.axboe@oracle.com> writes:
>
> > On Mon, Jul 16 2007, OGAWA Hirofumi wrote:
> >> Hi,
> >>
> >> I've noticed the nfsd read corruption by recent change. And this patch
> >> fixes the problem for me, is this right fix?
> >> --
> >> OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
> >>
> >>
> >> __splice_from_pipe() is updating the sd->pos for the actor, but those
> >> functions are passing the sd of reader side directory. So, splice
> >> updates sd->pos twice.
> >>
> >> This fixes usage of __splice_from_pipe().
> >
> > For sendfile() usage, or the nfsd path that uses splice to send?
>
> nfsd_vfs_read() path.
>
> nfsd_vfs_read()
> splice_direct_to_actor()
> while(len) {
> do_splice_to() [update sd->pos]
> -> generic_file_splice_read() [read from sd->pos]
> nfsd_direct_splice_actor()
> -> __splice_from_pipe() [update sd->pos]
> }
>
> do_splice_to() updates sd->pos for read, and pass updated sd to
> __splice_from_pipe(), and __splice_from_pipe() updates sd->pos for
> write. So, next do_splice_to() read from wrong position.
Ah, I see. Copying the structure over would work, but it seems like a
big work-around for something that is essentially bad behaviour in the
splice core for direct splicing.
Can you check if this works for you?
diff --git a/fs/splice.c b/fs/splice.c
index 6c98286..5e5071a 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -1061,8 +1061,9 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
while (len) {
size_t read_len;
+ loff_t pos = sd->pos;
- ret = do_splice_to(in, &sd->pos, pipe, len, flags);
+ ret = do_splice_to(in, &pos, pipe, len, flags);
if (unlikely(ret <= 0))
goto out_release;
@@ -1080,6 +1081,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
bytes += ret;
len -= ret;
+ sd->pos = pos;
if (ret < read_len)
goto out_release;
--
Jens Axboe
next prev parent reply other threads:[~2007-07-16 11:16 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-16 0:38 [PATCH] splice: fix wrong __splice_from_pipe() usage OGAWA Hirofumi
2007-07-16 6:34 ` Jens Axboe
2007-07-16 10:53 ` OGAWA Hirofumi
2007-07-16 11:15 ` Jens Axboe [this message]
2007-07-16 12:35 ` OGAWA Hirofumi
2007-07-16 12:37 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070716111528.GD5195@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=hirofumi@mail.parknet.co.jp \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.