mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
coda: Implement splice-read
Implement splice-read for coda by passing the request down a layer rather than going through generic_file_splice_read() which is going to be changed to assume that ->read_folio() is present on buffered files. Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Jan Harkes <jaharkes@cs.cmu.edu> cc: Christoph Hellwig <hch@lst.de> cc: Jens Axboe <axboe@kernel.dk> cc: Al Viro <viro@zeniv.linux.org.uk> cc: John Hubbard <jhubbard@nvidia.com> cc: David Hildenbrand <david@redhat.com> cc: Matthew Wilcox <willy@infradead.org> cc: coda@cs.cmu.edu cc: codalist@coda.cs.cmu.edu cc: linux-unionfs@vger.kernel.org cc: linux-block@vger.kernel.org cc: linux-fsdevel@vger.kernel.org cc: linux-mm@kvack.org Link: https://lore.kernel.org/r/20230522135018.2742245-12-dhowells@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
committed by
Jens Axboe
parent
d4120d87a0
commit
a1be2935d0
@@ -23,6 +23,7 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/uio.h>
|
#include <linux/uio.h>
|
||||||
|
#include <linux/splice.h>
|
||||||
|
|
||||||
#include <linux/coda.h>
|
#include <linux/coda.h>
|
||||||
#include "coda_psdev.h"
|
#include "coda_psdev.h"
|
||||||
@@ -94,6 +95,32 @@ finish_write:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
coda_file_splice_read(struct file *coda_file, loff_t *ppos,
|
||||||
|
struct pipe_inode_info *pipe,
|
||||||
|
size_t len, unsigned int flags)
|
||||||
|
{
|
||||||
|
struct inode *coda_inode = file_inode(coda_file);
|
||||||
|
struct coda_file_info *cfi = coda_ftoc(coda_file);
|
||||||
|
struct file *in = cfi->cfi_container;
|
||||||
|
loff_t ki_pos = *ppos;
|
||||||
|
ssize_t ret;
|
||||||
|
|
||||||
|
ret = venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode),
|
||||||
|
&cfi->cfi_access_intent,
|
||||||
|
len, ki_pos, CODA_ACCESS_TYPE_READ);
|
||||||
|
if (ret)
|
||||||
|
goto finish_read;
|
||||||
|
|
||||||
|
ret = vfs_splice_read(in, ppos, pipe, len, flags);
|
||||||
|
|
||||||
|
finish_read:
|
||||||
|
venus_access_intent(coda_inode->i_sb, coda_i2f(coda_inode),
|
||||||
|
&cfi->cfi_access_intent,
|
||||||
|
len, ki_pos, CODA_ACCESS_TYPE_READ_FINISH);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
coda_vm_open(struct vm_area_struct *vma)
|
coda_vm_open(struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
@@ -302,5 +329,5 @@ const struct file_operations coda_file_operations = {
|
|||||||
.open = coda_open,
|
.open = coda_open,
|
||||||
.release = coda_release,
|
.release = coda_release,
|
||||||
.fsync = coda_fsync,
|
.fsync = coda_fsync,
|
||||||
.splice_read = generic_file_splice_read,
|
.splice_read = coda_file_splice_read,
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user