From: "Matthew Wilcox (Oracle)" <willy@infradead.org> To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>, ericvh@gmail.com, lucho@ionkov.net, viro@zeniv.linux.org.uk, jlayton@kernel.org, idryomov@gmail.com, mark@fasheh.com, jlbec@evilplan.org, joseph.qi@linux.alibaba.com, v9fs-developer@lists.sourceforge.net, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, ocfs2-devel@oss.oracle.com, linux-btrfs@vger.kernel.org, clm@fb.com, josef@toxicpanda.com, dsterba@suse.com, stable@vger.kernel.org Subject: [PATCH 7/7] btrfs: Promote to unsigned long long before multiplying Date: Sun, 4 Oct 2020 19:04:28 +0100 [thread overview] Message-ID: <20201004180428.14494-8-willy@infradead.org> (raw) In-Reply-To: <20201004180428.14494-1-willy@infradead.org> On 32-bit systems, these shifts will overflow for files larger than 4GB. Add helper functions to avoid this problem coming back. Cc: stable@vger.kernel.org Fixes: 73ff61dbe5ed ("Btrfs: fix device replace of a missing RAID 5/6 device") Fixes: be50a8ddaae1 ("Btrfs: Simplify scrub_setup_recheck_block()'s argument") Fixes: ff023aac3119 ("Btrfs: add code to scrub to copy read data to another disk") Fixes: b5d67f64f9bc ("Btrfs: change scrub to support big blocks") Fixes: a2de733c78fa ("btrfs: scrub") Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- fs/btrfs/scrub.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 354ab9985a34..ccbaf9c6e87a 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1262,12 +1262,17 @@ static inline void scrub_stripe_index_and_offset(u64 logical, u64 map_type, } } +static u64 sblock_length(struct scrub_block *sblock) +{ + return (u64)sblock->page_count * PAGE_SIZE; +} + static int scrub_setup_recheck_block(struct scrub_block *original_sblock, struct scrub_block *sblocks_for_recheck) { struct scrub_ctx *sctx = original_sblock->sctx; struct btrfs_fs_info *fs_info = sctx->fs_info; - u64 length = original_sblock->page_count * PAGE_SIZE; + u64 length = sblock_length(original_sblock); u64 logical = original_sblock->pagev[0]->logical; u64 generation = original_sblock->pagev[0]->generation; u64 flags = original_sblock->pagev[0]->flags; @@ -1610,6 +1615,11 @@ static void scrub_write_block_to_dev_replace(struct scrub_block *sblock) } } +static u64 sbio_length(struct scrub_bio *sbio) +{ + return (u64)sbio->page_count * PAGE_SIZE; +} + static int scrub_write_page_to_dev_replace(struct scrub_block *sblock, int page_num) { @@ -1659,10 +1669,9 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx, bio->bi_iter.bi_sector = sbio->physical >> 9; bio->bi_opf = REQ_OP_WRITE; sbio->status = 0; - } else if (sbio->physical + sbio->page_count * PAGE_SIZE != + } else if (sbio->physical + sbio_length(sbio) != spage->physical_for_dev_replace || - sbio->logical + sbio->page_count * PAGE_SIZE != - spage->logical) { + sbio->logical + sbio_length(sbio) != spage->logical) { scrub_wr_submit(sctx); goto again; } @@ -2005,10 +2014,8 @@ static int scrub_add_page_to_rd_bio(struct scrub_ctx *sctx, bio->bi_iter.bi_sector = sbio->physical >> 9; bio->bi_opf = REQ_OP_READ; sbio->status = 0; - } else if (sbio->physical + sbio->page_count * PAGE_SIZE != - spage->physical || - sbio->logical + sbio->page_count * PAGE_SIZE != - spage->logical || + } else if (sbio->physical + sbio_length(sbio) != spage->physical || + sbio->logical + sbio_length(sbio) != spage->logical || sbio->dev != spage->dev) { scrub_submit(sctx); goto again; @@ -2094,7 +2101,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) { struct scrub_ctx *sctx = sblock->sctx; struct btrfs_fs_info *fs_info = sctx->fs_info; - u64 length = sblock->page_count * PAGE_SIZE; + u64 length = sblock_length(sblock); u64 logical = sblock->pagev[0]->logical; struct btrfs_bio *bbio = NULL; struct bio *bio; -- 2.28.0
WARNING: multiple messages have this Message-ID (diff)
From: Matthew Wilcox (Oracle) <willy@infradead.org> To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>, ericvh@gmail.com, lucho@ionkov.net, viro@zeniv.linux.org.uk, jlayton@kernel.org, idryomov@gmail.com, mark@fasheh.com, jlbec@evilplan.org, joseph.qi@linux.alibaba.com, v9fs-developer@lists.sourceforge.net, linux-kernel@vger.kernel.org, ceph-devel@vger.kernel.org, ocfs2-devel@oss.oracle.com, linux-btrfs@vger.kernel.org, clm@fb.com, josef@toxicpanda.com, dsterba@suse.com, stable@vger.kernel.org Subject: [Ocfs2-devel] [PATCH 7/7] btrfs: Promote to unsigned long long before multiplying Date: Sun, 4 Oct 2020 19:04:28 +0100 [thread overview] Message-ID: <20201004180428.14494-8-willy@infradead.org> (raw) In-Reply-To: <20201004180428.14494-1-willy@infradead.org> On 32-bit systems, these shifts will overflow for files larger than 4GB. Add helper functions to avoid this problem coming back. Cc: stable at vger.kernel.org Fixes: 73ff61dbe5ed ("Btrfs: fix device replace of a missing RAID 5/6 device") Fixes: be50a8ddaae1 ("Btrfs: Simplify scrub_setup_recheck_block()'s argument") Fixes: ff023aac3119 ("Btrfs: add code to scrub to copy read data to another disk") Fixes: b5d67f64f9bc ("Btrfs: change scrub to support big blocks") Fixes: a2de733c78fa ("btrfs: scrub") Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- fs/btrfs/scrub.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index 354ab9985a34..ccbaf9c6e87a 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -1262,12 +1262,17 @@ static inline void scrub_stripe_index_and_offset(u64 logical, u64 map_type, } } +static u64 sblock_length(struct scrub_block *sblock) +{ + return (u64)sblock->page_count * PAGE_SIZE; +} + static int scrub_setup_recheck_block(struct scrub_block *original_sblock, struct scrub_block *sblocks_for_recheck) { struct scrub_ctx *sctx = original_sblock->sctx; struct btrfs_fs_info *fs_info = sctx->fs_info; - u64 length = original_sblock->page_count * PAGE_SIZE; + u64 length = sblock_length(original_sblock); u64 logical = original_sblock->pagev[0]->logical; u64 generation = original_sblock->pagev[0]->generation; u64 flags = original_sblock->pagev[0]->flags; @@ -1610,6 +1615,11 @@ static void scrub_write_block_to_dev_replace(struct scrub_block *sblock) } } +static u64 sbio_length(struct scrub_bio *sbio) +{ + return (u64)sbio->page_count * PAGE_SIZE; +} + static int scrub_write_page_to_dev_replace(struct scrub_block *sblock, int page_num) { @@ -1659,10 +1669,9 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx, bio->bi_iter.bi_sector = sbio->physical >> 9; bio->bi_opf = REQ_OP_WRITE; sbio->status = 0; - } else if (sbio->physical + sbio->page_count * PAGE_SIZE != + } else if (sbio->physical + sbio_length(sbio) != spage->physical_for_dev_replace || - sbio->logical + sbio->page_count * PAGE_SIZE != - spage->logical) { + sbio->logical + sbio_length(sbio) != spage->logical) { scrub_wr_submit(sctx); goto again; } @@ -2005,10 +2014,8 @@ static int scrub_add_page_to_rd_bio(struct scrub_ctx *sctx, bio->bi_iter.bi_sector = sbio->physical >> 9; bio->bi_opf = REQ_OP_READ; sbio->status = 0; - } else if (sbio->physical + sbio->page_count * PAGE_SIZE != - spage->physical || - sbio->logical + sbio->page_count * PAGE_SIZE != - spage->logical || + } else if (sbio->physical + sbio_length(sbio) != spage->physical || + sbio->logical + sbio_length(sbio) != spage->logical || sbio->dev != spage->dev) { scrub_submit(sctx); goto again; @@ -2094,7 +2101,7 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) { struct scrub_ctx *sctx = sblock->sctx; struct btrfs_fs_info *fs_info = sctx->fs_info; - u64 length = sblock->page_count * PAGE_SIZE; + u64 length = sblock_length(sblock); u64 logical = sblock->pagev[0]->logical; struct btrfs_bio *bbio = NULL; struct bio *bio; -- 2.28.0
next prev parent reply other threads:[~2020-10-04 18:05 UTC|newest] Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-10-04 18:04 [PATCH 0/7] Fix a pile of 4GB file problems on 32-bit Matthew Wilcox (Oracle) 2020-10-04 18:04 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-04 18:04 ` [PATCH 1/7] 9P: Cast to loff_t before multiplying Matthew Wilcox (Oracle) 2020-10-04 18:04 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-07 5:48 ` Christoph Hellwig 2020-10-07 5:48 ` [Ocfs2-devel] " Christoph Hellwig 2020-10-07 18:47 ` Matthew Wilcox 2020-10-07 18:47 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-26 17:14 ` Dominique Martinet 2020-10-26 17:14 ` [Ocfs2-devel] " Dominique Martinet 2020-10-04 18:04 ` [PATCH 2/7] buffer: Promote to unsigned long long before shifting Matthew Wilcox (Oracle) 2020-10-04 18:04 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-04 18:04 ` [PATCH 3/7] ceph: " Matthew Wilcox (Oracle) 2020-10-04 18:04 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-06 11:29 ` Jeff Layton 2020-10-06 11:29 ` [Ocfs2-devel] " Jeff Layton 2020-10-06 17:20 ` Jeff Layton 2020-10-06 17:20 ` [Ocfs2-devel] " Jeff Layton 2020-10-04 18:04 ` [PATCH 4/7] ocfs2: " Matthew Wilcox (Oracle) 2020-10-04 18:04 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-04 18:04 ` [PATCH 5/7] btrfs: " Matthew Wilcox (Oracle) 2020-10-04 18:04 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-09 14:18 ` Josef Bacik 2020-10-09 14:18 ` [Ocfs2-devel] " Josef Bacik 2020-10-26 17:02 ` David Sterba 2020-10-26 17:02 ` [Ocfs2-devel] " David Sterba 2020-10-04 18:04 ` [PATCH 6/7] " Matthew Wilcox (Oracle) 2020-10-04 18:04 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-09 14:18 ` Josef Bacik 2020-10-09 14:18 ` [Ocfs2-devel] " Josef Bacik 2020-10-26 16:35 ` David Sterba 2020-10-26 16:35 ` [Ocfs2-devel] " David Sterba 2020-10-26 16:44 ` Matthew Wilcox 2020-10-26 16:44 ` [Ocfs2-devel] " Matthew Wilcox 2020-10-26 17:03 ` David Sterba 2020-10-26 17:03 ` [Ocfs2-devel] " David Sterba 2020-10-04 18:04 ` Matthew Wilcox (Oracle) [this message] 2020-10-04 18:04 ` [Ocfs2-devel] [PATCH 7/7] btrfs: Promote to unsigned long long before multiplying Matthew Wilcox 2020-10-26 16:21 ` David Sterba 2020-10-26 16:21 ` [Ocfs2-devel] " David Sterba
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=20201004180428.14494-8-willy@infradead.org \ --to=willy@infradead.org \ --cc=ceph-devel@vger.kernel.org \ --cc=clm@fb.com \ --cc=dsterba@suse.com \ --cc=ericvh@gmail.com \ --cc=idryomov@gmail.com \ --cc=jlayton@kernel.org \ --cc=jlbec@evilplan.org \ --cc=josef@toxicpanda.com \ --cc=joseph.qi@linux.alibaba.com \ --cc=linux-btrfs@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=lucho@ionkov.net \ --cc=mark@fasheh.com \ --cc=ocfs2-devel@oss.oracle.com \ --cc=stable@vger.kernel.org \ --cc=v9fs-developer@lists.sourceforge.net \ --cc=viro@zeniv.linux.org.uk \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.