From patchwork Wed Feb 22 17:07:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 13149355 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4B598C636D6 for ; Wed, 22 Feb 2023 17:07:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232552AbjBVRHJ (ORCPT ); Wed, 22 Feb 2023 12:07:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52816 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232339AbjBVRHI (ORCPT ); Wed, 22 Feb 2023 12:07:08 -0500 Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1C23E3B0EE for ; Wed, 22 Feb 2023 09:07:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=kLRngY/vG6sxCRAjnJGUJGRdWEW5XoOIjThP7k7n/ng=; b=j5x5dkCrBFyT4cNlfKf90YgWZQ k2UfWaQDGNUE6UOKr8FXLl1Izw2I/m5Lv/uuZ57QarCm7/SDpH6t8dZke8Q8BMYIz/L/WxxR3zXQ5 rVy3LHHpLhWuH2SOfuXUZgdJV2xkAkOyUwnMcD3PORoR226Nln4Vn8ciNcL3iN6IbbUFRW2dnelI/ Z4A86z9PNHjtaxh3NivTdys5VFk2hLUJBtAwKIwVWzOoNRoa0lMRsUugTRH7UogHGBP0CZC2CPqYd GamZiADp3etzapZ73BMbR9OL9iN47vLvaX/Ap2rt7FKJADCdCD2PdPO4oRbsKR+pkTHWCKn6PWnzF 7RjhSUuw==; Received: from [4.28.11.157] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1pUsa8-00D9OO-87; Wed, 22 Feb 2023 17:07:04 +0000 From: Christoph Hellwig To: Chris Mason , Josef Bacik , David Sterba Cc: linux-btrfs@vger.kernel.org, Anand Jain , Johannes Thumshirn Subject: [PATCH 1/2] btrfs: remove search_file_offset_in_bio Date: Wed, 22 Feb 2023 09:07:01 -0800 Message-Id: <20230222170702.713521-2-hch@lst.de> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230222170702.713521-1-hch@lst.de> References: <20230222170702.713521-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org There is no need to search for a file offset in a bio, it is now always provided in bbio->file_offset. Just use that with the offset into the bio. Signed-off-by: Christoph Hellwig Reviewed-by: Anand Jain Reviewed-by: Johannes Thumshirn --- fs/btrfs/file-item.c | 52 +++----------------------------------------- 1 file changed, 3 insertions(+), 49 deletions(-) diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index fff09e5635e5f2..9df9b91dbc6463 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -335,48 +335,6 @@ static int search_csum_tree(struct btrfs_fs_info *fs_info, return ret; } -/* - * Locate the file_offset of @cur_disk_bytenr of a @bio. - * - * Bio of btrfs represents read range of - * [bi_sector << 9, bi_sector << 9 + bi_size). - * Knowing this, we can iterate through each bvec to locate the page belong to - * @cur_disk_bytenr and get the file offset. - * - * @inode is used to determine if the bvec page really belongs to @inode. - * - * Return false if we can't find the file offset - * Return true if we find the file offset and restore it to @file_offset_ret - */ -static int search_file_offset_in_bio(struct bio *bio, struct inode *inode, - u64 disk_bytenr, u64 *file_offset_ret) -{ - struct bvec_iter iter; - struct bio_vec bvec; - u64 cur = bio->bi_iter.bi_sector << SECTOR_SHIFT; - bool ret = false; - - bio_for_each_segment(bvec, bio, iter) { - struct page *page = bvec.bv_page; - - if (cur > disk_bytenr) - break; - if (cur + bvec.bv_len <= disk_bytenr) { - cur += bvec.bv_len; - continue; - } - ASSERT(in_range(disk_bytenr, cur, bvec.bv_len)); - if (page->mapping && page->mapping->host && - page->mapping->host == inode) { - ret = true; - *file_offset_ret = page_offset(page) + bvec.bv_offset + - disk_bytenr - cur; - break; - } - } - return ret; -} - /* * Lookup the checksum for the read bio in csum tree. * @@ -386,7 +344,6 @@ blk_status_t btrfs_lookup_bio_sums(struct btrfs_bio *bbio) { struct btrfs_inode *inode = bbio->inode; struct btrfs_fs_info *fs_info = inode->root->fs_info; - struct extent_io_tree *io_tree = &inode->io_tree; struct bio *bio = &bbio->bio; struct btrfs_path *path; const u32 sectorsize = fs_info->sectorsize; @@ -493,13 +450,10 @@ blk_status_t btrfs_lookup_bio_sums(struct btrfs_bio *bbio) if (inode->root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID) { - u64 file_offset; + u64 file_offset = bbio->file_offset + + cur_disk_bytenr - orig_disk_bytenr; - if (search_file_offset_in_bio(bio, - &inode->vfs_inode, - cur_disk_bytenr, - &file_offset)) - set_extent_bits(io_tree, file_offset, + set_extent_bits(&inode->io_tree, file_offset, file_offset + sectorsize - 1, EXTENT_NODATASUM); } else { From patchwork Wed Feb 22 17:07:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christoph Hellwig X-Patchwork-Id: 13149356 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1FF48C64EC7 for ; Wed, 22 Feb 2023 17:07:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232556AbjBVRHJ (ORCPT ); Wed, 22 Feb 2023 12:07:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52828 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232541AbjBVRHI (ORCPT ); Wed, 22 Feb 2023 12:07:08 -0500 Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 981573CE27 for ; Wed, 22 Feb 2023 09:07:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description; bh=HYCETIibdzdHjfePTfY/9l6TwWa3Izre6TlifKGHQPE=; b=tvS1rGJp68Q/7tRI9wQED6p3Bm K4pHoufPIgyuTG8TYWqvOz6uizLgIVGtDI/G4sykqHvj421BFDa58hyJvHnDvadF/tn1v58Xn4qQo 8lc/FahBqaRN6zm88zsFhn2FzMn1x9bx8A/X4UWi5CxvFVX3+uNHYkCS0Xf/q0qQD3cesDYqE8ha/ b2oS77nkcjRNVpJMZPQTRxl+MQGTPHa0RXJ4GzMuLa7m+DFFCPHZfPowgzhDSKhD4aeLAnPxUdoDn 5W/+TapkJuAUNCilNPkwlLQLvDhbZAwrUglSriOpZdbMrtDlqfea8ArcaCQDkQfcvn0q5dDgrYLw0 HGm2pgxg==; Received: from [4.28.11.157] (helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1pUsa8-00D9Ou-Si; Wed, 22 Feb 2023 17:07:05 +0000 From: Christoph Hellwig To: Chris Mason , Josef Bacik , David Sterba Cc: linux-btrfs@vger.kernel.org Subject: [PATCH 2/2] btrfs: cleanup btrfs_lookup_bio_sums Date: Wed, 22 Feb 2023 09:07:02 -0800 Message-Id: <20230222170702.713521-3-hch@lst.de> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230222170702.713521-1-hch@lst.de> References: <20230222170702.713521-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org Introduce a bio_offset variable for the current offset into the bio instead of recalculating it over and over. Remove the now only used once search_len and sector_offset variables, and reduce the scope for count and cur_disk_bytenr. Signed-off-by: Christoph Hellwig Reviewed-by: Johannes Thumshirn --- fs/btrfs/file-item.c | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index 9df9b91dbc6463..3e0995ce7a2c83 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c @@ -350,10 +350,9 @@ blk_status_t btrfs_lookup_bio_sums(struct btrfs_bio *bbio) const u32 csum_size = fs_info->csum_size; u32 orig_len = bio->bi_iter.bi_size; u64 orig_disk_bytenr = bio->bi_iter.bi_sector << SECTOR_SHIFT; - u64 cur_disk_bytenr; const unsigned int nblocks = orig_len >> fs_info->sectorsize_bits; - int count = 0; blk_status_t ret = BLK_STS_OK; + u32 bio_offset = 0; if ((inode->flags & BTRFS_INODE_NODATASUM) || test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state)) @@ -404,28 +403,14 @@ blk_status_t btrfs_lookup_bio_sums(struct btrfs_bio *bbio) path->skip_locking = 1; } - for (cur_disk_bytenr = orig_disk_bytenr; - cur_disk_bytenr < orig_disk_bytenr + orig_len; - cur_disk_bytenr += (count * sectorsize)) { - u64 search_len = orig_disk_bytenr + orig_len - cur_disk_bytenr; - unsigned int sector_offset; - u8 *csum_dst; - - /* - * Although both cur_disk_bytenr and orig_disk_bytenr is u64, - * we're calculating the offset to the bio start. - * - * Bio size is limited to UINT_MAX, thus unsigned int is large - * enough to contain the raw result, not to mention the right - * shifted result. - */ - ASSERT(cur_disk_bytenr - orig_disk_bytenr < UINT_MAX); - sector_offset = (cur_disk_bytenr - orig_disk_bytenr) >> - fs_info->sectorsize_bits; - csum_dst = bbio->csum + sector_offset * csum_size; + while (bio_offset < orig_len) { + u64 cur_disk_bytenr = orig_disk_bytenr + bio_offset; + u8 *csum_dst = bbio->csum + + (bio_offset >> fs_info->sectorsize_bits) * csum_size; + int count; count = search_csum_tree(fs_info, path, cur_disk_bytenr, - search_len, csum_dst); + orig_len - bio_offset, csum_dst); if (count < 0) { ret = errno_to_blk_status(count); if (bbio->csum != bbio->csum_inline) @@ -451,7 +436,7 @@ blk_status_t btrfs_lookup_bio_sums(struct btrfs_bio *bbio) if (inode->root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID) { u64 file_offset = bbio->file_offset + - cur_disk_bytenr - orig_disk_bytenr; + bio_offset; set_extent_bits(&inode->io_tree, file_offset, file_offset + sectorsize - 1, @@ -462,6 +447,7 @@ blk_status_t btrfs_lookup_bio_sums(struct btrfs_bio *bbio) cur_disk_bytenr, cur_disk_bytenr + sectorsize); } } + bio_offset += count * sectorsize; } btrfs_free_path(path);