diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-11-02 16:45:28 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:31 -0400 |
commit | a023127a28d4b8d651d3ccb41dd7da2ba534390a (patch) | |
tree | 31cabcaef54a2527eeb269b77af36855860df9f0 /fs/bcachefs/fs-io.c | |
parent | 54847d253ab3a4980ed8322a618a9521a2d6cd45 (diff) | |
download | lwn-a023127a28d4b8d651d3ccb41dd7da2ba534390a.tar.gz lwn-a023127a28d4b8d651d3ccb41dd7da2ba534390a.zip |
bcachefs: Eliminate function calls in DIO fastpaths
We can assume that usually buffered and O_DIRECT IO won't be mixed, and
the calls to flush the page cache won't be needed.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/fs-io.c')
-rw-r--r-- | fs/bcachefs/fs-io.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index 185a37a6705e..a1767ee85591 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -77,7 +77,7 @@ struct dio_read { }; /* pagecache_block must be held */ -static int write_invalidate_inode_pages_range(struct address_space *mapping, +static noinline int write_invalidate_inode_pages_range(struct address_space *mapping, loff_t start, loff_t end) { int ret; @@ -1693,11 +1693,13 @@ ssize_t bch2_read_iter(struct kiocb *iocb, struct iov_iter *iter) if (iocb->ki_flags & IOCB_DIRECT) { struct blk_plug plug; - ret = filemap_write_and_wait_range(mapping, - iocb->ki_pos, - iocb->ki_pos + count - 1); - if (ret < 0) - return ret; + if (unlikely(mapping->nrpages)) { + ret = filemap_write_and_wait_range(mapping, + iocb->ki_pos, + iocb->ki_pos + count - 1); + if (ret < 0) + return ret; + } file_accessed(file); @@ -1961,11 +1963,13 @@ ssize_t bch2_direct_write(struct kiocb *req, struct iov_iter *iter) dio->op.opts.data_replicas)) goto err_put_bio; - ret = write_invalidate_inode_pages_range(mapping, - req->ki_pos, - req->ki_pos + iter->count - 1); - if (unlikely(ret)) - goto err_put_bio; + if (unlikely(mapping->nrpages)) { + ret = write_invalidate_inode_pages_range(mapping, + req->ki_pos, + req->ki_pos + iter->count - 1); + if (unlikely(ret)) + goto err_put_bio; + } ret = bch2_dio_write_loop(dio); err: |