Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

orangefs: Provide a splice-read wrapper

Provide a splice_read wrapper for ocfs2. This increments the read stats
and then locks the inode across the call to filemap_splice_read() and a
revalidation of the mapping. Splicing from direct I/O is done by the
caller.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Christoph Hellwig <hch@lst.de>
cc: Al Viro <viro@zeniv.linux.org.uk>
cc: Jens Axboe <axboe@kernel.dk>
cc: Mike Marshall <hubcap@omnibond.com>
cc: Martin Brandenburg <martin@omnibond.com>
cc: devel@lists.orangefs.org
cc: linux-fsdevel@vger.kernel.org
cc: linux-block@vger.kernel.org
cc: linux-mm@kvack.org
Link: https://lore.kernel.org/r/20230522135018.2742245-24-dhowells@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

David Howells and committed by
Jens Axboe
6bbf64be 94aca682

+21 -1
+21 -1
fs/orangefs/file.c
··· 337 337 return ret; 338 338 } 339 339 340 + static ssize_t orangefs_file_splice_read(struct file *in, loff_t *ppos, 341 + struct pipe_inode_info *pipe, 342 + size_t len, unsigned int flags) 343 + { 344 + struct inode *inode = file_inode(in); 345 + ssize_t ret; 346 + 347 + orangefs_stats.reads++; 348 + 349 + down_read(&inode->i_rwsem); 350 + ret = orangefs_revalidate_mapping(inode); 351 + if (ret) 352 + goto out; 353 + 354 + ret = filemap_splice_read(in, ppos, pipe, len, flags); 355 + out: 356 + up_read(&inode->i_rwsem); 357 + return ret; 358 + } 359 + 340 360 static ssize_t orangefs_file_write_iter(struct kiocb *iocb, 341 361 struct iov_iter *iter) 342 362 { ··· 576 556 .lock = orangefs_lock, 577 557 .mmap = orangefs_file_mmap, 578 558 .open = generic_file_open, 579 - .splice_read = generic_file_splice_read, 559 + .splice_read = orangefs_file_splice_read, 580 560 .splice_write = iter_file_splice_write, 581 561 .flush = orangefs_flush, 582 562 .release = orangefs_file_release,