From: Jens Axboe <jens.axboe@oracle.com>
To: Christoph Hellwig <hch@infradead.org>,
linux-kernel@vger.kernel.org, cotte@de.ibm.com, hugh@veritas.com,
neilb@suse.de, zanussi@us.ibm.com,
Linus Torvalds <torvalds@osdl.org>
Subject: Re: [PATCH] sendfile removal
Date: Fri, 1 Jun 2007 10:15:36 +0200 [thread overview]
Message-ID: <20070601081536.GO32105@kernel.dk> (raw)
In-Reply-To: <20070531110550.GR32105@kernel.dk>
On Thu, May 31 2007, Jens Axboe wrote:
> > This change is wrong. loop or any existing user of ->sendfile absolutely
> > needs to go through a file operations vector so that file-system specific
> > actions such as locking are performed. This is required at least for the
> > clustered filesystems and XFS. The right way to implement this is
> > via do_splice_direct or something similar.
> >
> > do_generic_file_read is only a library function for filesystem use
> > and should never be called directly.
>
> I'll convert it to do_splice_direct(), thanks.
So how does this look? Totally untested, will do that now. It only
covers the read side, the write conversion to splice will happen later.
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 92bac14..3714e60 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -74,6 +74,7 @@
#include <linux/highmem.h>
#include <linux/gfp.h>
#include <linux/kthread.h>
+#include <linux/pipe_fs_i.h>
#include <asm/uaccess.h>
@@ -401,58 +402,70 @@ struct lo_read_data {
};
static int
-lo_read_actor(read_descriptor_t *desc, struct page *page,
- unsigned long offset, unsigned long size)
+lo_splice_actor(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
+ struct splice_desc *sd)
{
- unsigned long count = desc->count;
- struct lo_read_data *p = desc->arg.data;
+ struct lo_read_data *p = sd->data;
struct loop_device *lo = p->lo;
+ struct page *page = buf->page;
sector_t IV;
+ size_t size;
+ int ret;
- IV = ((sector_t) page->index << (PAGE_CACHE_SHIFT - 9))+(offset >> 9);
+ ret = buf->ops->pin(pipe, buf);
+ if (unlikely(ret))
+ return ret;
- if (size > count)
- size = count;
+ IV = ((sector_t) page->index << (PAGE_CACHE_SHIFT - 9))+(buf->offset >> 9);
+ size = sd->len;
- if (lo_do_transfer(lo, READ, page, offset, p->page, p->offset, size, IV)) {
+ if (lo_do_transfer(lo, READ, page, buf->offset, p->page, p->offset, size, IV)) {
size = 0;
printk(KERN_ERR "loop: transfer error block %ld\n",
page->index);
- desc->error = -EINVAL;
+ size = -EINVAL;
}
flush_dcache_page(p->page);
- desc->count = count - size;
- desc->written += size;
- p->offset += size;
+ if (size > 0)
+ p->offset += size;
return size;
}
static int
+lo_direct_splice_actor(struct pipe_inode_info *pipe, struct splice_desc *sd)
+{
+ return __splice_from_pipe(pipe, sd, lo_splice_actor);
+}
+
+static int
do_lo_receive(struct loop_device *lo,
struct bio_vec *bvec, int bsize, loff_t pos)
{
struct lo_read_data cookie;
+ struct splice_desc sd;
struct file *file;
- read_descriptor_t desc;
-
- desc.written = 0;
- desc.count = bvec->bv_len;
- desc.arg.data = &cookie;
- desc.error = 0;
+ int retval;
cookie.lo = lo;
cookie.page = bvec->bv_page;
cookie.offset = bvec->bv_offset;
cookie.bsize = bsize;
+
+ sd.len = 0;
+ sd.total_len = bsize;
+ sd.flags = 0;
+ sd.pos = pos;
+ sd.data = &cookie;
+
file = lo->lo_backing_file;
+ retval = splice_direct_to_actor(file, &sd, lo_direct_splice_actor);
- do_generic_file_read(file, &pos, &desc, lo_read_actor);
- if (desc.written)
- return 0;
+ if (retval < 0)
+ return retval;
- return desc.error;
+ return 0;
}
static int
@@ -687,8 +700,8 @@ static int loop_change_fd(struct loop_device *lo, struct file *lo_file,
if (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))
goto out_putf;
- /* new backing store needs to support loop (eg readpage) */
- if (!file->f_mapping->a_ops->readpage)
+ /* new backing store needs to support loop (eg splice_read) */
+ if (!inode->i_fop->splice_read)
goto out_putf;
/* size of the new backing store needs to be the same */
@@ -768,7 +781,7 @@ static int loop_set_fd(struct loop_device *lo, struct file *lo_file,
* If we can't read - sorry. If we only can't write - well,
* it's going to be read-only.
*/
- if (!aops->readpage)
+ if (!file->f_op->splice_read)
goto out_putf;
if (aops->prepare_write && aops->commit_write)
lo_flags |= LO_FLAGS_USE_AOPS;
--
Jens Axboe
next prev parent reply other threads:[~2007-06-01 8:17 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-05-31 10:33 [PATCH] sendfile removal Jens Axboe
2007-05-31 10:47 ` Jens Axboe
2007-05-31 10:47 ` Eric Dumazet
2007-05-31 10:53 ` Jens Axboe
2007-06-01 4:09 ` H. Peter Anvin
2007-06-01 5:41 ` Jens Axboe
2007-06-01 5:50 ` H. Peter Anvin
2007-06-01 7:22 ` Eric Dumazet
2007-06-01 15:52 ` H. Peter Anvin
2007-06-01 16:18 ` Linus Torvalds
2007-06-01 16:47 ` Eric Dumazet
2007-06-01 16:53 ` H. Peter Anvin
2007-06-02 15:02 ` Jens Axboe
2007-06-02 15:01 ` Jens Axboe
2007-06-02 15:40 ` Linus Torvalds
2007-06-02 16:35 ` Jens Axboe
2007-06-03 13:05 ` Fengguang Wu
2007-06-03 13:05 ` Fengguang Wu
2007-06-03 14:29 ` Fengguang Wu
2007-06-03 14:29 ` Fengguang Wu
2007-06-04 0:46 ` Fengguang Wu
2007-06-04 0:46 ` Fengguang Wu
2007-06-04 8:05 ` Jens Axboe
2007-06-04 11:22 ` Fengguang Wu
2007-06-04 11:22 ` Fengguang Wu
2007-06-01 16:22 ` Pádraig Brady
2007-05-31 10:55 ` Christoph Hellwig
2007-05-31 11:05 ` Jens Axboe
2007-05-31 12:26 ` Neil Brown
2007-05-31 12:27 ` Jens Axboe
2007-06-01 2:44 ` [PATCH] sendfile removal (nfsd update) Neil Brown
2007-06-01 5:44 ` Jens Axboe
2007-06-01 8:01 ` Jens Axboe
2007-06-01 8:15 ` Jens Axboe [this message]
2007-05-31 11:04 ` [PATCH] sendfile removal Carsten Otte
2007-05-31 11:06 ` Jens Axboe
2007-05-31 15:33 ` Tom Zanussi
2007-05-31 19:01 ` Jens Axboe
2007-05-31 17:06 ` Hugh Dickins
2007-05-31 17:31 ` Christoph Hellwig
2007-05-31 19:03 ` 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=20070601081536.GO32105@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=cotte@de.ibm.com \
--cc=hch@infradead.org \
--cc=hugh@veritas.com \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@suse.de \
--cc=torvalds@osdl.org \
--cc=zanussi@us.ibm.com \
/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.