From: Omar Sandoval <osandov@osandov.com>
To: linux-btrfs@vger.kernel.org
Cc: kernel-team@fb.com, Christoph Hellwig <hch@lst.de>
Subject: [PATCH 11/15] btrfs: put direct I/O checksums in btrfs_dio_private instead of bio
Date: Mon, 9 Mar 2020 14:32:37 -0700 [thread overview]
Message-ID: <95b275ed47f1e4bdaba53040fe6de9eefdf3a5fd.1583789410.git.osandov@fb.com> (raw)
In-Reply-To: <cover.1583789410.git.osandov@fb.com>
From: Omar Sandoval <osandov@fb.com>
The next commit will get rid of btrfs_dio_private->orig_bio. The only
thing we really need it for is containing all of the checksums, but we
can easily put those in btrfs_dio_private and get rid of the awkward
logic that looks up the checksums for orig_bio when the first split bio
is submitted. (Interestingly, btrfs_dio_private did contain the
checksums before commit 23ea8e5a0767 ("Btrfs: load checksum data once
when submitting a direct read io"), but it didn't look them up up
front.)
Signed-off-by: Omar Sandoval <osandov@fb.com>
---
fs/btrfs/inode.c | 79 ++++++++++++++++++++++++------------------------
1 file changed, 39 insertions(+), 40 deletions(-)
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index a7fb0ba8cde4..4a2e44f3e66e 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -84,6 +84,9 @@ struct btrfs_dio_private {
*/
blk_status_t (*subio_endio)(struct inode *, struct btrfs_io_bio *,
blk_status_t);
+
+ /* Checksums. */
+ u8 sums[];
};
struct btrfs_dio_data {
@@ -7753,7 +7756,6 @@ static void btrfs_endio_direct_read(struct bio *bio)
dio_bio->bi_status = err;
dio_end_io(dio_bio);
- btrfs_io_bio_free_csum(io_bio);
bio_put(bio);
}
@@ -7865,39 +7867,6 @@ static void btrfs_end_dio_bio(struct bio *bio)
bio_put(bio);
}
-static inline blk_status_t btrfs_lookup_and_bind_dio_csum(struct inode *inode,
- struct btrfs_dio_private *dip,
- struct bio *bio,
- u64 file_offset)
-{
- struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
- struct btrfs_io_bio *orig_io_bio = btrfs_io_bio(dip->orig_bio);
- u16 csum_size;
- blk_status_t ret;
-
- /*
- * We load all the csum data we need when we submit
- * the first bio to reduce the csum tree search and
- * contention.
- */
- if (dip->logical_offset == file_offset) {
- ret = btrfs_lookup_bio_sums(inode, dip->orig_bio, file_offset,
- NULL);
- if (ret)
- return ret;
- }
-
- if (bio == dip->orig_bio)
- return 0;
-
- file_offset -= dip->logical_offset;
- file_offset >>= inode->i_sb->s_blocksize_bits;
- csum_size = btrfs_super_csum_size(btrfs_sb(inode->i_sb)->super_copy);
- io_bio->csum = orig_io_bio->csum + csum_size * file_offset;
-
- return 0;
-}
-
static inline blk_status_t btrfs_submit_dio_bio(struct bio *bio,
struct inode *inode, u64 file_offset, int async_submit)
{
@@ -7933,10 +7902,12 @@ static inline blk_status_t btrfs_submit_dio_bio(struct bio *bio,
if (ret)
goto err;
} else {
- ret = btrfs_lookup_and_bind_dio_csum(inode, dip, bio,
- file_offset);
- if (ret)
- goto err;
+ u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
+ size_t csum_offset;
+
+ csum_offset = ((file_offset - dip->logical_offset) >>
+ inode->i_sb->s_blocksize_bits) * csum_size;
+ btrfs_io_bio(bio)->csum = dip->sums + csum_offset;
}
map:
ret = btrfs_map_bio(fs_info, bio, 0);
@@ -8047,13 +8018,25 @@ static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode,
loff_t file_offset)
{
struct btrfs_dio_private *dip = NULL;
+ size_t dip_size;
struct bio *bio = NULL;
struct btrfs_io_bio *io_bio;
bool write = (bio_op(dio_bio) == REQ_OP_WRITE);
+ const bool csum = !(BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM);
bio = btrfs_bio_clone(dio_bio);
- dip = kzalloc(sizeof(*dip), GFP_NOFS);
+ dip_size = sizeof(*dip);
+ if (!write && csum) {
+ struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
+ u16 csum_size = btrfs_super_csum_size(fs_info->super_copy);
+ size_t nblocks = (dio_bio->bi_iter.bi_size >>
+ inode->i_sb->s_blocksize_bits);
+
+ dip_size += csum_size * nblocks;
+ }
+
+ dip = kzalloc(dip_size, GFP_NOFS);
if (!dip) {
if (!write) {
unlock_extent(&BTRFS_I(inode)->io_tree, file_offset,
@@ -8093,11 +8076,27 @@ static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode,
dip->bytes;
dio_data->unsubmitted_oe_range_start =
dio_data->unsubmitted_oe_range_end;
-
bio->bi_end_io = btrfs_endio_direct_write;
} else {
bio->bi_end_io = btrfs_endio_direct_read;
dip->subio_endio = btrfs_subio_endio_read;
+
+ if (csum) {
+ blk_status_t status;
+
+ /*
+ * Load the csums up front to reduce csum tree searches
+ * and contention when submitting bios.
+ */
+ status = btrfs_lookup_bio_sums(inode, dio_bio,
+ file_offset, dip->sums);
+ if (status != BLK_STS_OK) {
+ dip->errors = 1;
+ if (refcount_dec_and_test(&dip->refs))
+ bio_io_error(dip->orig_bio);
+ return;
+ }
+ }
}
btrfs_submit_direct_hook(dip);
--
2.25.1
next prev parent reply other threads:[~2020-03-09 21:33 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-09 21:32 [PATCH 00/15] btrfs: read repair/direct I/O improvements Omar Sandoval
2020-03-09 21:32 ` [PATCH 01/15] btrfs: fix error handling when submitting direct I/O bio Omar Sandoval
2020-03-11 17:54 ` Josef Bacik
2020-03-17 13:46 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 02/15] btrfs: fix double __endio_write_update_ordered in direct I/O Omar Sandoval
2020-03-10 16:30 ` Christoph Hellwig
2020-03-11 9:03 ` Omar Sandoval
2020-03-17 14:04 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 03/15] btrfs: look at full bi_io_vec for repair decision Omar Sandoval
2020-03-10 16:33 ` Christoph Hellwig
2020-03-11 9:07 ` Omar Sandoval
2020-03-16 10:48 ` Christoph Hellwig
2020-03-17 14:38 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 04/15] btrfs: don't do repair validation for checksum errors Omar Sandoval
2020-03-11 17:55 ` Josef Bacik
2020-03-09 21:32 ` [PATCH 05/15] btrfs: clarify btrfs_lookup_bio_sums documentation Omar Sandoval
2020-03-11 17:56 ` Josef Bacik
2020-03-11 18:23 ` Omar Sandoval
2020-03-11 18:34 ` Josef Bacik
2020-03-17 14:38 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 06/15] btrfs: rename __readpage_endio_check to check_data_csum Omar Sandoval
2020-03-10 14:46 ` Johannes Thumshirn
2020-03-11 17:57 ` Josef Bacik
2020-03-17 14:39 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 07/15] btrfs: make btrfs_check_repairable() static Omar Sandoval
2020-03-10 14:53 ` Johannes Thumshirn
2020-03-11 17:58 ` Josef Bacik
2020-03-17 14:52 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 08/15] btrfs: move btrfs_dio_private to inode.c Omar Sandoval
2020-03-10 14:56 ` Johannes Thumshirn
2020-03-11 8:48 ` Omar Sandoval
2020-03-17 14:53 ` Nikolay Borisov
2020-03-19 16:16 ` David Sterba
2020-03-09 21:32 ` [PATCH 09/15] btrfs: kill btrfs_dio_private->private Omar Sandoval
2020-03-11 17:59 ` Josef Bacik
2020-03-17 14:54 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 10/15] btrfs: convert btrfs_dio_private->pending_bios to refcount_t Omar Sandoval
2020-03-11 18:00 ` Josef Bacik
2020-03-17 15:10 ` Nikolay Borisov
2020-03-09 21:32 ` Omar Sandoval [this message]
2020-03-11 18:04 ` [PATCH 11/15] btrfs: put direct I/O checksums in btrfs_dio_private instead of bio Josef Bacik
2020-03-17 16:37 ` Nikolay Borisov
2020-04-03 16:18 ` David Sterba
2020-03-09 21:32 ` [PATCH 12/15] btrfs: get rid of one layer of bios in direct I/O Omar Sandoval
2020-03-10 16:38 ` Christoph Hellwig
2020-03-11 9:19 ` Omar Sandoval
2020-03-16 10:49 ` Christoph Hellwig
2020-03-11 18:07 ` Josef Bacik
2020-03-17 16:48 ` Nikolay Borisov
2020-03-09 21:32 ` [PATCH 13/15] btrfs: simplify direct I/O read repair Omar Sandoval
2020-03-11 18:16 ` Josef Bacik
2020-04-03 16:40 ` David Sterba
2020-04-03 18:05 ` Omar Sandoval
2020-04-16 10:08 ` David Sterba
2020-03-09 21:32 ` [PATCH 14/15] btrfs: get rid of endio_repair_workers Omar Sandoval
2020-03-11 18:16 ` Josef Bacik
2020-03-09 21:32 ` [PATCH 15/15] btrfs: unify buffered and direct I/O read repair Omar Sandoval
2020-03-11 18:19 ` Josef Bacik
2020-03-19 8:53 ` Nikolay Borisov
2020-03-19 9:03 ` Christoph Hellwig
2020-03-20 21:28 ` Omar Sandoval
2020-03-10 16:39 ` [PATCH 00/15] btrfs: read repair/direct I/O improvements Christoph Hellwig
2020-03-11 9:22 ` Omar Sandoval
2020-03-18 16:33 ` Goldwyn Rodrigues
2020-03-19 14:08 ` David Sterba
2020-03-18 22:07 ` David Sterba
2020-03-20 21:29 ` Omar Sandoval
2020-03-20 14:10 ` Christoph Hellwig
2020-03-20 14:11 ` Christoph Hellwig
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=95b275ed47f1e4bdaba53040fe6de9eefdf3a5fd.1583789410.git.osandov@fb.com \
--to=osandov@osandov.com \
--cc=hch@lst.de \
--cc=kernel-team@fb.com \
--cc=linux-btrfs@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).